Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300

Вызов макроса из того же файла, но открытого в другом Excel

21.06.2018, 11:37. Показов 1743. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая:

1. Надо внести изменения в файл программным путем через код внутри этого файла. Как легко видеть, это файл Xlsm/Xlam
2. Пишется процедура, вносящая изменения в файл.
3. Надо сделать следующее:
3.1 Открыть второй Excel
3.2 Во втором Excel"е открыть тот же файл
3.3 Заставить отработать процедуру, которая внесёт изменения.
3.4 Закрыть первый Excel

Проблема в том, что не удается выполнить пункт 3.3

Вот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Option Explicit
Sub MyAction()
 MsgBox ("           Done!!!                   ")
End Sub
Sub QQQ()
 Dim App1 As Application, App2 As Application
 Dim Nomen As String, FullNomen As String
 
 Nomen = ThisWorkbook.Name
 FullNomen = Application.Workbooks.Item(Nomen).FullName
 
 Set App1 = CreateObject("Excel.Application")
 Set App2 = New Excel.Application '
 App2.Visible = True
 App2.Workbooks.Add (FullNomen)
 App2.Run FullNomen & "!MyAction"
 App1.Quit
End Sub
Отказывается работать метод Run

Что интересно, автомакрос на событие xlAutoOpen отрабатывает/

Т.е., если поместить действие на "ЭтаКнига/ThisWorkBook", убрать в основном коде строку с Run, а в предыдущую добавить RunAutoMacros, то всё отрабатывается нормально.
Выглядит так:

Visual Basic
1
2
3
Private Sub Workbook_Open()
 MsgBox ("           Done!!!                   ")
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub QQQ()
 Dim App1 As Application, App2 As Application
 Dim Nomen As String, FullNomen As String
 
 Nomen = ThisWorkbook.Name
 FullNomen = Application.Workbooks.Item(Nomen).FullName
 
 Set App1 = CreateObject("Excel.Application")
 Set App2 = New Excel.Application '
 App2.Visible = True
 App2.Workbooks.Add(FullNomen).RunAutoMacros (xlAutoOpen)
 'App2.Run FullNomen & "!MyAction"
 App1.DisplayAlerts = False
 Excel.Application.Quit
End Sub
Иначе говоря, автомакрос вызвать можно, но почему не вызывается простой макрос из модуля?
Что я делаю не так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2018, 11:37
Ответы с готовыми решениями:

Вызов макроса Word из Excel
Здравствуйте! Подскажите пожалуйста чайнику Нужен ексельный макрос, который запускал бы Ворд и в нем выполнялся Вордовский же макрос. ...

Вызов макроса Word из Excel
Доброго времени суток. Есть макрос в Excel и Word, локально оба работают. Необходимо добавить в макрос Excel вызов макроса Word, чтобы они...

