Страницы: 1
RSS
Ошибка при обращении методом Application.Run к макросу с определенным именем
 
Добрый день.
Вроде правила именования процедур не нарушены, но она не вызывается (см. вложение).

Win7 sp1 x32
 
Код
Public Sub dd()
    ss
    ss2
End Sub
 
А если с Run надо тогда так
Код
Public Sub dd()
    Run "Книга1.xlsm!module1.ss"
    Run "Книга1.xlsm!module1.ss2"
End Sub
 
Это  - одна из "загадочных" ошибок. Метод Application.Run, вообще, достаточно хитрый и существует с давних времен. По историческим причинам в качестве первого параметра может быть имя макроса или диапазон (Range). В #1 вызывается 3 макроса с именами ss и ss2. Проблема с ss2 (как я это понимаю) заключается в том, что ss2 может интерпретироваться как имя (адрес) диапазона (как это и не дико выглядит). Поэтому выхода два:
  • обращаться к макросу по имени и отчеству (с указанием модуля). Это продемонстрировано в #3.
  • не использовать для макросов имена, которые могут интепретироваться как имена ячеек.
Я придерживаюсь второго подхода.
Изменено: sokol92 - 30.01.2022 18:37:53
Владимир
 
Владимир Спасибо за пояснения. Я понял, что объект не находит, несколько минут тыкал не получалось, а про именованные диапазоны для метода Run не знал.
 
Цитата
написал:
не использовать для макросов имена, которые могут интерпретироваться как имена ячеек
Ну некоторые и круче делают... Дают названия макросам типа "Sum" и т.п. ... :)
я применяю в подобных случаях (в плане читаемости и понимания кода и в т.ч. в названиях)  нижнее подчеркивание. (иногда два-три, по обстановке, + комментарии) И  все видно, и название перед глазами :)  
 
Цитата
написал:
Дают названия макросам типа "Sum"
Ячейки с адресом "Sum" нет, a вот с адресом "Sum1" есть.  :)  
Владимир
 
по этим же причинам
вы можете обьявить функцию AB1()
Код
Function AB1()
  AB1 = "ab1"
End Function
и даже сколько угодно использовать ее в коде
Код
Sub TestAB1()
  MsgBox AB1
End Sub
но стоит только в любую ячейку написать: =AB1() как тут же получите ИМЯ!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
sokol92 ну да, есть такое ;) Обычное дело - ТС не пояснил, что откуда и зачем  :) Если все в одной книге, нафига Run? ThisWorkbook не хватит? :) Подождем, может пояснит :) А так, если по названию темы то да - название модуля должно быть...
Изменено: _Igor_61 - 30.01.2022 19:23:37
 
Цитата
написал:
Подождем, может пояснит
Это не для каких-л целей, а просто поделился неочевидным моментом.

Даже в справке написано размыто.Три раза прочитал, но так и не понял для какой цели так было сделано и можно ли из этого выжать что-н интересное сейчас.
Изменено: kefirko - 01.02.2022 18:00:40
 
"До исторического материализма" макросы жили в особых листах. Вряд ли сейчас это интересно. :)

Спасибо автору за интересную тему - такое может случиться с каждым.
Изменено: sokol92 - 01.02.2022 18:06:04
Владимир
 
Цитата
kefirko написал:
так и не понял для какой цели так было сделано
сделано было еще в те времена, когда макросы писались на специальных листах макросов. И там специальной функцией(Run или ВЫПОЛНИТЬ) можно было вызывать различные процедуры, в том числе расположенные в других книгах. И вот там допускалось(а если быть точнее, даже требовалось, если указывалась ссылка на ячейки) указывать конкретные ячейки(или именованные диапазоны), начиная с которых надо начать выполнение заданных макрокоманд. Что-то вроде:
Код
ВЫПОЛНИТЬ("[Книга1]ЛистМакро!R4C1")

или
Код
ВЫПОЛНИТЬ("[Книга1]ЛистМакро!ИмяДиапазона_СтартМакроса")

И т.к. Microsoft печется об обратной совместимости, определенная часть функционала перекочевала в том виде, в котором была создана изначально(где-то, возможно, с некоторыми модификациями, которые не "портят" исходный функционал). Со всеми нюансами, которые мы сейчас и имеем честь лицезреть.
Изменено: Дмитрий(The_Prist) Щербаков - 01.02.2022 18:32:42 (дополнил примерами)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх