- Как заказать парсер сайта
- Видеоинструкции по настройке
- Возможности программы-парсера
- Действия в парсере
- Раздел «Работа с HTML»
- Раздел «Текстовые»
- Раздел «Перекодировка и форматирование»
- Раздел «Проверка и сравнение»
- Раздел «Разное»
- Раздел «Функции массива»
- Раздел «Числовые»
- Раздел «Работа с переменными»
- Раздел «Листы и книги Excel»
- Раздел «Обработка файлов из папки»
- Раздел «HTTP запрос»
- Раздел «Internet Explorer»
- Раздел «Управление парсером»
- Раздел «Веб-запросы, XML, макросы VBA»
- Недокументированные действия
- Работа с браузером (Chrome и т.п.)
- Отключенные (устаревшие) действия
- Интерфейс программы
- Использование браузера
- Ошибки при парсинге
- Вывод массива значений в одну ячейку
- Обход защиты Qrator, Incapsula и CloudFare
- Ошибка: сервер не ответил за 9 секунд
- Парсер перезаписывает данные в первой строке листа
- Невозможно запустить макрос, - нет доступа к проекту VBA
- Ошибка Compile error in hidden module
- Ошибка загрузки страницы по HTTPS (SSL Error)
- Дополнительные возможности
- Зарезервированные переменные и подстановочные коды парсера
- Кеширование страниц в парсере
- Переменные в парсере
- Обновление строк в существующей таблице при парсинге
- Переключение между наборами настроек в парсере
- Запуск мониторинга цен по расписанию
- Запуск парсера по расписанию
- Программный запуск парсера из внешнего макроса
- Доп. опции парсера (файл parser.ini)
- Наборы действий
- Прочие статьи по настройке парсера
- Коды останова парсера, и перехода на другое действие
- Плагины для парсера
- Запуск нескольких парсеров по очереди
- Обработка капчи (Captcha) в парсере
- Прокси серверы
Действие парсера «Запуск внешнего макроса» |
||||||||||||
Параметры действия:Предназначение действия:Выполняет запуск макроса с заданным именем из любой открытой книги Excel. Первая строка макроса должна иметь следующий вид: Возвращаемое значение: отсутствует (текущее значение не изменяется)
Параметр «Название (имя) макроса»
Параметр «Параметр 1»
Параметр «Параметр 2»
Параметр «Параметр 3»
Примеры использования:Это действие позволяет расширить возможности парсера, — например, если требуется сложная обработка текстовых данных, или какая-то обработка таблицы (например, окраска ячеек)
Сам макрос (в данном примере — с названием MacroName, название макроса может быть любым) должен располагаться в стандартном модуле любой запущенной надстройки. ВАЖНО: Если макрос находится не в надстройке, а в открытом файле Excel (куда подставляются данные), Если макрос находится в ДРУГОМ запущенном файле 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 параметра:
передаётся ПО ЗНАЧЕНИЮ (ByVal), — следовательно, если изменить значение переменной txt в коде макроса,
(если выполняются действия ДО начала вывода на лист, то Destination = Nothing)
в args(0) записывается СЛОВАРЬ со всеми текущими переменными
Функция может возвращать значение (текстовую строку). По-умолчанию результат функции равен пустой строке (в следующее по списку действие будет передано пустое значение). Чтобы макрос не изменял текущее значение, добавьте в него строку кода 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
|