Renato fra Italia spør:
Hvordan kan jeg åpne en arbeidsbok i VBA ved å velge fra en liste? Når jeg tar opp en makro, koder den hardt navnet på den valgte filen i makroen.
Det er en kommando i VBA som heter GetOpenFileName. Den viser File Open-boksen. Du kan navigere til en katalog, velge filen og deretter klikke Åpne. På dette punktet åpner ikke kommandoen filen, den sender bare navnet tilbake til programmet ditt. Her er et eksempel på koden i bruk:
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 spør:
Hvordan kan jeg få en makro til å kjøre før en fil lukkes eller lagres?
Makroen må legges inn i kodepanelet tilknyttet "ThisWorkbook". Velg enten BeforeClose eller BeforeSave fra høyre rullegardin.
Ken skriver:
Jeg har et regneark hendelsesbehandler som løkker, minst 16 ganger. Hva skjer?
Kens behandler var enkel - hvis oppføringen var ikke-numerisk, ville den endre oppføringen til store bokstaver. Her er problemet. Da han endret verdien av oppføringen til store bokstaver, er det en annen regnearkendring, og hendelsen vil utløse igjen. Hver gang endringshendelsen ville utløse, endret Ken regnearket og makroen ble ringt rekursivt, til samtalestakken gikk tom for minne.
Løsningen er å midlertidig stoppe at hendelser kjører mens du endrer verdien til store bokstaver. Du kan gjøre dette ved å endre verdien på Application.EnableEvents til False. Her er den korrigerte makroen:
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 fra Storbritannia stiller dagens mest interessante spørsmål.
Jeg har en VBA-rutine i en arbeidsbok som lager flere andre arbeidsbøker. Jeg vil gjerne kunne legge til en hyperkobling i hver nye arbeidsbok dynamisk som vil peke tilbake til arbeidsboken som genererte de nye arbeidsbøkene.
Andy - dette er en kul ide. Uten fordelen med å se koden din, kan jeg forestille meg at noe slikt ville fungere:
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