Excel-VBA Aktuell zu Excel 2010 BERND HELD
Auf Arbeitsmappen zugreifen Datei-Operationen Listing 4.2: Den Dialog Öffnen anzeigen Sub ArbeitsmappeÖffnenDialog() Dim DatOP As Variant DatOP = Application.GetOpenFilename("Excel-Dateien(*.xl*),*.xl*") If DatOP = False Then Exit Sub Workbooks.Open Filename:=DatOP Geben Sie bei der Methode GetOpenFilename den Filter an, nachdem Dateien im Dialog ÖFFNEN angezeigt werden. Da Sie Excel-Dateien im Dialog anzeigen möchten, geben Sie die Endung xl* an. Darunter fallen dann herkömmliche Arbeitsmappen aus den»alt-versionen«von Excel sowie die neuen Formate mit den Endungen xlsx und xlsm. Nach dem Aufruf des Dialogs müssen Sie prüfen, ob der Dialog ÖFFNEN mit der Schaltfläche ABBRECHEN wieder verlassen wurde. In diesem Fall wird in der Variablen DatOP der Wert False zurückgegeben, was mit einem Verlassen des Makros über die Anweisung Exit Sub quittiert wird. Im anderen Fall öffnen Sie mithilfe der Methode Open die ausgewählte Arbeitsmappe, die in der Variablen DatOP verzeichnet ist. Abbildung 4.1: Der Dialog Öffnen 178
Arbeitsmappen öffnen Über denselben Dialog haben Sie auch die Möglichkeit, mehrere Excel-Arbeitsmappen auf einmal zu öffnen. Für diesen Zweck müssen Sie das Makro aus Listing 4.2 ein wenig umschreiben. Listing 4.3: Mehrere Mappen können im Dialog Öffnen markiert werden. Sub ArbeitsmappenÖffnenDialog() Dim intdat As Integer Dim DatOP As Variant intdat = 0 DatOP = Application.GetOpenFilename _ ("Excel-Dateien(*.xl*),*.xl*", MultiSelect:=True) If IsArray(DatOP) Then Else For intdat = LBound(DatOP) To UBound(DatOP) Workbooks.Open DatOP(intDat) Next intdat End If MsgBox "Sie haben keine Arbeitsmappe ausgewählt" Zeigen Sie den Dialog ÖFFNEN an, indem Sie die Methode GetOpenFileName einsetzen. Damit Sie die Möglichkeit haben, mehrere Arbeitsmappen im Dialog über die Taste (Strg) zu markieren, müssen Sie hierbei das Argument MultiSelect auf den Wert True setzen. Im nächsten Schritt müssen Sie überprüfen, ob überhaupt wenigstens eine Arbeitsmappe im Dialog ÖFFNEN markiert wurde. Wenn ja, dann meldet die Funktion IsArray den Wert True. In diesem Fall stehen die markierten Namen der Arbeitsmappen im Datenfeld DatOP. Dieses Datenfeld wird anschließend über den Einsatz einer Schleife abgearbeitet. Dabei repräsentiert die Funktion LBound den ersten Eintrag im Datenfeld DatOP (die erste markierte Arbeitsmappe) und die Funktion UBound den letzten Eintrag im Datenfeld DatOP (letzte markierte Arbeitsmappe). Innerhalb dieser Schleife wenden Sie die Methode Open an, um die markierten Arbeitsmappen nacheinander zu öffnen. Über die Zählvariable sprechen Sie dabei eine Arbeitsmappe nach der anderen an. 179
Auf Arbeitsmappen zugreifen Datei-Operationen Abbildung 4.2: Den Dialog Öffnen mit Mehrfachauswahl anzeigen 4.1.3 Geöffnete Arbeitsmappen identifizieren Gerade wenn Sie mit mehreren geöffneten Arbeitsmappen arbeiten, dann müssen Sie genau wissen, welche Arbeitsmappen derzeit geöffnet sind. Im folgenden Makro werden alle zurzeit geöffneten Arbeitsmappen in einem Meldungsfenster am Bildschirm angezeigt: Listing 4.4: Alle geöffneten Arbeitsmappen im Überblick Sub MappenGeöffnetErmitteln() Dim Mappe As Workbook Dim strname As String For Each Mappe In Workbooks strname = Mappe.Name & Chr(13) & strname Next Mappe MsgBox "Folgende Mappen sind derzeit geöffnet: " & _ Chr(13) & strname, vbinformation + vbokonly Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ WorkBook und eine Variable vom Typ String, die die Namen der geöffneten Arbeitsmappen aufnehmen soll. Danach setzen Sie eine Schleife auf und arbeiten alle geöffneten 180
Arbeitsmappen speichern Arbeitsmappen ab. Diese werden Ihnen über das Auflistungsobjekt Workbooks zur Verfügung gestellt. Speichern Sie die Namen der Arbeitsmappen mithilfe der Eigenschaft Name in der String-Variablen s. Nach jedem ermittelten Namen erzeugen Sie über die Anweisung Chr(13) eine neue Zeile. Nach dem Verlassen der Schleife geben Sie die ermittelten Namen der geöffneten Arbeitsmappen am Bildschirm aus. Abbildung 4.3: Diese Arbeitsmappen sind derzeit geöffnet. Bei dieser Lösung werden auch ausgeblendete Arbeitsmappen wie die Mappe PERSONL.XLSB aufgelistet. Die Mappe PERSONL.XLSB ist die zentrale Makroarbeitsmappe, in der Sie Makros ablegen können, die Sie auch für alle anderen Arbeitsmappen gebrauchen können. 4.2 Arbeitsmappen speichern Beim Speichern einer Arbeitsmappe müssen Sie wissen, wo Sie die Mappe speichern möchten. Dazu verwenden Sie die ChDrive-Anweisung, um das Laufwerk zu bestimmen, sowie die Anweisung ChDir, um das richtige Verzeichnis einzustellen. Jetzt fehlt nur noch der Name. Im folgenden Beispiel speichern Sie eine Arbeitsmappe. Listing 4.5: Eine Arbeitsmappe speichern Sub ArbeitsmappeSpeichern() Dim strname As String Const Pfad = "c:\daten" strname = ActiveWorkbook.Name ActiveWorkbook.SaveAs Filename:=Pfad & strname, FileFormat:= _ 181
Auf Arbeitsmappen zugreifen Datei-Operationen xlnormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=True Die Syntax der Methode SaveAs lautet: ActiveWorkbook.SaveAs(Filename, FileFormat, Password, _ WriteResPassword, ReadOnlyRecommended, CreateBackup, _ AddToMru, TextCodePage, TextVisualLayout, Local) Das Argument FileName haben Sie im Makro aus Listing 4.5 in der Variablen str- Name über die Eigenschaft Name ermittelt. Beim Argument FileFormat können Sie angeben, in welchem Format Sie Ihre Mappe speichern möchten. Mit dem nächsten Argument Password können Sie ein Passwort festlegen, das der Anwender beim Öffnen der Datei eingeben muss, um die Datei laden zu können. Im Beispiel aus Listing 4.5 wurde eine Leerzeichenfolge übergeben, was bedeutet, dass kein Passwort beim Öffnen der Datei abgefragt wird. Das Argument WriteResPassword sorgt dafür, dass ein Kennwort für die Schreiberlaubnis der Datei eingegeben werden muss. Auch hier wurde eine Leerzeichenfolge übergeben, was so viel bedeutet, dass beim Öffnen der so gespeicherten Arbeitsmappe kein Passwort eingegeben werden muss. Das Argument ReadOnlyRecommended setzen Sie auf True, wenn beim Öffnen der Datei in einer Meldung empfohlen werden soll, die Datei mit Nur-Lese-Zugriff zu öffnen. Belassen Sie das Argument auf dem Wert False, unterbleibt diese Meldung. Das Argument CreateBackup setzen Sie auf den Wert True, wenn Excel von der Mappe eine Sicherungskopie anlegen soll. Excel legt dann eine Sicherungskopie unter demselben Namen mit dem Zusatz SICHERUNGSKOPIE VON... und der Endung WLK an. Die übrigen Argumente sind in der Praxis nicht so relevant und werden an dieser Stelle nicht weiter beschrieben. Eine Beschreibung können Sie aber in der Online-Hilfe nachlesen. 4.2.1 Arbeitsmappe speichern über Dialog Genauso wie schon beim Öffnen einer Arbeitsmappe beschrieben, gibt es in VBA auch eine Methode, um den Dialog SPEICHERN UNTER anzuzeigen. Diese Methode heißt GetSaveAsFilename. Im folgenden Beispiel wird die momentan aktive Arbeitsmappe im Dialog SPEI- CHERN UNTER angezeigt. 182
Arbeitsmappen speichern Listing 4.6: Eine Arbeitsmappe im Dialog Speichern unter anzeigen Sub ArbeitsmappeSpeichernDialog() Dim DATCl As Variant DATCl = Application.GetSaveAsFilename _ (, "Excel-Dateien (*.xl*),*.xl*") If DATCl = False Then Else ActiveWorkbook.SaveAs ActiveWorkbook.Path & "\" & _ ActiveWorkbook.Name End If Bevor Sie den Dialog SPEICHERN UNTER aufrufen, sorgen Sie dafür, dass das gewünschte Laufwerk bzw. das Verzeichnis aktiviert wird. Setzen Sie dazu die Anweisungen ChDrive und ChDir ein. Danach rufen Sie über die Methode GetSaveAsFilename den Dialog SPEICHERN UNTER auf. Als Filter stellen Sie die Excel-Dateien mit der Endung xls ein. Vor diesem Filter haben Sie die Möglichkeit, einen Namen bereits vorzugeben. Im Beispiel aus Listing 4.6 wurde bewusst darauf verzichtet, um den Dateinamen von Excel selbst vorschlagen zu lassen. Abbildung 4.4: Arbeitsmappe speichern 183
Auf Arbeitsmappen zugreifen Datei-Operationen Im folgenden Beispiel aus Listing 4.7 werden Sie selbst einen Namen für die Arbeitsmappe festlegen sowie die Mappe im herkömmlichen Excel-Format speichern: Listing 4.7: Einen eigenen Namen bestimmen Sub EigenerNamen() Dim DATCl As Variant DATCl = Application.GetSaveAsFilename _ ("NEUEDATEI.XlS", "Excel-Dateien (*.xls),*.xls") If DATCl = False Then Else ActiveWorkbook.SaveAs DATCl End If In beiden Makros aus Listing 4.6 und Listing 4.7 müssen Sie dann prüfen, ob nicht eventuell auch die Schaltfläche ABBRECHEN geklickt wurde. In diesem Fall würde die Variable DATCl den Wert False zurück melden. Andernfalls speichern Sie die Arbeitsmappe, indem Sie die Methode Save anwenden. Abbildung 4.5: Den Dialog Speichern unter mit voreingestelltem Namen aufrufen 184
Arbeitsmappen speichern 4.2.2 Alle geöffneten Arbeitsmappen speichern Im nächsten Beispiel sollen alle derzeit geöffneten Arbeitsmappen gespeichert werden. Das Makro für diese Aufgabe lautet: Listing 4.8: Alle geöffneten Arbeitsmappen speichern Sub AlleMappenSpeichern() Dim Mappe As Workbook For Each Mappe In Workbooks Mappe.Save Next Mappe Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ WorkBook. Danach setzen Sie eine Schleife auf und arbeiten alle geöffneten Arbeitsmappen ab. Innerhalb der Schleife setzen Sie die Methode Save ein, um die Arbeitsmappen zu speichern. 4.2.3 Arbeitsmappe speichern unter Datum/Uhrzeit Möchten Sie für Arbeitsmappen das aktuelle Tagesdatum sowie die momentane Uhrzeit als Dateinamen verwenden, dann können Sie das folgende Makro dafür einsetzen, nachdem Sie sicherstellen, dass der im Listing angegebene Pfad bei Ihnen auch verfügbar ist. Listing 4.9: Arbeitsmappe mit Datum/Uhrzeit benennen Sub MappeSpeichernMitDatumUndUhrzeit() Const LW = "C:\" Const Pfad = "C:\Daten" ChDrive LW ChDir Pfad ActiveWorkbook.SaveAs _ (Date & "_" & Hour(Time) & "_" & Minute(Time) & ".xls") 185
Auf Arbeitsmappen zugreifen Datei-Operationen Das aktuelle Tagesdatum für den Dateinamen bekommen Sie über die Funktion Date. Da im Dateinamen kein Doppelpunkt (Uhrzeit z.b. 12:30) vorkommen darf, müssen Sie die Zeitangabe mit den Funktionen Hour sowie Minute extrahieren und neu zusammensetzen. Abbildung 4.6: Die Arbeitsmappe nach Datum und Uhrzeit benennen 4.2.4 Arbeitsmappe bedingt speichern Eine Arbeitsmappe sollte nur dann gespeichert werden, wenn Änderungen an ihr vorgenommen wurden. Wenn Sie wissen möchten, ob Änderungen in der Arbeitsmappe seit dem letzten Öffnen der Arbeitsmappe gemacht wurden, sei es durch Verknüpfungen oder Benutzereingaben, dann steht Ihnen hierfür eine Eigenschaft namens Saved zur Verfügung. Sehen Sie sich nun das folgende Listing 4.10 an. Listing 4.10: Prüfung durchführen, ob Arbeitsmappe geändert wurde Sub ÄnderungArbeitsmappe() If ActiveWorkbook.Saved = False Then MsgBox "Die Mappe wurde geändert!" ActiveWorkbook.Save Else MsgBox "Arbeitsmappe ist unverändert!" End If Die Eigenschaft Saved liefert den Wert True, wenn die aktive Arbeitsmappe seit der letzten Speicherung nicht mehr geändert wurde. Gibt die Eigenschaft den Wert False zurück, wurden Änderungen an der Arbeitsmappe vorgenommen. 186
Arbeitsmappen schließen 4.3 Arbeitsmappen schließen Für das Schließen einer Arbeitsmappe steht Ihnen die Methode Close zur Verfügung. Wenn Sie eine Arbeitsmappe wieder schließen möchten, dann müssen Sie standardmäßig eine Meldung mit Ja bestätigen, wenn Sie Änderungen an der Mappe durchgeführt haben. Diese Meldung können Sie aber unterdrücken, wenn Sie in der Methode Close ein zusätzliches Argument angeben. 4.3.1 Arbeitsmappe schließen Änderungen speichern Im folgenden Beispiel wird die aktive Arbeitsmappe ohne weitere Rückfrage geschlossen. Die Änderungen in der Mappe werden dabei mit gesichert. Listing 4.11: Aktive Mappe schließen Änderungen speichern Sub ArbeitsmappeSchließen() ActiveWorkbook.Close SaveChanges:=True Die Methode Close schließt die Arbeitsmappe. Wird das Argument SaveChanges auf den Wert True gesetzt, werden Änderungen an der Arbeitsmappe gespeichert. 4.3.2 Arbeitsmappe schließen Änderungen verwerfen Demzufolge können Sie eine Arbeitsmappe schließen und die Änderungen an dieser Arbeitsmappe verwerfen, indem Sie folgendes Makro aus Listing 4.12 starten: Listing 4.12: Aktive Mappe schließen Änderungen verwerfen Sub ArbeitsmappeSchließenÄnderungenVerwerfen() ActiveWorkbook.Close SaveChanges:=False 187
Copyright Daten, Texte, Design und Grafiken dieses ebooks, sowie die eventuell angebotenen ebook-zusatzdaten sind urheberrechtlich geschützt. Dieses ebook stellen wir lediglich als persönliche Einzelplatz-Lizenz zur Verfügung! Jede andere Verwendung dieses ebooks oder zugehöriger Materialien und Informationen, einschliesslich der Reproduktion, der Weitergabe, des Weitervertriebs, der Platzierung im Internet, in Intranets, in Extranets, der Veränderung, des Weiterverkaufs und der Veröffentlichung bedarf der schriftlichen Genehmigung des Verlags. Insbesondere ist die Entfernung oder Änderung des vom Verlag vergebenen Passwortschutzes ausdrücklich untersagt! Bei Fragen zu diesem Thema wenden Sie sich bitte an: info@pearson.de Zusatzdaten Möglicherweise liegt dem gedruckten Buch eine CD-ROM mit Zusatzdaten bei. Die Zurverfügungstellung dieser Daten auf unseren Websites ist eine freiwillige Leistung des Verlags. Der Rechtsweg ist ausgeschlossen. Hinweis Dieses und viele weitere ebooks können Sie rund um die Uhr und legal auf unserer Website http://www.informit.de herunterladen