Страницы: 1
RSS
Переменная рабочей книги для запуска связанных с именем книги макросов
 
Здравствуйте уважаемые специалисты. Вновь обращаюсь к Вам за помощью. Надеюсь не обделите вниманием. В общем суть вопроса. Есть некий файл (рабочая книга) созданный  в Excel 2003. В рабочей книге есть два листа "Конструктор" и "Результат" . На первом листе "Конструктор" над рабочим диапазонов расположены кнопки "Закрыть" и "Раскрыть" с привязкой к макросам, при нажатии которых соответственно диапазон либо скрывается либо отображается. На втором листе "Результат" есть одна кнопка "Перенос" тоже с макросом, при нажатии на которую копируется заданный диапазон на листе "Результат", затем становится активным лист "Конструктор", нажимается конопка "Раскрыть" (то бишь запускается вторичный макрос, привязанный к кнопке "Раскрыть";), вставляются скопированные данные в заданный диапазон и на этом работа макроса "Перенос" останавливается. То есть в теле макроса "Перенос" лежит команда запуска вторичного макроса "Раскрыть".   Понятно, что в реальности у меня может быть более длинная цепочка вторичных макросов. Для простоты примера я выложил более простую схему. В целом конструкция работает как надо, но столкнулся с одной неприятной "печалькой". Оказалось, что в теле первичного макроса в коде запуска вторичного макроса прописывается абсолютное имя рабочей книги и имя второчиного макроса. Это приводит к тому, что если я изменю название рабочей книги и не произведу коррекцию этого названия в теле макроса, то при попытке его запустить (первичный макрос), Excel выдаст ошибку

Run-Time Error '1004': Не удалось найти "такой то файл". Проверьте задание имени и местоположения файла.

Согласитесь, что это очень геморойно и жестко привязывает тебя к тому чтобы имя файла не менялось, в противном случае нужно делать корректировку во всех макросах где есть код содержащий имя книги.
Очевидно, что здесь уместнее ввести переменную и присвить её к имени книги. Тогда можно будет менять имя файла и не беспокоится что макрос перестанет запускаться. Думаю, что в модуль ЭтаКнига нужно засунуть объект ThisWorKBook. Однако ж ничего у меня не получилось. Пожалуйста посмотрите выложенный мною файл и подскажите какой макрос воткнуть в модуль  ЭтаКнига  и что подправить в первичном макросе "Перенос", что бы в коде запуска вторичного макроса была указана переменная вместо абсолютного имени рабочей книги.

Укажу код который я пытался использовать и который не сработал.
В модуле ЭтаКнига пытался задать перменную, что бы она задавалась при открытии книги
Код
Sub Wbook()
    ' Задание переменной
        Set B = ThisWorkbook
End Sub
В стандартном модуле вместо абсолютного имени рабочей книги вставил переменную "B"
Код
Sub Perenos()
' Perenos Макрос
' Макрос записан 05.03.2015 (user)
    Range("B3:C12").Select
    Selection.Copy
    Sheets("Констурктор").Select
    Application.Run "'B'!Raskryt"
    Range("B3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("B3").Select
End Sub
Но как уже говорил ничего не сработало, поэтому в выложенном файле я эти макросы не использовал. Более того для наглядности ошибки запуска вторичного макроса я изменил имя файла, не изменив при этом тело макроса. Достаточно переименовать файл (убрать из имени цифру 2) и всё будет работать. Думаю суть проблеммы понятна. Помогите пожалуйста люди добрые!
 
Application.Run "'Таблица подсчета 03-15.xls'!Raskryt"
Raskryt
 
Доброе время суток
А какой смысл в таком вызове метода Raskryt в методе Perenos? Достаточно просто вызвать
Код
Raskryt

Код же Raskryt находится в том же проекте, что и Perenos.
Если очень хочется вызывать в вашем стиле, тогда так
Код
Application.Run "'" & ThisWorkbook.Name & "'!Raskryt"

Успехов
 
Уважаемые RAN, и Андрей VG,  Спасибо Вам огромное!!! Большое человеческое спасибо!!! Извините сразу не смог откомментировать Ваши варианты. Вариант
Цитата
Raskryt
Оказался до боли простым!!! Видимо вариант от Андрей VG,
Код
Application.Run "'" & ThisWorkbook.Name & "'!Raskryt"
то что я изначально и искал. Честно скажу его пока не пробовал (обязательно с ним поэкспериментирую). Что же касается возможности указания в коде прямого имени макроса без всяких там  Application.Run я тупо не знал. В основном макросы приходиться создавать через макрорекодер, а так напрямую через VBE для меня сложновато. Но тогда я не понимаю, извиняюсь за грубое слово, за каким хреном макрорекодер при записи добавляет в код запуска вторичного макроса строку с  Application.Run ??? Ведь при записи первичного макроса Raskryt я ведь не открывал другую рабочую книгу для вызова вторичного макроса, вызов то происходил в границах одной и той же рабочей книги.
Может ли кто нибудь доступно это объяснить почему так?  
Изменено: Excelman - 10.03.2015 00:12:16
 
Вообще надо радоваться, что такой инструмент, как макрорекордер вообще есть, а не ругаться на него.
В Вашем случае он просто видит, что Вы вызываете макрос, поэтому и показывает код, привязанный к данной операции. А зачем им (разработчикам МР) усложнять условия, когда данная операция является общей для всех случаев, и когда вызывается из другой книги и когда вызывается из текущей.
А вызов процедуры это основы самого программирования. Начните с изучения базовых принципов работы в VBA, а макрорекордер будет лишь как подспорье.
Учимся сами и помогаем другим...
 
Цитата
Excelman написал: за каким хреном
За тем самым, за которым обычно в магазин не ходят :-)
Run - это метод, который используется самим Excel для вызова процедур. Excel сам по себе не знает про Call, которым производится вызов процедур внутри VBA. Поэтому именно он(Run) попадает в запись рекордера.
Запись в коде:
Код
Raskrut
равносильна записи
Код
Call Rascrut
При написании имени процедуры или функции без Call VBA все равно сначала производит поиск процедур и функций с указанным именем, чтобы применить Call и вызвать запуск процедуры/функции. Если не находит - производится поиск среди переменных модуля и проекта. Если найдет - проверяет идет ли назначение значения или извлечение(если глубже копать то применяется ли процедура Property Let или Property Set). Если нет назначения или извлечения - то ошибка вызова метода. Если нет переменной - не будем углубляться, зависит от некоторых параметров.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ber$erk, Спасибо за растолковывание. Я в общем то не ругал макрорекордер. Без него я бы многих вещей не смог реализовать при моем не богатом уровне знаний.
Просто не понимал зачем он добавляет лишнее в код если без этого "лишнего"  будет работать. Но после Вашего:
Цитата
А зачем им (разработчикам МР) усложнять условия, когда данная операция является общей для всех случаев, и когда вызывается из другой книги и когда вызывается из текущей.
вроде дошло до меня. Наоборот эти "лишние" вставки как раз видимо призваны делать некоторые операции вызова процедур более универсальными особенно в расчете для таких чайников как я.

Еще раз спасибо что помогли понять.
 
Спасибо   The_Prist, за еще более толковое разъяснение!
 
Цитата
В рабочей книге есть два листа "Конструктор" и "Результат"
Цитата
Sheets("Констурктор")
Я вот уже на протяжении нескольких тем гадаю, где правильное написание слова
 
Кузмич, какая разница? Лишь бы код не ругался :)
Страницы: 1
Наверх