Запустить готовый макрос в Excel через Zennoposter

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 519
Благодарностей
1 317
Баллы
113
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
Можно пример макроса?
 

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
  • Спасибо
Реакции: Sho

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 233
Благодарностей
573
Баллы
113
Судя по ответу chatgpt, его достаточно просто запустить. В зенке есть кубик, позволяющий запускать файлы.
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
Я имею в виду, что у меня макрос уже написан в Excel VBA. То есть есть файл макроса, который нужно как-то активировать автоматически
Напрямую из Zenno не сделать (из методов ZP).

Можно только подключая Interop.Excel или EPPlus. Под капотом ZP стоит урезанная (старая) версия EPPlus.
Если хотите подробнее или есть ещё вопросы по Excel, напишите в личные сообщения, попробую объяснить и приведу рабочий примеры.)

Краткий пример решения задачи:
VBA макрос с именем CheckCellValue:
Макрос VBA для примера:
Sub CheckCellValue()
    If Range("A2").Value = "да" Then
        Range("B2").Interior.Color = RGB(0, 255, 0)
    End If
End Sub
Было:
106631

Стало:
106629


Чтобы все работа нужно:
1. Положить библиотечку Microsoft.Office.Interop.Excel в папку по пути:
C:\Program Files\ZennoLab\RU\ZennoPoster Standard V7\!!!verZP!!!\Progs\ExternalAssemblies
2. Подключить в GAC эту библиотеку
3. Прописать в Using'и:
Using:
using Microsoft.Office.Interop.Excel;
Код решения задачи:
Запуск макроса в таблице:
var excelApp = new Application();
var workbook = excelApp.Workbooks.Open(@"Путь до таблицы с макросом.xlsm");

excelApp.Run("CheckCellValue"); // запуск по имени макроса

workbook.Close(true); // true, чтобы сохранить изменения
excelApp.Quit();
Рабочий шаблон, таблицу с макросом, библиотеку приложил ↓
 

Вложения

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
Напрямую из Zenno не сделать (из методов ZP).

Можно только подключая Interop.Excel или EPPlus. Под капотом ZP стоит урезанная (старая) версия EPPlus.
Если хотите подробнее или есть ещё вопросы по Excel, напишите в личные сообщения, попробую объяснить и приведу рабочий примеры.)

Краткий пример решения задачи:
VBA макрос с именем CheckCellValue:
Макрос VBA для примера:
Sub CheckCellValue()
    If Range("A2").Value = "да" Then
        Range("B2").Interior.Color = RGB(0, 255, 0)
    End If
End Sub
Было:
Посмотреть вложение 106631
Стало:
Посмотреть вложение 106629

Чтобы все работа нужно:
1. Положить библиотечку Microsoft.Office.Interop.Excel в папку по пути:
C:\Program Files\ZennoLab\RU\ZennoPoster Standard V7\!!!verZP!!!\Progs\ExternalAssemblies
2. Подключить в GAC эту библиотеку
3. Прописать в Using'и:
Using:
using Microsoft.Office.Interop.Excel;
Код решения задачи:
Запуск макроса в таблице:
var excelApp = new Application();
var workbook = excelApp.Workbooks.Open(@"Путь до таблицы с макросом.xlsm");

excelApp.Run("CheckCellValue"); // запуск по имени макроса

workbook.Close(true); // true, чтобы сохранить изменения
excelApp.Quit();
Рабочий шаблон, таблицу с макросом, библиотеку приложил ↓
Большое спасибо за такой развернутый ответ!
 
  • Спасибо
Реакции: djaga

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
Напрямую из Zenno не сделать (из методов ZP).

Можно только подключая Interop.Excel или EPPlus. Под капотом ZP стоит урезанная (старая) версия EPPlus.
Если хотите подробнее или есть ещё вопросы по Excel, напишите в личные сообщения, попробую объяснить и приведу рабочий примеры.)

Краткий пример решения задачи:
VBA макрос с именем CheckCellValue:
Макрос VBA для примера:
Sub CheckCellValue()
    If Range("A2").Value = "да" Then
        Range("B2").Interior.Color = RGB(0, 255, 0)
    End If
End Sub
Было:
Посмотреть вложение 106631
Стало:
Посмотреть вложение 106629

Чтобы все работа нужно:
1. Положить библиотечку Microsoft.Office.Interop.Excel в папку по пути:
C:\Program Files\ZennoLab\RU\ZennoPoster Standard V7\!!!verZP!!!\Progs\ExternalAssemblies
2. Подключить в GAC эту библиотеку
3. Прописать в Using'и:
Using:
using Microsoft.Office.Interop.Excel;
Код решения задачи:
Запуск макроса в таблице:
var excelApp = new Application();
var workbook = excelApp.Workbooks.Open(@"Путь до таблицы с макросом.xlsm");

