Задать вопрос
Ответы пользователя по тегу Excel
  • Как объединить данные с 2-х колонок, разделенные символом '#'?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    1. Поскольку не известно, сколько строк в таблице, как вариант можно использовать именованные диапазоны, которые можно создать через комбинацию клавиш Ctrl+F3 (Имя Диапазон):
      • КОЛОН1 =ДВССЫЛ("$A$"&СТРОКА()&":$A$"&СТРОКА())
      • КОЛ1.СТР2 =НАЙТИ("#";КОЛОН1)+1
      • КОЛ1.СТР3 =НАЙТИ("#";КОЛОН1;КОЛ1.СТР2)+1
      • КОЛ1.СТР4 =НАЙТИ("#";КОЛОН1;КОЛ1.СТР3)+1
      • КОЛОН2 =ДВССЫЛ("$B$"&СТРОКА()&":$B$"&СТРОКА())
      • КОЛ2.СТР2 =НАЙТИ("#";КОЛОН2)+1
      • КОЛ2.СТР3 =НАЙТИ("#";КОЛОН2;КОЛ2.СТР2)+1
      • КОЛ2.СТР4 =НАЙТИ("#";КОЛОН2;КОЛ2.СТР3)+1

    2. Тогда формула для разделения подстрок: =СЦЕПИТЬ(ЛЕВСИМВ(КОЛОН1;НАЙТИ("#";КОЛОН1)-1);" - ";ЛЕВСИМВ(КОЛОН2;НАЙТИ("#";КОЛОН2)-1);СИМВОЛ(10);ПСТР(КОЛОН1;КОЛ1.СТР2;НАЙТИ("#";КОЛОН1;КОЛ1.СТР2)-КОЛ1.СТР2);" - ";ПСТР(КОЛОН2;КОЛ2.СТР2;НАЙТИ("#";КОЛОН2;КОЛ2.СТР2)-КОЛ2.СТР2);СИМВОЛ(10);ПСТР(КОЛОН1;КОЛ1.СТР3;НАЙТИ("#";КОЛОН1;КОЛ1.СТР3)-КОЛ1.СТР3);" - ";ПСТР(КОЛОН2;КОЛ2.СТР3;НАЙТИ("#";КОЛОН2;КОЛ2.СТР3)-КОЛ2.СТР3);СИМВОЛ(10);ПСТР(КОЛОН1;КОЛ1.СТР4;НАЙТИ("#";КОЛОН1;КОЛ1.СТР4)-КОЛ1.СТР4);" - ";ПСТР(КОЛОН2;КОЛ2.СТР4;НАЙТИ("#";КОЛОН2;КОЛ2.СТР4)-КОЛ2.СТР4);СИМВОЛ(10);ПРАВСИМВ(КОЛОН1;ДЛСТР(КОЛОН1)-НАЙТИ("#";КОЛОН1;КОЛ1.СТР4));" - ";ПРАВСИМВ(КОЛОН2;ДЛСТР(КОЛОН2)-НАЙТИ("#";КОЛОН2;КОЛ2.СТР4)))
    3. В формате ячеек необходимо установить свойство "переносить по словам"
    Ответ написан
    Комментировать
  • Написание макросов Excel, какой скилл нужен?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Как и в других высокоуровневых языках:
    1. Понимание основ программирования (переменные/операторы/логические операции/циклы)
    2. Понимание объектной структуры
    3. Понимание поставленной задачи

    Если есть время читайте книги "Книги, методички для изучения VBA с нуля?", если нет - ищите решение задачи в и-нете. Серьёзные задачи макрорекодор выполнять в принципе не может, - он не программист.
    Ответ написан
    Комментировать
  • Как объединить ячейки с одинаковыми значениями в Excel с помощью VBA?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Option Explicit
    Option Base 1
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Merge_by_Rows() ' Без форматирования границ
      Dim i As Integer, j As Integer, cnt As Integer
      Dim arr() As Variant, s As String
      
      With ActiveSheet.UsedRange ' Кол-во столбцов определяется по 1-й строке
        arr = Range(Cells(1, 1), Cells(.Rows.Count + 1, Range("A1").End(xlToRight).Column))
      End With
      
      cnt = 1: s = get_Row(arr, cnt)
      For i = LBound(arr, 1) + 1 To UBound(arr, 1)
        If get_Row(arr, i) <> s Then
          For j = LBound(arr, 2) To UBound(arr, 2)
            With ActiveSheet.Range(Cells(cnt, j), Cells(i - 1, j)).Offset(, UBound(arr, 2))
              .Merge
              .HorizontalAlignment = xlCenter
              .VerticalAlignment = xlCenter
              .Value = arr(cnt, j)
            End With
          Next j
          cnt = i: s = get_Row(arr, cnt)
        End If
      Next i
    End Sub
    
    Function get_Row(ByVal arr As Variant, ByVal num_Row As Integer) As String
      Dim j As Integer
      
      For j = LBound(arr, 2) To UBound(arr, 2)
        get_Row = WorksheetFunction.Trim(get_Row & " " & arr(num_Row, j))
      Next j
    End Function

    Процедуру выполнять на активном листе.
    Ответ написан
    Комментировать
  • Excel 2010 и 2013 по разному кодируют цвета? И вообще где почитать про различия для разных версий офиса?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Начну с того, что не удачно привязываться к цветам в 99% (по праздникам на сайте github блок contributions заливался жёлтым, в обычные дни - зелёным).
    Каждая версия программы Excel имеет свою объектную структуру, в которой могут быть как нововведения, так и изменения. Нововведения в предыдущих версиях вообще не будут работать, а изменения могут работать криво (т.к. объектная структура может измениться). Различия между Excel 2010 и 2013 на вскидку указать сложно, - разве что числовые значения цветов и сводные таблицы. Различий между Excel 2003 и 2007 гораздо больше: начиная от записи формул условного форматирования и заканчивая объектной моделью ribbon-меню. В процессе отладки при выявлении конкретной проблемы можно просто сделать вилку:
    Select Case Val(Application.Version)
      Case 12
        ' Excel 2007
      Case 14
        ' Excel 2010, VB 7.0
      Case 15
        ' Excel 2013
      Case 16
        ' Excel 2016, VB 7.1
      Case 17
        ' Excel 2019
      Case Else
        ' Прочие
    End Select

    Куда большая пропасть при обработке кода на x86 и x86_64. В вашем конкретном случае посоветую заменить числовые цвета на индексы палитры.
    Cells(row, column).Interior.ColorIndex ' принимает значения от 0 до 56
    Ответ написан
    2 комментария
  • Как решить проблемы с кодировкой в VBA при работе на win и на mac?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    1. Сохраните в винде в текстовый файл с кодировкой UTF, затем на маке откройте и замените код (вручную)
    2. Поищите программу win2mac, типа CVT32
    3. Или Какой выбрать редактор кода для Mac с поддержкой Win-1251?
    Ответ написан
    6 комментариев
  • Как перенести отдельные данные из одного листа Excel на другой?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Задача быстрее решается через фильтры. В версиях 2007 и выше по умолчанию копируются только видимые ячейки.
    Ответ написан
    2 комментария
  • Как корректно записать в MySQL из Excel русский и французский язык?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Я вообще не понял, при чём тут Microsoft Excel, PHP и Парсинг.
    1. Если файл CSV, сохраняй в Юникод и заливай в базу.
    2. Если файл XLS, устанавливай соединение с базой, открывай файл: читай и заливай.
    3. Средствами VBA (через Excel) можно подключить библиотеку для перевода текста в Юникод (в модуле пишем):
    Private Declare Function WideCharToMultiByte Lib "kernel32.dll" _
      (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr _
      As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, _
      ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, _
      ByVal lpUsedDefaultChar As Long) As Long
    
    Public Function ToUTF8(ByVal sText As String) As String
    Dim nRet As Long, strRet As String
      strRet = String(Len(sText) * 2, vbNullChar)
      nRet = WideCharToMultiByte(65001, &H0, StrPtr(sText), Len(sText), _
        StrPtr(strRet), Len(sText) * 2, 0&, 0&)
      ToUTF8 = Left(StrConv(strRet, vbUnicode), nRet)
    End Function
    
    Sub test() ' Пример работы с функцией '
      text = ToUTF8(textANSI)
    End Sub
    Ответ написан
  • Существует ли способ написать макрос для Excel, который будет следить за буфером обмена?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Макросы MS Office работают только в рамках приложения. В VBA есть функции по работе с буфером, но только основные. Описание с примерами:
    www.cyberforum.ru/vba/thread844325.html
    excelvba.ru/code/clipboard
    wordexpert.ru/page/principy-raboty-s-buferom-obmen...
    hiprog.com/index.php?id=350&option=com_content&tas...
    Если функционал вам не подходит, нужно искать другие способы решения задачи.
    Ответ написан
  • Как в Excel посчитать сумму столбца до определенного значения?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    1. В ячейку C1 пишем формулу =СУММ(B$1:B1)
    2. Растягиваем формулу по колонке (с пункта 3 по ссылке), или альтернативный способ:
      1. Выделяем ячейки с C1 по последнюю в столбце
      2. Для Excel 2010 - Во вкладке меню "Главная" в блоке "Редактирование" выбираем кнопку "Заполнить" из списка "вниз".
    Ответ написан
    1 комментарий
  • Как перейти на новую строку после заполнения предыдущей EXCEL VBA?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Во первых, чтобы не копировать иероглифы, нужно в окне с кодом переключиться на русский язык.
    Во вторых, в данном случае вместо Application лучше написать WorksheetFunction.
    В третьих, у вас в коде написано:
    ' НомерСтроки - Кол-во непустых ячеек в колонке "1" + 1, а не номер первой пустой строки

    Если в 1-й колонке таблицы есть хотя бы одна пустая строка, то намерения вставить новую запись в конец таблицы будут не выполнены. Поэтому замените на:
    ' НомерСтроки - Номер первой пустой строки на рабочем листе
    НомерСтроки = ActiveSheet.Cells.SpecialCells(xlLastCell).Row + 1


    UPD: Количество непустых ячеек (при их наличии) к колонке активной ячейки можно посчитать:
    КолНепустых = ActiveCell.SpecialCells(xlCellTypeLastCell).Row - _
      ActiveCell.EntireColumn.SpecialCells(xlCellTypeBlanks).Count
    Ответ написан
    Комментировать
  • Как обратиться к кастомному элементу на панели Excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Мне когда-то очень помог сайт: www.rondebruin.nl/win/s2/win003.htm, внизу этой страницы есть архив DropDown.zip с примерами создания списков.
    1. За формирование списка в файле Ron_DropDown.xlsm отвечает процедура DDListItem (все процедуры, связанные с Ribbon-меню, обязательно должны содержать параметр "control As IRibbonControl"; подсказки в своём проекте покажет RibbonXMLEditor).
    2. Элементы недостаточно задать параметрами, - их нужно нарисовать. Для обновления Ribbon-меню в файле Jim_DynDropDown.xlsm отвечает процедура RedoRib, которая содержит единственный метод "rib.Invalidate". Если возникнет ошибка (в процессе отладки) и объект примет значение "rib = Nothing", то лента станет недоступной.

    Для изучения примеров вам понадобится RibbonXMLEditor.

    0_1372fc_c4811587_XXXL
    На сайте: fluentui.blogspot.ru есть русскоязычная информация о Ribbon-меню.
    Ответ написан
    Комментировать
  • Как пронумировать ячейки по содержимому?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Чтобы найти подстроку в строке с помощью оператора Like (Примеры), необходимо подстроку выделить символом звёздочки "*" с обеих сторон. Нужно помнить, что регистр букв необходимо соблюдать.
    Рекомендую также в самом начале модуля вписать строку Option Explicit, что позволит избежать обращения к несуществующим переменным (все переменные должны быть объявлены через оператор Dim).
    Можете попробовать использовать регулярные выражения, как посоветовали ниже, но в данном контексте можно обойтись и без них.
    Проще всего использовать вариант #3 (который предложили ниже), но на слабом ПК будет тормозить.
    Ответ написан
    Комментировать
  • Excel VBA почему не выполняется поиск в объединенных ячейках?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Замените SearchOrder:=xlByColumns на SearchOrder:=xlByRows
    и удалите строки Cells.FindNext(After:=ActiveCell).Activate
    Ответ написан
  • Стоит ли серьезно изучать VBA?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    1) Да, особенно Excel. Думаю не стоит рассказывать о том, что Excel удобнее своих аналогов.
    2) Нет, вероятно это слухи. Можно даже сказать, что языки несовместимы.
    3) Нет. Для того чтобы работать во фрилансе, нужно уметь писать на тех языках, на которых предполагается выполнения задания. Как правило VBA там нет.

    В целом с помощью VBA можно решать другие задачи, например для AutoCAD. Можно подключать сторонние библиотеки и работать с их функциями. Да и в любой области, где производительность не играет особой роли, а важен результат. Неплохо его знать для того, чтобы придя за чужой компьютер, можно было не разворачивать среду программирования, а воспользоваться ей из установленного пакета MS Office (который есть на любом ПК под Windows).

    VBA можно понять самому (достаточно почитать справку в и-нете). Что мешает после VBA освоить другой инструмент (выучить ещё один язык)?

    Ах, да! Если действительно вас интересует перспективный язык - смотрите в сторону разработки мобильных приложений (каждая вторая компания их выпускает).
    Ответ написан
    Комментировать
  • Как использовать в vba функцию COUNTA?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Согласно линку...
    Ок, пишем. Получается
    MsgBox Application.WorksheetFunction.CountA("A1:F1")

    Вы передаёте функции значение A1:F1, а вам нужно передать диапазон ячеек Range("A1:F1"); также, как вы делали со строкой Rows(1).
    Ответ написан
    Комментировать
  • Как открыть Excel в разных окнах (параметры/ключи запуска Excel)?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    1. Многооконный режим Excel 2010
      • Первый способ проверен на XP (нужно вручную создать новый ярлык для Excel).
      • Второй способ: простая замена /dde /n на /n "%1" (ни на /e "%1") не работает; видимо ключ оставлен для обратной совместимости c DDE. "%1" - Полный путь к открываемому файлу.)
        Таким же образом можно попробовать отключить DDE-запросы в Excel
        Файл -> Параметры -> Дополнительно (вкладка) -> Общие (раздел)
        (√) Игнорировать DDE-запросы от других приложений
        В целом проблему не решает. Скорее всего не будет работать, например, если на ПК установлено несколько версий офисов.
      ЗЫ: Ключи для запуска Excel описаны здесь.
    2. Если у вас 1 монитор, то может подойти способ: Вид -> Окно (раздел) -> Рядом. Для управления окнами в том же разделе есть кнопки Упорядочить всё и Синхронная прокрутка.
    3. Советуют переходить на Excel 2013, где нет этой проблемы.
    4. Открывать файлы через командную строку или использовать для переключения книг CTRL+F6
    Ответ написан
    Комментировать
  • Как разделить .xlsx по строкам?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Если файл сохранён на диске, можно так:
    1. Открываете книгу с данными на нужном листе
    2. Заходите в VBA (Alt+F11)
    3. Выбираете в меню Insert -> Module
    4. Вставляете нижеприведённый код
    5. Нажимаете F5 (не сохраняете исходный файл)

    Option Explicit ' Обязательное объявление переменных
    Option Base 1 ' Нижняя граница массива (по умолчанию)
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Border_Limit()
      Dim Limit As Integer, Count As Integer, SaveDir As String, SetTitle As Boolean
      
      Count = 1: Limit = 1000 ' Счётчик файлов; Количество строк
      SetTitle = False ' Если есть заголовок, заменить False на True
      
      SaveDir = ThisWorkbook.Path ' Или вписать полный путь для сохранения "C:\"
      ' Предполагается, что в колонке A нет пустых ячеек
      While Not IsEmpty(Cells(IIf(SetTitle, 2, 1), 1))
        Rows("1:" & Limit).Copy
        Workbooks.Add xlWBATWorksheet ' Создать новую книгу: шаблон с 1 листом
        ActiveSheet.Paste: Cells(1, 1).Select
        ActiveWorkbook.SaveAs Filename:=SaveDir & "\Массив_" & Count & ".xlsx", _
          FileFormat:=xlOpenXMLWorkbook
        ActiveWindow.Close
        Rows(IIf(SetTitle, 2, 1) & ":" & Limit).Delete Shift:=xlUp
        Count = Count + 1
      Wend: MsgBox "Файл разбит на " & Count - 1 & " файл(ов). "
    End Sub

    Никакие C++ запускать не надо.

    Для пытливых умов: Отказ от Слияния в пользу шаблонов https://toster.ru/q/320942
    Ответ написан
    5 комментариев
  • Как писать формулы в Excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    S=a*b - площадь прямоугольника
    V=a*b*c - объем прямоугольного параллелепипеда
    Формулы в Excel начинаются со знака "=" (равно).
    Ответ написан
    1 комментарий