Bestanden selecteren in VBA - Excel-tips

Renato uit Italië vraagt:

Hoe kan ik een werkmap openen in VBA door uit een lijst te kiezen? Wanneer ik een macro opneem, wordt de naam van het geselecteerde bestand in de macro hard gecodeerd.

Er is een commando in VBA genaamd GetOpenFileName. Het toont het vak Bestand openen. U kunt naar een map navigeren, het bestand selecteren en op Openen klikken. Op dit punt opent de opdracht het bestand niet, maar geeft het alleen de naam terug aan uw programma. Hier is een voorbeeld van de gebruikte code:

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 vraagt:

Hoe kan ik een macro laten uitvoeren voordat een bestand wordt gesloten of opgeslagen?

De macro moet worden ingevoerd in het codepaneel dat is gekoppeld aan "ThisWorkbook". Selecteer in de rechter vervolgkeuzelijst BeforeClose of BeforeSave.

Ken schrijft:

Ik heb een gebeurtenishandler voor het werkblad die minstens 16 keer wordt herhaald. Wat is er aan de hand?

De handler van Ken was eenvoudig: als de invoer niet-numeriek was, zou de invoer in hoofdletters veranderen. Hier is het probleem. Toen hij de waarde van het item in hoofdletters veranderde, is dat weer een wijziging in het werkblad en zou de gebeurtenis opnieuw worden geactiveerd. Elke keer dat de wijzigingsgebeurtenis werd geactiveerd, veranderde Ken het werkblad en werd de macro recursief aangeroepen, totdat het geheugen van de oproepstapel opraakte.

De oplossing is om evenementen tijdelijk te stoppen terwijl u de waarde wijzigt in hoofdletters. U kunt dit doen door de waarde van Application.EnableEvents te wijzigen in False. Hier is de gecorrigeerde macro:

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 uit het VK stelt de meest interessante vraag van vandaag.

Ik heb een VBA-routine in één werkmap die verschillende andere werkmappen maakt. Ik zou in elke nieuwe werkmap dynamisch een hyperlink willen kunnen toevoegen die verwijst naar de werkmap die de nieuwe werkmappen heeft gegenereerd.

Andy - dit is een cool idee. Zonder het voordeel van het zien van uw code, kan ik me voorstellen dat zoiets zou werken:

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

Interessante artikelen...