mail mail
Нужен макрос для Excel?
Сделайте заказ прямо сейчас!
Ищете готовое решение?
Выбирайте и покупайте!
У вас есть интернет-магазин?
Настроим парсер под любой сайт!
Статья является инструкцией по надстройке Parser

Действие парсера «Выполнить внешний макрос»

Среди действий, доступных при настройке парсера, присутствует действие «Выполнить внешний макрос».

Это позволяет расширить возможности парсера, — например, если требуется сложная обработка текстовых данных, или какая-то обработка таблицы (например, окраска ячеек)

Действие Параметр Значение
Запуск внешнего макроса Название MacroName
Параметр 1 test 1
Параметр 2 доп. параметр 2
Параметр 3  

 

Сам макрос (в данном примере — с названием MacroName, название макроса может быть любым) должен располагаться в стандартном модуле любой запущенной надстройки.

ВАЖНО: Если макрос находится не в надстройке, а в открытом файле Excel (куда подставляются данные),
в настройках действия поставьте восклицательный знак (!) перед именем макроса:
вместо MacroName получится !MacroName

Если макрос находится в ДРУГОМ запущенном файле Excel (например, в файле test.xlsm), формат параметра Имя макроса будет таким:  'test.xlsm'!MacroName

Внимание! Для корректного вызова макроса имя книги и листа не должно содержать кавычек и апострофов!

К написанию макроса (точнее, к его первой строке) предьявляются жесткие требования, — это должна быть функция, принимающая 3 параметра, и возвращающая текст (тип String):

