Как вызвать листовой макрос из одной книги Excel в другой? - PullRequest
8 голосов
/ 17 февраля 2010

Я пытаюсь вызвать макрос Excel, который находится в другой книге. Это специфичный для листа макрос, но синтаксис, предоставленный документацией Microsoft и исследованиями в Интернете, позволяет получить доступ к макросу только по книге. Этот синтаксис:

Application.Run ("testworkbook.xls!macroname")

Что мне нужно сделать, так это иметь ссылку на лист, что-то вроде:

Application.Run ("testworkbook.xls!Sheet1.macroname")

Я пробовал это и МНОГИЕ другие варианты, включая наличие одинарных или двойных кавычек, но я всегда получаю сообщение о том, что макрос не найден.

Редактировать: Со всеми подсказками и большим количеством испытаний я нашел ответ. Вы можете получить доступ к специфичным для Sheet сабвуферам, но вы должны использовать каноническое имя, например «Sheet1», вы не можете использовать фактическое имя листа. Очевидно, что другие рабочие книги не имеют доступа к этой информации.

Таким образом, приведенный выше формат работает до тех пор, пока вы не попытаетесь использовать имя листа (и вам, возможно, придется заключить в кавычки имя книги (путем объединения CHR(39) с обоих концов).

Ответы [ 3 ]

11 голосов
/ 20 февраля 2010

Я знаю, что вы поняли это, возможно, после большого разрыва волос и кофе, но я хотел:

  • Дайте вам более подробную информацию о том, почему это
  • Предоставить вам способ, которым вы могли бы использовать имя вашего листа, чтобы получить то, что вы хочу.

Прежде всего, имя нужной вам таблицы не совпадает с именем модуля кода. Итак, в вашем VBE вы видите, что имя модуля кода - «Sheet1», но если оно может иметь другое свойство из Name, которое отличается, например, « MySheet1"(или это также может быть то же самое).

Чтобы получить его по имени, вам нужно будет выполнить несколько циклов, изменить настройки безопасности и т. Д. Если это то, что вам нужно (это хорошо работает в небольших средах из-за проблем с настройками безопасности), здесь вы привести пример:

  1. Измените настройки безопасности на доверять программному доступу к VBA Проекты. В Excel 2007 перейдите в Orb | Параметры Excel | Трастовый центр | Настройки Трастового Центра | макрос Настройки, а затем включить «Доверие» доступ к модели проекта VBA "
  2. Создание рабочей книги с одним Рабочий лист. Переименуйте его в « MySheet1 ». Откройте VBE (Alt + F11) и в « Sheet1 (MySheet1) » создать подпункт рутина, назовите это TimesTen и в код просто поставить Debug.Print 10 * 10. Как это:

    Sub TimesTen()
        Debug.Print 10 * 10
    End Sub
    
  3. Сохранить файл как макрос документ и назвать его " MacroXSLX.xlsm ". Оставьте это открытым.

  4. Откройте новый документ Excel, перейдите чтобы это VBE и в новом макросе где угодно, создайте подпункт под названием Test. В теле этого кода, положи это: .

    Sub test()
    Dim SheetName As String
    SheetName = "MySheet1"
    Dim wb As Workbook
    Set wb = Workbooks("MacroXSLX.xlsm")
    For Each VBComp In wb.VBProject.VBComponents
        If VBComp.Properties.Item("Name").Value = SheetName Then
            Application.Run (wb.Name & "!" & VBComp.Name & ".TimesTen")
        End If
    Next
    End Sub
    
  5. Нажмите F5 для запуска test и вы должен видеть 100 в Непосредственном окно.

В # 4 вы можете видеть, что я перебираю все компоненты (Модули, Классы и т. Д.), Ища тот, у которого есть свойство Name со значением MySheet1 . Получив это, я могу получить имя этого компонента, которое в данном случае равно Sheet1 , и использовать его для создания моей строки, которая будет запускать макрос листа в MacroXSLX.xlsm, Код можно очистить дальше, чтобы выйти из оператора For, когда вы нашли то, что хотите, и т. Д.

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

1 голос
/ 17 февраля 2010

Есть ли в проекте VBA защита паролем? Кроме того, саб является частным сабом? Если так, то я не верю, что макрос будет найден.

1 голос
/ 17 февраля 2010

вы можете настроить свой макрос так, чтобы он принимал имя листа в качестве параметра? Затем, когда вы называете это на листе вашей оригинальной книги, вы можете просто назвать его как MyMacro (me.name)? Затем, когда вы вызываете его из другой рабочей книги, вы можете просто вызвать его как application.run ("testworkbook.xls! MyMacro", "sheetname"), где "sheetname" - это ваш параметр.

Я не уверен, есть ли другой способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...