Дона от Мисури попита:
Имате ли представа как мога да намеря пътя, където е подаден документът, посочен в горния или долния колонтитул - или където и да е в документа. Мога да намеря името на файла с & f, но не мога да разбера как да направя пътя.
На първо място, разбирам, че Microsoft е добавил тази функционалност към Excel XP и им предлагам почитания, тъй като това е често задаван проблем. Всички читатели, които вече са надстроили до Office XP, няма да имат нужда от техниките в съвета от тази седмица за решаване на този проблем, но все пак ще бъдат полезни за решаване на други проблеми.
Решението на този съвет е специален тип макрос, наречен макрос за обработка на събития. Ще поемем за кратко управлението на Excel всеки път, когато е на път да отпечата нашата работна книга и да добавим текущия път към заглавката.
Много потребители на Excel са се занимавали със запис на прости макроси. Макросите се съхраняват в модул наречен Module1 или Module2 и стават част от вашия проект. Днес ще обсъдя макроси за обработка на събития. Тези макроси се намират в специален кодов модул, който е свързан с всеки работен лист или работна книга.
Предишни съвети, като например въвеждане на време в Excel без дебелото черво, са се справили със събитието Worksheet_Change. Днешният съвет изисква да добавим малко код към събитието BeforePrint на работната книга.
Кодът, добавен към събитие, ще се изпълнява всеки път, когато това събитие бъде „изстреляно“. В този случай по всяко време, когато работната книга на Excel се отпечатва, преди да започне отпечатването, Excel превключва контрола към кода на VBA и позволява всичко, което можете да посочите в кода на VBA, да се случва автоматично преди печат.

Предполагам, че сте нов в макросите за обработка на събития. Ще разгледам как точно да стигна до правилното място, за да вляза в този макрос.
Имам работна книга, наречена „Tip055 Sample.xls“. С работната книга, заредена в Excel, ще натисна alt = "" + F11, за да стартирам към visual basic editor. По подразбиране видът на редактора е както е показано вдясно. Вляво обикновено виждате прозорец на проект, подреден върху прозореца на свойствата. По-голямата част от дясната страна на екрана включва панел с кодове. Ако нямате макроси в работната си книга, вашият код ще бъде сив, както е показано вдясно.
Добавих сини курсивни думи на скрипта към изображението, за да идентифицирам трите прозореца - няма да ги видите във вашия пример.

Важно е да можете да видите панела на проекта в редактора на VB. Ако вашият изглед на редактора на VB не включва прозореца на проекта, натиснете Ctrl + R, за да видите прозореца на проекта. Или щракнете върху иконата на лентата с инструменти, показана по-долу:
Екранът на проекта ще покаже проект за всяка отворена работна книга на Excel и всяка инсталирана добавка. Щракнете върху сивия плюс до името на вашата работна книга, за да разширите проекта за вашата работна книга. След това щракнете върху сивия плюс до папката Microsoft Excel Objects, за да разгънете папката на обекта. Сега трябва да видите по един запис за всеки работен лист и по един, наречен ThisWorkbook.
Щракнете с десния бутон върху записа за ThisWorkbook и изберете View Code от изскачащото меню.
Вероятно сега ще имате голям празен бял кодов прозорец, заемащ дясната страна на екрана. Има две падащи менюта в горната част на кодовия прозорец, които ще казват (Общи) и (Декларации).
- От падащото меню вляво изберете Работна книга.
- Дясното падащо меню сега се попълва с всички програмируеми събития, свързани с работната книга. Тук има събития, които ще стартират код всеки път, когато работната книга се отвори, активира, деактивира и т.н. Днес искаме да напишем код в събитието BeforePrint, така че изберете BeforePrint от дясното падащо меню.

