Можно пример макроса?Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
Я имею в виду, что у меня макрос уже написан в Excel VBA. То есть есть файл макроса, который нужно как-то активировать автоматическиМожно пример макроса?
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
Напрямую из Zenno не сделать (из методов ZP).Я имею в виду, что у меня макрос уже написан в Excel VBA. То есть есть файл макроса, который нужно как-то активировать автоматически
Interop.Excel
или EPPlus
. Под капотом ZP стоит урезанная (старая) версия EPPlus
.Sub CheckCellValue()
If Range("A2").Value = "да" Then
Range("B2").Interior.Color = RGB(0, 255, 0)
End If
End Sub
Microsoft.Office.Interop.Excel
в папку по пути:C:\Program Files\ZennoLab\RU\ZennoPoster Standard V7\!!!verZP!!!\Progs\ExternalAssemblies
using Microsoft.Office.Interop.Excel;
var excelApp = new Application();
var workbook = excelApp.Workbooks.Open(@"Путь до таблицы с макросом.xlsm");
excelApp.Run("CheckCellValue"); // запуск по имени макроса
workbook.Close(true); // true, чтобы сохранить изменения
excelApp.Quit();
Большое спасибо за такой развернутый ответ!Напрямую из 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 и доступен всем таблицамНапрямую из 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 и доступен всем таблицам
PERSONAL.XLSB
, то все просто виснет и все.%AppData%\Microsoft\Excel\XLSTART\PERSONAL.XLSB
C:\
и сослался на ней..xlsb
. Главное, чтобы поддерживала макросы.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();
al.XLS
Благодарю за оказанную помощь. Все работает идеально!Рад, что мой вариант полезен.)
Привет. Да, можно и из общей книги.
Пока тестировал, столкнулся с проблемой возможно в моей системе.
Из таблицы макрос запускался удачно, а если с помощью кода, то книга просто не закрывалась, но ошибки об этом нет.
Если пытаться запустить вручную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();