Donna din Missouri a întrebat:
Aveți vreo idee despre cum pot obține calea în care este depus documentul, indicată în antet sau subsol - sau oriunde în document. Pot obține numele fișierului cu & f, dar nu pot afla cum să fac calea.
În primul rând, înțeleg că Microsoft a adăugat această funcționalitate la Excel XP și le ofer felicitări, deoarece este o problemă frecvent solicitată. Cititorii care au trecut deja la Office XP nu vor avea nevoie de tehnicile din sfatul acestei săptămâni pentru a rezolva această problemă, dar vor fi în continuare utile pentru a rezolva alte probleme.
Soluția la acest sfat este un tip special de macro numit macro de gestionare a evenimentelor. Vom prelua pe scurt controlul Excel de fiecare dată când este pe cale să ne tipărim registrul de lucru și să adăugăm calea curentă la antet.
Mulți utilizatori Excel s-au preocupat de înregistrarea macrocomenzilor simple. Macrocomenzile sunt stocate într-un modul numit Module1 sau Module2 și devin parte a proiectului dumneavoastră. Astăzi, voi discuta despre macro-urile de gestionare a evenimentelor. Aceste macro-uri se află pe un modul de cod special care este asociat cu fiecare foaie de lucru sau registru de lucru.
Sfaturile anterioare, cum ar fi Introduceți timpul Excel fără pontul Colon, s-au ocupat de evenimentul Worksheet_Change. Sfatul de astăzi necesită adăugarea unui cod la evenimentul BeforePrint din Workbook.
Codul adăugat la un eveniment va fi rulat ori de câte ori acel eveniment este „tras”. În acest caz, de fiecare dată când este imprimat registrul de lucru Excel, înainte de a începe tipărirea, Excel transformă controlul în codul VBA și permite ca orice lucru pe care îl puteți specifica în codul VBA să se întâmple automat înainte de tipărire.

Voi presupune că sunteți nou în macro-urile de gestionare a evenimentelor. Voi merge exact prin cum să ajung la locul potrivit pentru a intra în această macro.
Am un registru de lucru numit „Tip055 Sample.xls”. Cu registrul de lucru încărcat în Excel, voi apăsa alt = "" + F11 pentru a începe editorul vizual de bază. Aspectul implicit al editorului este așa cum se arată în dreapta. În stânga, vedeți de obicei un panou de proiect stivuit deasupra unui panou de proprietăți. Cea mai mare parte din partea dreaptă a ecranului include un panou de cod. Dacă nu aveți macrocomenzi în registrul de lucru, panoul de coduri va fi gri așa cum se arată în dreapta.
Am adăugat cuvinte cu caractere italice albastre în imagine pentru a identifica cele trei panouri - nu le veți vedea în exemplul dvs.

Este important să puteți vedea panoul de proiect în editorul VB. Dacă vizualizarea editorului VB nu include panoul de proiect, atunci apăsați Ctrl + R pentru a vizualiza Panoul de proiect. Sau faceți clic pe pictograma barei de instrumente prezentată mai jos:
Panoul de proiect va afișa un proiect pentru fiecare registru de lucru Excel deschis și pentru fiecare supliment instalat. Faceți clic pe plusul gri de lângă numele registrului dvs. de lucru pentru a extinde proiectul pentru registrul dvs. de lucru. Apoi, faceți clic pe plusul gri de lângă folderul Obiecte Microsoft Excel pentru a extinde folderul obiect. Ar trebui să vedeți acum o intrare pentru fiecare foaie de lucru și o intrare numită ThisWorkbook.
Faceți clic dreapta pe intrarea pentru ThisWorkbook și selectați View Code din meniul pop-up.
Acum veți avea probabil un panou de cod alb alb, care ocupă partea dreaptă a ecranului. Există două meniuri derulante în partea de sus a panoului de cod care va spune (General) și (Declarații).
- Din meniul derulant din stânga, selectați Cartea de lucru.
- Meniul derulant din dreapta este acum completat cu toate evenimentele programabile asociate cu registrul de lucru. Aici sunt evenimente care vor rula codul de fiecare dată când registrul de lucru este deschis, activat, dezactivat etc. Astăzi, dorim să scriem cod în evenimentul BeforePrint, deci selectați BeforePrint din meniul derulant din dreapta.