Считать из открытого файла Excel в StringGrid
Здравствуйте! Как считать информацию из открытого файла Excel? Пробовала вот так: void __fastcall TForm1::FormCreate(TObject...

5
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
21.06.2018, 12:49
Цитата Сообщение от MU-GK Посмотреть сообщение
Во втором Excel"е открыть тот же файл
А Вы не открываете, а создаете новый файл, используя этот как шаблон
Visual Basic
1
App2.Workbooks.Add (FullNomen)
Новый файл не сохранен, у него нет пути, поэтому метод Run и не работает. Попробуйте просто
Visual Basic
1
App2.Run "MyAction"
1
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
21.06.2018, 13:34  [ТС]
Да, точно, это же Add, а не Open!

Надо будет попробовать разные способы — тот, что предлагаете Вы, или же открыть файл.
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
27.06.2018, 01:37  [ТС]
В общем, так можно, ног не достигаются поставленные задачи, в частности, возникают проблемы с сохранением.

Потому лучше сделать именно Open, а потом так, как подсказали Вы.
===============================

Собственно, исходная задача состояла в том, чтобы "испортить" Экселя - уничтожить весь файл, уничтожить её программные коды, уничтожить содержимое страниц в состоянии, когда убран флаг "Доверять доступ к объектной модели VBA".
Понятно, что когда флаг убран, то первые две задачи невыполнимы, хотя испортить страницы можно.

Поэтому надо выставить флаг.

Это делается без труда, но дело в том, что флаг при этом выставляется только для вида, внутри же Экселя флага нет, он появится только при закрытии и повторном открытии Экселя.

Отсюда и возникает идея - открыть второй экземпляр Экселя, у него флаг уже настоящий, выполнить MyAction вл втром экземпляре, потом закрыть первый экземпляр.
После этого у нас открыт второй экземпляр с испорченной надстройкой, которую остаётся только сохранить.

Ну или ничего не делать, если мы её вообще уничтожаем....
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
27.06.2018, 05:08
Запустить событие в другой книге
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
27.06.2018, 16:08  [ТС]
Напоминание о синтаксисе очень полезно, спасибо.

Но тут не другая книга, а та же самая.
Почему два раза?
Потому что первый экземпляр снимает защиту, а второй экземпляр производит действия над самим собой.
Причем защита это не пароль, в данном случае, а защита "Доверять доступ к объектной модели VBA".

После этого имеем два экземпляра - первый в первоначальном виде, второй уже "испорченный", но чтобы его сохранить надо закрыть первый экземпляр. Немного сумбурно, но примерно так

Добавлено через 4 часа 37 минут
Хотя, тут и пароли то же.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Вот код, устанавливающий пароль на Документ, в моем случае это [B]Xlam[/B]:
Sub PassWordOn()
 With Application  
  .VBE.CommandBars.FindControl(ID:=2578).Execute
  .SendKeys "{Tab 9}{Right}{Tab}"
  .SendKeys " "
  .SendKeys "{Tab}"
  .SendKeys "1234": .SendKeys "{Tab}"
  .SendKeys "1234": 
  .SendKeys "{Enter}"  
 End With
End Sub
1. Первая строка внутри кода позволяет сразу пробраться через закладку Tools к пункту меню VBAProject Properties
2. Следующая строка девять раз отрабатывает нажатие клавиши Tab, приводит к закладке General и сдвигает к закладке Protection
3. Затем следует нажатие клавиши Пробел
4. После этого вводится требуемый пароль, в данном случае это 1234, после чего следует перевод на подтверждение.
5. Подтверждение пароля
6. Сразу нажатие Enter.

Пароль установлен.

Но есть тонкое место, а именно в п.3, дело в том, что нажатие клавиши Пробел не устанавливает флаг Lock project for viewing, а перебрасывает его.

Отсюда вопрос - как узнать, выставлен этот флаг, или нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2018, 16:08
Помогаю со студенческими работами здесь

Удаление лишнего слоя для любого открытого excel файла
Здравствуйте. У меня веб приложение которое берет с БД информацию и создает сводную таблицу в Excel все хорошо , но в добавок из-за того...

Копирование из открытого файла когда известна лишь часть названия (VBA Excel)
Добрый день, Знаю, что много похожих тем по данному вопросц, но не нашла заточенную под свои нужды. Во всех необходимо указать путь к...

Автокопия открытого файла Excel в папку Dropbox при нажатии Файл->Сохранить
Для некоторых (не для всех) xlsx файлов хочу сделать так, чтобы при нажатии на кнопку "Сохранить" (Файл - Сохранить) помимо...

Запуск макроса из макроса ИЛИ повторение одного и того же кода
Excel Есть код в 10 строк (назовем его "блок"), который повторяется 5 раз в модуле (макросе). При любых изменения "блока"...

Вызов макроса в теле другого макроса
Добрый день! Есть макрос (главный) в теле которого вызывается другой макрос. При выполнении второго макроса вычисляется значение, которое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru