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

  • Автор темы Автор темы Blackvil
  • Дата начала Дата начала

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Реакции
10
Баллы
8
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
 
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через ZP запустить макрос к определенной таблице?
Можно пример макроса?
 
Судя по ответу chatgpt, его достаточно просто запустить. В зенке есть кубик, позволяющий запускать файлы.
 
Всем привет. Есть уже написанный макрос. Хочу применить его в таблице. При этом не хочу руками открывать и жать на кнопки. Скажите пожалуйста, возможно ли через 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();

Рабочий шаблон, таблицу с макросом, библиотеку приложил ↓
 

Вложения

Напрямую из 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
Напрямую из 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 и доступен всем таблицам
 
Большое спасибо за такой развернутый ответ!
Рад, что мой вариант полезен.)
Получается, в вашем примере запускается макрос, который привязан к книге конкретной таблицы 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();

Приложил шаблон ↓
 

Вложения

Рад, что мой вариант полезен.)

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

Пока тестировал, столкнулся с проблемой возможно в моей системе.
Из таблицы макрос запускался удачно, а если с помощью кода, то книга просто не закрывалась, но ошибки об этом нет.
Если пытаться запустить вручную 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

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