Function MacroName(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String
    On Error Resume Next ' рекомендуемая строка, - чтобы ошибка вашего макроса не вызвала вылет парсера
    
    ' здесь код вашего макроса
    
End Function

 

Макрос (точнее, функция) принимает 3 параметра:

  •  txt$ - текущее значение (из предыдущего действия)

передаётся ПО ЗНАЧЕНИЮ (ByVal), — следовательно, если изменить значение переменной txt в коде макроса,
это не окажет никакого влияния на текущее значение в действиях

  • Destination - ссылка на строку или ячейку, в которую производится вывод

(если выполняются действия ДО начала вывода на лист, то Destination = Nothing)

  • args() - массив из 4 элементов: args(0), args(1), args(2), args(3)

в args(0) записывается СЛОВАРЬ со всеми текущими переменными
например, чтобы получить название парсера, пишем res$ = args(0).item("{ParserName}")
или если в действиях была сохранена переменная VarName, то res$ = args(0).item("%VarName%")
остальные 3 элемента: args(1), args(2), args(3) — доп.параметры из действия («Параметр 1, 2, 3»)


 

Функция может возвращать значение (текстовую строку).
Возвращённое значение используется в следующих действиях.

По-умолчанию результат функции равен пустой строке (в следующее по списку действие будет передано пустое значение).

Чтобы макрос не изменял текущее значение, добавьте в него строку кода

MacroName = txt ' возвращаем из функции исходное значение

Можно также заменить текущее значение, для этого используйте код

MacroName = "Новое значение, которое будет передано в следующее действие"


 

Можно задать переход на другое действие, или останов парсера, после выполнения макроса.

Для этого используется вызов макроса SetMacroReturnPoint из надстройки, с одинм числовым параметром

Если параметр —  положительное число (1 и выше) — будет выполнен безусловный переход на действие с этим индексом:

Application.Run "SetMacroReturnPoint", "4" ' принудительный переход на действие номер 4 (в текущем списке действий)

Если параметр — отрицательное число (-1, -2, -3, -9) — выполняется выход из набора действий или из парсера:

Application.Run "SetMacroReturnPoint", "-9" ' выход из парсера (полный останов всех действий)


 

Пример макроса:

Function MacroName1(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String
    On Error Resume Next
 
    If txt$ Like "*нет в наличии*" Then        ' проверяем текст из предыдущего действия на выполнение условия
        MacroName1 = "нет"        ' меняем текущее значение
        Destination.Interior.Color = vbRed        ' окрашиваем ячейку в красный цвет
        
    Else
        MacroName1 = "есть"        ' меняем текущее значение
        Destination.EntireRow.Range("b1:f1").Interior.Color = vbGreen   ' окрашиваем строку (столбцы b:f) в зеленый цвет
        
    End If
 
End Function

 

Еще пример (особого смысла не имеет - приведён для демонстрации возможностей взаимодействия макроса и парсера):

Function MacroName2(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String
    On Error Resume Next
 
    Var_1$ = args(1)        ' считываем 1-й параметр из настроек действия
    Var_2$ = args(2)        ' считываем 2-й параметр из настроек действия
    Category$ = args(0).Item("CategoryName")        ' берем значение переменной CategoryName из парсера

    column_1 = args(0).Item("{1}")        ' берем значение встроенной переменной {1} - значение из первого столбца
    column_2 = Destination.EntireRow.Cells(2)        ' берем значение из второго столбца текущей строки
    ' оба способа выше - обычно равнозначны, но работают только из действий по выводу в столбец (и общих действий для листа)

 
    If txt$ Like "*" & Var_1$ & "*" Then        ' проверяем текст из предыдущего действия на вхождение параметра 1
        Destination.EntireRow.Cells(3) = "ОК" ' заносим значение в третий столбец
        MacroName2 = txt$ ' возвращаем исходное значение
        Exit Function        ' обычное завершение функции. если ниже есть действия - они продолжат выполняться
    End If
 
    If Val(column_1) > Val(column_2) Then        ' сравниваем значения столбцов
        ' вывод информации в строку прогресс-бара
        Application.Run("RunningParser").PrInd1.Line3 = "Повторная попытка загрузки данных"
 
        MacroName2 = Category$ ' текущее значение для действий берем из переменной CategoryName из парсера
        
        ' принудительный переход к действию номер 4 в текущем списке действий
        Application.Run "SetMacroReturnPoint", 4
        Exit Function ' после выхода из фукции (и возврата к действиям), выполнится переход на действие номер 4
    End If
 
    If Not txt$ Like "*" & Category$ & "*" Then        ' проверяем текст из предыдущего действия на наличие категории
        Destination.EntireRow.Delete ' удаляем последнюю выведенную строку
        MsgBox "Ошибка в работе парсера", vbCritical ' вывод сообщения
        ActiveWorkbook.Save ' сохранение текущего файла Excel
        
        ' принудительный останов парсера (если вызвать макрос SetMacroReturnPoint с параметром -9)
        Application.Run "SetMacroReturnPoint", -9: Exit Function
    End If
 
    MacroName2 = txt$ ' возвращаем исходное значение
End Function

 

Пример макроса из прикреплённого файла:

Function MyMacro(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String
    On Error Resume Next
    ' меняя значение txt, мы не затрагиваем текущее текстовое значение в действиях
    txt = Split(txt, "/")(UBound(Split(txt, "/")))
 
    MyMacro = "=""Программа №""&" & args(0).Item("{row}") & "-1&"" (" & txt & ")"""
 
    If txt = args(1) Then
        Destination.Interior.Color = vbGreen
        MyMacro = "самая продаваемая программа"
    End If
 
    If txt = args(2) Then
        Destination.EntireRow.Range("a1:c1").Interior.Color = vbRed
        MyMacro = "программа, которой вы сейчас пользуетесь"
    End If
 
    If txt = args(3) Then
        Destination.EntireRow.Delete        ' эта строка нам не нужна - удаляем её
    End If
 
    Destination.EntireColumn.AutoFit       ' автоподбор ширины столбца
End Function

 

ВложениеРазмерЗагрузкиПоследняя загрузка
Пример файла Excel со встроенным парсером (парсер использует макрос)70.5 КБ0Ещё не загружался