Excel VBA für Profis: Klassen (Konzepte)

CSV-Adressen per Klasse importieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Das Modul zum Import einer CSV-Datei lässt sich recht einfach in eine neue CSV-Import-Klasse übertragen, sodass weite Teile des vorhandenen Codes genutzt werden können.

Transkript

Ich möchte jetzt diese normale Prozedur in eine Klasse verwandeln. Theoretisch könnte ich die einfach so in einen Klassenmodul schreiben und wäre fertig, aber ein paar kleine mehr Fähigkeiten möchte ich schon einbauen. Dieses Modul ist noch umbenannt, das sollten wir also "modAdressenOhneKlassen" benennen und dann brauche ich ein neues Klassenmodul. Theoretisch könnte ich das rüberkopieren, aber das geht leichter, wenn ich Ihnen das einzeln neu erkläre. Also ein Klassenmodul, das werde ich "clsCSV" nennen, die Class für das CSV auslesen. Darin möchte ich mir merken den Namen und vor allem den Pfad dieser Datei, die ich da öffnen will, das soll also möglichst einheitlich werden für sowohl die CSV-Datei, als auch später für die Access-Datenbank. Also werde ich so eine Modul-öffentliche Variable erfinden, deswegen "m_strPfadDatei", damit ganz klar ist, hier steht Pfad-Unterteil drin, "As String" und das Hochkomma ist nur damit der Unterstrich gleich nicht verschwindet. Und als erstes brauche ich eine Property, damit ich mit einer Prozedur diesen Inhalt, diese Variable füllen kann, also eine Let-Property, "property Let" und die heißt auch "PfadDatei" und übergibt "strPfadDatei" als Argument und macht nichts anders, als diese Modul-öffentliche Variable mit dem Inhalt des Arguments zu füllen. Diese Property ist so ganz typisch für solche Klassenmodule, Sie geben von außen was rein mit einer Prozedur und dann merkt sich das Modul auch die Instanz dieser Klasse, merkt sich dann diesen Wert, den werden wir später brauchen. Dann braucht es, und zwar vorbeugend später, für Access noch eine Prozedur, die heißt "Daten öffnen", die hier nichts tut, deswegen kommt sie trotzdem vor, damit es einheitlich ist, das ist vorübergehend egal, aber langfristig wichtig, damit ich mich nicht wundere, wird diese Prozedur bei mir so gekennzeichnet, die tut nichts, die will nur spielen, wie das immer so schön heißt. Und die eigentliche Function, die ich jetzt habe, heißt "Datensatz" und soll einen zurückliefern, und zwar nicht wie bisher den ersten, wie langweilig, sondern einen beliebigen. Also will ich eine Nummer "As Long", da kann ich eingeben und kriege zurück einen String mit einer kompletten Adresse. Jetzt wird es erstmal wieder ähnlich sein, wie eben, ich kann also so ein bisschen was rüberkopieren, ich brauche ein paar Variablen, die kopiere ich mir mal schnell hier rein, das ist reine Schreibarbeit, wieder "Variant" für die Zeile, damit ich es zerlegen kann, "String" für die Zeile, damit ich die erstmal holen kann, einen Kanal brauche ich und einen Zeller für die Zeile, das ist neu. Und wiederum "lngKanal=FreeFile", auch wenn da fast immer die Nummer 1 zurückgegeben wird als freie Kanalnummer, und jetzt ist ähnlich, wie eben "open" Pfad- und Dateiname, aber ich kann den nicht wirklich angeben, sondern ich weiß, er steht in dieser String-Variable, Modul-öffentlich und muss vorher übergeben worden sein. Da könnte man noch ganz viele Prüfungen einbauen, ob das Ding vielleicht gerade ein Leerstring ist, dann breche ich ab und Ähnliches. Ich mache es möglichst einfach, es geht hier um die Klassen und nicht um die Fehler-Behandlung, der Rest ist hier so, wie wenn ich das zu Fuß geöffnet hätte, so wie das die einzelne CSV-Prozedur hatte. Hier ist jetzt die Textdatei geöffnet. Jetzt kommt der erste Unterschied, ich will diese Textdatei lesen in einer Schleife, deswegen eine "Do until" Schleife, bis zum Ende, "End of File" heißt das, nämlich von dem Kanal, damit ich es nicht vergesse, schreibe ich hier schon mal ein "Loop" hin und als erstes Zelle ich die Zeile mit. "lngZeile=lngZeile+1", die fängt, weil es eine deklarierte Zeilenvariable ist, mit "0" an, wird jetzt also auf "1" gesetzt. Und dann lese ich ein mit "Input", was gerade im Kanal ankommt, und das wird in "strZeile" reingeschrieben. Die erste Zeile ist die Titelzeile, die will ich gar nicht haben und ich will jetzt so lange lesen, bis meine Long-Nummer erreicht ist. Die Titelzeile werde ich ignorieren, also frage ich einfach, ob die Long-Zeile gleich Long-Nummer, das ist die Nummer, die ich zum Suchen gefunden habe, "+1" und ich schreibe mal dazu "wegen Titelzeile", +1 nämlich, wenn ich diese Zeile gefunden habe, da muss natürlich ein "then" dahinter, dann passiert irgendwas. Und bis dahin wird wegen dieser Zeile zeilenweise eingelesen. Jetzt habe ich meine Trefferzeile, also "varZeile=split" und strZeile zerlegt, als zweites Argument der Delimiter, mit einem Semikolon. Ich habe jetzt aus strZeile ausgelesen, sodass ich in varZeile einzeln als Array jetzt auf die Elemente zugreifen kann. Und das ist jetzt wieder ein bisschen Schreibarbeit, die ich mir schenken möchte, ich kann also hier jetzt, wie eben auch schon mal das einfach auslesen, die Function heißt jetzt anders, die heißt Datensatz, aber das, was hier steht, ist im Wesentlichen noch das Gleiche. Und weil ich getroffen habe, ich bin jetzt in der richtigen Zeile und zufrieden, kommt hier ein "Exit Do", dann muss ich mir den Rest der Textdatei nicht mehr angucken, das bringt ja nichts, ich habe ja schon alles gefunden. Und da kommt noch ein "close", aber ein richtig geschriebenes für den Long-Kanal. Wenn man das vergisst und die Prozedur abbricht beispielsweise, dann ist diese Datei auch schon mal blockiert, dann muss man, wenn Ihnen das passiert, einfach oben alle Variablen zurücksetzen. Jetzt muss ich noch sicherstellen, dass das Ganze mit Compilieren in Ordnung ist, und damit habe ich jetzt sozusagen die Einzelprozedur, das, was bei Adressen ohne Klassen hier passiert, übersetzt in eine Klasse, die allerdings mehr kann, ansonsten ist die erkennbar sehr ähnlich, die ist im Pfad "Dateibereich" flexibel und die ist nicht beschränkt auf die erste Zeile, sondern ich kann jede Zeile, wenn sie denn drin vorkommt, auslesen. Die Klasse "CSV" kann alles, jetzt muss ich sie nur noch testen.

Excel VBA für Profis: Klassen (Konzepte)

Verbessern Sie Ihren VBA-Code durch Klassenprogrammierung.

1 Std. 35 min (21 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Exklusiv für Abo-Kunden
Erscheinungsdatum:28.03.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!