excelApp.Run("CheckCellValue"); // запуск по имени макроса

workbook.Close(true); // true, чтобы сохранить изменения
excelApp.Quit();
Рабочий шаблон, таблицу с макросом, библиотеку приложил ↓
Получается, в вашем примере запускается макрос, который привязан к книге конкретной таблицы Excel. Подскажите пожалуйста, можно ли как-то активировать макрос, который не привязан к книге Excel? Этот макрос лежит в общей скрытой книге PERSONAL.XLSB и доступен всем таблицам
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Большое спасибо за такой развернутый ответ!
Рад, что мой вариант полезен.)
Получается, в вашем примере запускается макрос, который привязан к книге конкретной таблицы Excel. Подскажите пожалуйста, можно ли как-то активировать макрос, который не привязан к книге Excel? Этот макрос лежит в общей скрытой книге PERSONAL.XLSB и доступен всем таблицам
Привет. Да, можно и из общей книги.

Пока тестировал, столкнулся с проблемой возможно в моей системе.
Из таблицы макрос запускался удачно, а если с помощью кода, то книга просто не закрывалась, но ошибки об этом нет.
Если пытаться запустить вручную PERSONAL.XLSB, то все просто виснет и все.
Обычно общая папка для пользователя находится тут по такой ссылке: %AppData%\Microsoft\Excel\XLSTART\PERSONAL.XLSB
Поэтому я создал ещё одну таблицу в корне диска C:\ и сослался на ней.
В итоге результат положительный.

Основная концепция:
1. Запустить обе таблицы, желательно с макросами раньше, чем целевую.
2. Выполнить макрос сославшись на таблицу с нужным нам макросом.
Это не обязательно должна быть таблица с расширением .xlsb. Главное, чтобы поддерживала макросы.
3. Закрыть таблицы. С макросами сохранять не нужно, а целевую сохранить.
4. Результат тот же, что и выше. Макрос вызывал тот же.

Код:
C#:
var excelApp = new Application();

var personalWorkbook = excelApp.Workbooks.Open(@"C:\personal.xlsb"); // открыть общую таблицу с макросами
var workbook = excelApp.Workbooks.Open(@"Путь до таблицы.xlsm");

// Запуск макроса по имени из общей таблицы
excelApp.Run("personal.XLSB!CheckCellValue"); // "personal.XLSB!CheckCellValue" имя таблицы с расширением — разделитель ('!') — имя макроса

// Закрытие книги и Excel приложения
workbook.Close(true);
personalWorkbook.Close(false); // без сохранения
excelApp.Quit();
Приложил шаблон ↓
 

Вложения

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
Рад, что мой вариант полезен.)

Привет. Да, можно и из общей книги.

Пока тестировал, столкнулся с проблемой возможно в моей системе.
Из таблицы макрос запускался удачно, а если с помощью кода, то книга просто не закрывалась, но ошибки об этом нет.
Если пытаться запустить вручную PERSONAL.XLSB, то все просто виснет и все.
Обычно общая папка для пользователя находится тут по такой ссылке: %AppData%\Microsoft\Excel\XLSTART\PERSONAL.XLSB
Поэтому я создал ещё одну таблицу в корне диска C:\ и сослался на ней.
В итоге результат положительный.

Основная концепция:
1. Запустить обе таблицы, желательно с макросами раньше, чем целевую.
2. Выполнить макрос сославшись на таблицу с нужным нам макросом.
Это не обязательно должна быть таблица с расширением .xlsb. Главное, чтобы поддерживала макросы.
3. Закрыть таблицы. С макросами сохранять не нужно, а целевую сохранить.
4. Результат тот же, что и выше. Макрос вызывал тот же.

Код:
C#:
var excelApp = new Application();

var personalWorkbook = excelApp.Workbooks.Open(@"C:\personal.xlsb"); // открыть общую таблицу с макросами
var workbook = excelApp.Workbooks.Open(@"Путь до таблицы.xlsm");

// Запуск макроса по имени из общей таблицы
excelApp.Run("personal.XLSB!CheckCellValue"); // "personal.XLSB!CheckCellValue" имя таблицы с расширением — разделитель ('!') — имя макроса

// Закрытие книги и Excel приложения
workbook.Close(true);
personalWorkbook.Close(false); // без сохранения
excelApp.Quit();
Приложил шаблон ↓
Благодарю за оказанную помощь. Все работает идеально!
 
  • Спасибо
Реакции: djaga

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)