Rețineți că de fiecare dată când selectați ceva din meniul derulant din dreapta, editorul VBA scrie linia de început și de sfârșit de cod în modulul de cod pentru dvs. Prima dată când modificați meniul derulant din stânga în Workbook, probabil că ați primit în mod implicit începuturile unui subprogram Workbook_Open. Dacă nu veți scrie o procedură Workbook_Open, ar trebui să luați în considerare ștergerea acestei proceduri goale.
Acum, treceți la scrierea codului VBA. Există câteva variabile utile pe care le puteți utiliza.
- ActiveWorkbook.Path va returna calea registrului de lucru. Ar putea arăta ca „C: Documentele mele MrExcel”.
- ActiveWorkbook.FullName va returna calea și numele fișierului registrului de lucru. Ar putea arăta ca „C: Documentele mele MrExcel Tip055 Sample.xls”.
Puteți atribui această variabilă să fie una din următoarele 6 poziții:
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
Iată trei exemple de macro-uri posibile.
Această macrocomandă va avea calea și numele fișierului adăugate ca subsolul drept al foii de lucru active:
Private Sub Workbook_BeforePrint(Cancel As Boolean) ActiveSheet.PageSetup.RightFooter = ActiveWorkbook.FullName End Sub
Această macrocomandă va avea calea adăugată ca antet stâng al Sheet1 și ca subsol central al Sheet2:
Private Sub Workbook_BeforePrint(Cancel As Boolean) Worksheets("Sheet1").PageSetup.LeftHeader = ActiveWorkbook.Path Worksheets("Sheet2").PageSetup.CenterFooter = ActiveWorkbook.Path End Sub
Dacă aveți tendința de a utiliza opțiunea „Întregul registru de lucru” la imprimare, această versiune va adăuga numele complet ca subsol central la toate colile:
Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each Sh In ActiveWorkbook.Worksheets Sh.PageSetup.CenterFooter = ActiveWorkbook.FullName Next Sh End Sub
Urmați unul dintre aceste exemple sau creați unul dintre propriile dvs. Când ați terminat, închideți editorul VBA cu Fișier> Închidere și Reveniți la Microsoft Excel.
De fiecare dată când imprimați o foaie de lucru, codul va rula și introduce calea curentă în antetul sau subsolul corespunzător pe care l-ați indicat în codul VBA.
Câteva note și avertismente:
-
Utilizatorii începători Excel nu vor avea prea puțină idee că acest cod se află în registrul de lucru. Când deschid registrul de lucru, pot primi avertismentul de securitate că fișierul conține macrocomenzi, dar nu va exista niciun avertisment atunci când codul VBA bate orice au avut ca subsol central și pune acolo calea. Acest lucru poate duce la arsuri la stomac. Imaginați-vă că peste 5 ani cineva vă folosește registrul de lucru, iar noul manager dorește ca numele fișierului să se deplaseze de la subsolul central la subsolul drept. Este posibil ca această persoană să știe să modifice manual setările din Fișier> Configurare pagină, dar dacă nu știu că codul este acolo, acesta le va face să fie mai multe, deoarece codul își schimbă continuu subsolurile.
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
Când apare o eroare în macrocomandă, evenimentele nu vor fi activate niciodată. Când se întâmplă acest lucru, există puține avertismente. Dacă bănuiți că gestionarele de evenimente nu sunt executate, accesați editorul de bază vizual. Apăsați Ctrl + g pentru a afișa un panou imediat. În panoul imediat, tastați:
Print Application.EnableEvents
și apasă pe Enter. Dacă descoperiți că acest lucru este setat la False, atunci tastați următoarea linie în panoul imediat:
Application.EnableEvents = True
și apasă pe Enter.
Mulțumesc Donna pentru o întrebare grozavă. În procesul de explicare a răspunsului, a fost o mare oportunitate de a extinde conceptul de gestionare a evenimentelor în VBA.