Renato från Italien frågar:
Hur kan jag öppna en arbetsbok i VBA genom att välja från en lista? När jag spelar in ett makro kodar det namnet på den valda filen i makrot.
Det finns ett kommando i VBA som heter GetOpenFileName. Den visar rutan File Open. Du kan navigera till en katalog, välja filen och klicka sedan på Öppna. Vid denna tidpunkt öppnar inte kommandot filen, det skickar bara namnet tillbaka till ditt program. Här är ett exempel på koden som används:
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 frågar:
Hur kan jag få ett makro att köras innan en fil stängs eller sparas?
Makrot måste anges i kodfönstret som är associerat med "ThisWorkbook". Välj antingen BeforeClose eller BeforeSave från den högra rullgardinsmenyn.
Ken skriver:
Jag har en händelsehanterare för kalkylblad som slingrar, minst 16 gånger. Vad händer?
Kens handlare var enkel - om posten var icke-numerisk skulle det ändra posten till versaler. Här är problemet. När han ändrade postens värde till versaler, är det en annan ändring av kalkylbladet och händelsen skulle utlösa igen. Varje gång ändringshändelsen skulle utlösas ändrade Ken kalkylbladet och makrot blev rekursivt tills samtalsstapeln tog slut på minnet.
Lösningen är att tillfälligt stoppa händelser från att köras medan du ändrar värdet till versaler. Du kan göra detta genom att ändra värdet på Application.EnableEvents till False. Här är det korrigerade makrot:
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 från Storbritannien ställer dagens mest intressanta fråga.
Jag har en VBA-rutin i en arbetsbok som skapar flera andra arbetsböcker. Jag skulle vilja kunna dynamiskt lägga till en hyperlänk i varje ny arbetsbok som pekar tillbaka till arbetsboken som genererade de nya arbetsböckerna.
Andy - det här är en cool idé. Utan fördelen med att se din kod kan jag föreställa mig att något liknande skulle fungera:
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