Renato din Italia întreabă:
Cum pot deschide un registru de lucru în VBA alegând dintr-o listă? Când înregistrez o macrocomandă, codifică în mod dur numele fișierului selectat din macrocomandă.
Există o comandă în VBA numită GetOpenFileName. Se afișează caseta Deschidere fișier. Puteți naviga la un director, selectați fișierul și apoi faceți clic pe Deschidere. În acest moment, comanda nu deschide fișierul, ci doar transmite numele înapoi la programul dvs. Iată un exemplu de cod utilizat:
Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub
Roger întreabă:
Cum pot obține o macro pentru a rula înainte ca un fișier să fie închis sau salvat?
Macro-ul trebuie introdus în panoul de cod asociat cu „ThisWorkbook”. Din meniul derulant din dreapta, selectați BeforeClose sau BeforeSave.
Ken scrie:
Am un handler pentru evenimente de foaie de lucru care se repetă, de cel puțin 16 ori. Ce se întâmplă?
Manipulatorul lui Ken era simplu - dacă intrarea nu era numerică, aceasta ar schimba intrarea în majuscule. Iată problema. Când a schimbat valoarea intrării în litere mari, aceasta este o altă modificare a foii de lucru și evenimentul s-ar declanșa din nou. De fiecare dată când evenimentul de schimbare se declanșa, Ken schimba foaia de lucru și macro-ul se apelează recursiv, până când stiva de apeluri rămâne fără memorie.
Soluția constă în oprirea temporară a evenimentelor care rulează în timp ce schimbați valoarea cu majuscule. Puteți face acest lucru schimbând valoarea Application.EnableEvents la False. Iată macrocomanda corectată:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub
Andy din Marea Britanie pune cea mai interesantă întrebare de astăzi.
Am o rutină VBA într-un singur registru de lucru care creează alte câteva registre de lucru. Aș dori să pot adăuga în mod dinamic un hyperlink în fiecare registru de lucru nou, care să indice înapoi registrul de lucru care a generat noile registre de lucru.
Andy - aceasta este o idee grozavă. Fără avantajul de a vă vedea codul, îmi pot imagina că așa ar funcționa:
Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub