Hallo Kerstin
Das Makro arbeitet in einer UserForm und die Ergebnisse aus der SQL Abfrage werden in eine Listbox geschrieben richtig? Funktioniert das Befüllen der Listbox? Denn dann ist der SQL Teil bereits abgehandelt und du kannst "einfach" die Items aus der Listbox in dein Word Dokument übernehmen. Du kannst auch die Listbox weglassen und direkt in das Word Dokument schreiben. Dafür musst Du den ersten geposteten Teil deines Makros so umbauen, dass der ganze With Me.lstResult-Block nicht in die Listbox, sondern in das Dokument schreibt.
Die Methode GetInfo() liefert den Wert True oder False zurück, wenn über den SQL-String Datensätze in der Datenbank gefunden wurden oder eben nicht. Den Datenbankzugriff selbst führt die Funktion auch aus. Deshalb wird vermutlich extra hervorgehoben, dass der Parameter varResult ByRef übergeben wird. Das bedeutet By Reference, während ByVal By Value bedeutet.
Kurze Erklärung:
ByRef ist default und wird automatisch gewählt, wenn nicht explizit ByVal hingeschrieben wird. Objekte können ausschließlich ByRef übergeben werden. By Reference bedeutet, es werden nicht die eigentlichen Daten einer Variable an eine Methode übergeben, sondern lediglich die Referenz, wo im Speicher diese Inhalte abgelegt sind. Wird innerhalb einer Methode schreibend mit so einer Referenz gearbeitet, wird der Inhalt so einer Variablen auch außerhalb der Methode verändert. In Deinem Fall wird also der Inhalt von varResult durch GetInfo() verändert. Es wird nämlich das Ergebnis der DB Abfrage reingeschrieben.
ByVal hingegen übergibt eine Kopie des Variableninhalts an eine Mathode. Wird z.B. eine 10 übergeben und innerhalb der Methode durch 2 geteilt, hat die Variable innerhalb der Methode den Wert 5. Außerhalb ist es aber eine andere Variable und der Inhalt bleibt 10.
Was ist nun varResult und warum ist der Datentyp Variant gewählt worden?
Die Variable varResult ist ein zweidimanesionales Array. Das siehst du an diesem Code-Fragment: UBound(m_varResult, 2). UBound() ist eine Funktion, die die obere Grenze eines Arrays zurückgibt. Der zweite Parameter (hier die 2) gibt die Dimension des Arrays an, von der die Grenze abgefragt werden soll. Es könnte auch ein 3 oder Mehrdimensionales Array sein. Aber es ist ein Zweidimensionales, weil aus der DB eine Tabelle erwartet wird, deren Zeilen halt in dieses Array geschrieben werden sollen.
Ist die DB Abfrage fertig, steht alles was Du möchtest in diesem Array (sofern der DB Zugriff erfolgreich war, was GetInfo() dir aber direkt mitteilt). Was ich eingangs über das Schreiben in die ListBox sagte, kannst du hier also erweitern auf ... Du brauchst nur die Inhalte dieses Arrays auslesen und kannst die hinschreiben wo Du willst.
Der Datentyp Variant erscheit erstmal komisch, denn aus der DB werden ja nur Zeichenketten geholt. Man könte also denken, ein Array vom Typ String wäre besser, weil man direkt sieht, womit man es zu tun hat. In der Theorie stimmt das, in der Praxis (von VBA) wird aber auf Variant zurückgegriffen, wenn nicht sicher ist, ob es wirklich nur Strings gibt, die das Makro versucht im Array unterzubringen oder mit For Each gearbeitet werden soll, um über alle Elemente des Arrays zu iterieren.
In deinem Fall bin ich nicht siocher, was die DB liefert, wenn es keine Ergebnisse für eine SQL Abfrage gibt. Evtl. wird da Null zurückgeliefert und das ist kein String, könnte aber in den Datentyp Variant geschrieben werden.
Vielleicht hilft dir die kleine Aufschlüsselung, was dein Makro eigentlich macht etwas weiter.
|