Имайте предвид, че всеки път, когато изберете нещо от дясното падащо меню, редакторът на VBA записва началото и края на кода в модула на кода вместо вас. Първият път, когато смените лявото падащо меню на Workbook, вероятно сте получили началото на подпрограма Workbook_Open по подразбиране. Ако няма да пишете процедура на Workbook_Open, трябва да помислите за изтриване на тази празна процедура.
Сега, за писане на VBA кода. Има няколко полезни променливи, които можете да използвате.
- ActiveWorkbook.Path ще върне пътя на работната книга. Може да изглежда като "C: My Documents MrExcel".
- ActiveWorkbook.FullName ще върне пътя и името на файла на работната книга. Може да изглежда като "C: My Documents MrExcel Tip055 Sample.xls".
Можете да зададете тази променлива да бъде една в една от следните 6 позиции:
Worksheets("Sheet1").PageSetup.LeftHeader = ActiveWorkbook.FullName Worksheets("Sheet1").PageSetup.CenterHeader = ActiveWorkbook.FullName Worksheets("Sheet1").PageSetup.RightHeader = ActiveWorkbook.FullName Worksheets("Sheet1").PageSetup.LeftFooter = ActiveWorkbook.FullName Worksheets("Sheet1").PageSetup.CenterFooter = ActiveWorkbook.FullName Worksheets("Sheet1").PageSetup.RightFooter = ActiveWorkbook.FullName
Ето три възможни примерни макроса.
Този макрос ще добави пътя и името на файла като десния долен колонтитул на активния работен лист:
Private Sub Workbook_BeforePrint(Cancel As Boolean) ActiveSheet.PageSetup.RightFooter = ActiveWorkbook.FullName End Sub
Този макрос ще има добавен път като ляв заглавен колон на Sheet1 и като централен долен колонтитул на Sheet2:
Private Sub Workbook_BeforePrint(Cancel As Boolean) Worksheets("Sheet1").PageSetup.LeftHeader = ActiveWorkbook.Path Worksheets("Sheet2").PageSetup.CenterFooter = ActiveWorkbook.Path End Sub
Ако сте склонни да използвате опцията "Цяла работна книга" при печат, тази версия ще добави пълното име като централен долен колонтитул към всички листове:
Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each Sh In ActiveWorkbook.Worksheets Sh.PageSetup.CenterFooter = ActiveWorkbook.FullName Next Sh End Sub
Следвайте един от тези примери или създайте свой собствен. Когато приключите, затворете редактора на VBA с File> Close и се върнете към Microsoft Excel.
Всеки път, когато отпечатате работен лист, кодът ще се изпълни и ще вмъкне текущия път в съответния горен или долен колонтитул, който сте посочили в кода на VBA.
Някои бележки и предупреждения:
-
Потребителите на начинаещи Excel няма да имат представа, че този код е в работната книга. Когато отворят работната книга, те могат да получат предупреждение за защита, че файлът съдържа макроси, но няма да има предупреждение, когато кодът на VBA удари всичко, което са имали като централен долен колонтитул и постави името на пътя там. Това може да доведе до киселини. Представете си, че след 5 години някой използва вашата работна книга и новият мениджър иска името на файла да се премести от централния долен колонтитул вдясно. Този човек може да знае ръчно да променя настройките във File> PageSetup, но ако не знае, че кодът е там, той ще го откара, тъй като кодът непрекъснато променя долните им колонтитули.
It is really unlikely that they will be able to find your code module, but just in case they do, you might want to leave a comment in the code module that directs them back to this website for an explanation.
You also might want to add a comment to cell A1 reminding yourself that there is an event handler set up to change the print headers.
-
There is a setting within VBA which prevents events from running. If your macro suddenly stops working, t is common to find that something within VBA has turned this setting to prevent the events from running. The common scenario is that a programmer starts a macro with:
Application.EnableEvents = False '… macro here… Application.EnableEvents = True
Когато възникне грешка в макроса, събитията никога не се включват отново. Когато това се случи, има малко предупреждение. Ако подозирате, че вашите манипулатори на събития не се изпълняват, отидете в редактора на visual basic. Натиснете Ctrl + g, за да изведете незабавен прозорец. В непосредствения прозорец въведете:
Print Application.EnableEvents
и натиснете Enter. Ако установите, че това е False, въведете следния ред в непосредствения прозорец:
Application.EnableEvents = True
и натиснете Enter.
Благодаря на Дона за чудесен въпрос. В процеса на обяснение на отговора това беше чудесна възможност да разширим концепцията за обработчици на събития във VBA.