Renato aus Italien fragt:
Wie kann ich eine Arbeitsmappe in VBA öffnen und aus einer Liste auswählen? Wenn ich ein Makro aufzeichne, wird der Name der ausgewählten Datei im Makro fest codiert.
In VBA gibt es einen Befehl namens GetOpenFileName. Es wird das Feld Datei öffnen angezeigt. Sie können in ein Verzeichnis navigieren, die Datei auswählen und dann auf Öffnen klicken. Zu diesem Zeitpunkt öffnet der Befehl die Datei nicht, sondern gibt lediglich den Namen an Ihr Programm zurück. Hier ist ein Beispiel für den verwendeten 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 fragt:
Wie kann ich ein Makro ausführen lassen, bevor eine Datei geschlossen oder gespeichert wird?
Das Makro muss in den Codebereich eingegeben werden, der "ThisWorkbook" zugeordnet ist. Wählen Sie in der rechten Dropdown-Liste entweder BeforeClose oder BeforeSave aus.
Ken schreibt:
Ich habe einen Arbeitsblatt-Ereignishandler, der mindestens 16 Mal wiederholt wird. Was ist los?
Kens Handler war einfach - wenn der Eintrag nicht numerisch war, wurde der Eintrag in Großbuchstaben geändert. Hier ist das Problem. Wenn er den Wert des Eintrags in Großbuchstaben ändert, ist dies eine weitere Änderung des Arbeitsblatts, und das Ereignis wird erneut ausgelöst. Jedes Mal, wenn das Änderungsereignis ausgelöst wurde, änderte Ken das Arbeitsblatt und das Makro wurde rekursiv aufgerufen, bis der Aufrufstapel keinen Speicher mehr hatte.
Die Lösung besteht darin, die Ausführung von Ereignissen vorübergehend zu stoppen, während Sie den Wert in Großbuchstaben ändern. Sie können dies tun, indem Sie den Wert von Application.EnableEvents in False ändern. Hier ist das korrigierte Makro:
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 aus Großbritannien stellt die interessanteste Frage von heute.
Ich habe eine VBA-Routine in einer Arbeitsmappe, die mehrere andere Arbeitsmappen erstellt. Ich möchte in der Lage sein, jeder neuen Arbeitsmappe dynamisch einen Hyperlink hinzuzufügen, der auf die Arbeitsmappe verweist, die die neuen Arbeitsmappen generiert hat.
Andy - das ist eine coole Idee. Ohne den Vorteil, Ihren Code zu sehen, kann ich mir vorstellen, dass so etwas funktionieren würde:
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