Действие парсера «Запуск внешнего макроса»

Параметры действия:

Предназначение действия:

Выполняет запуск макроса с заданным именем из любой открытой книги Excel.

Первая строка макроса должна иметь следующий вид:
Function MacroName(ByRef txt$, ByRef Destination As Range, ParamArray args()) As String

Возвращаемое значение: отсутствует (текущее значение не изменяется)

 


Параметр «Название (имя) макроса»

Тип параметра: произвольное текстовое значение

 

Параметр «Параметр 1»

Тип параметра: произвольное текстовое значение

 

Параметр «Параметр 2»

Тип параметра: произвольное текстовое значение

 

Параметр «Параметр 3»

Тип параметра: произвольное текстовое значение

 

 

Примеры использования:

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

Действие Параметр Значение
Запуск внешнего макроса Название 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