Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Tutorials

ADO und Excel (1) - Kleines Vorwort und Einstieg

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: 2011-06Gruppenthema: 9 Folgen 1 2 3 4 5 6 7 8 9 Sie sind in Folge:1

ADO und Excel(1) - Kleines Vorwort und Einstieg

ADO steht für ActiveX Data Objects und was auch immer dies bedeuten mag, ist mir völlig Wurscht.
Von mir aus könnte das auch für Alle Daumen Oben stehen, denn man kann wirklich viel mit machen.

Und wenn ich hier auch viel aus dem Nähkästchen plaudere und Ihnen ein wenig die Hand führen will, so kann und will ich natürlich keinen Datenbankkurs hier geben und nicht auf die vielen kleinen Nickligkeiten eingehen, die sich dahinter verbergen. Etwas SQL Kenntnisse sind ganz nützlich, wobei man sich viele Konstrukte tatsächlich einfach über Access holen kann.

Mein Ziel ist es, Sie für die Möglichkeiten mit ADO zu sensibilisieren und Sie dazu ermutigen, Experimente zu starten.
Aber ich gehe auch davon aus, dass Sie in VBA gut zu Hause sind und Umgang mit Range etc... setze ich absolut vorraus. Dies soll nur eine Einführung in die wunderbare Welt der ADO Excel Kombination sein.

Vorbereitung erste Tests

Erstellen Sie eine Arbeitsmappe mit dem Namen Ado1a.xls.
In dieser Mappe soll eine Tabelle sein mit dem Namen Quelle.
Diese soll so aussehen:
 ABC
1   
2 ArtikelWert
3 Zange17
4 Hammer11
5 Zange27
6 Hammer28
7 Zange12
8 Hammer27
9 Zange20
10 Hammer19
11 Zange11
12 Hammer22
13 Zange29

Speichern Sie nun diese Arbeitsmappe noch mal unter dem Namen Ado1b.xls.
Und weil es so schön war, nochmals unter dem Namen Ado1c.xls
Wir haben also die Arbeitsmappe 3 mal (Im selben Ordner). Schließen Sie nun die 1c und öffnen Sie die beiden anderen Mappen.
Also 1a und 1b sollen geöffnet sein!

Erstes Kennenlernen und Early - Late

Erzeugen Sie nun in der 1a Mappe ein allgemeines Modul. Benennen Sie es mdlAdoEarly.
Nun gehen Sie unter Extras Verweise und haken dort die höchste Version der Microsoft ActiveX Data Objects Library an,
dies könnte z.B. sein: Microsoft ActiveX Data Objects 2.7 Library sein.
Fügen Sie nun nachfolgende Prozedur ein:

Hinweis

AB Excel 2007 schreiben Sie überall im Code (auch in den nachfolgenden Artikeln) anstatt:

sAdoConnectString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sPfad
den Ausdruck:
sAdoConnectString = "Provider=Microsoft.ACE.OLEDB.12.0; Extended Properties='Excel 12.0 Xml;HDR=YES';Data Source=" & sPfad

Vielen Dank für diesen Hinweis von Jochen Seyffert

	
Public Sub EarlyAdoTest()
	Dim oAdoConnection As New ADODB.Connection
	Dim oAdoRecordset As New ADODB.Recordset
	Dim sAdoConnectString As String, sPfad As String
	Dim sQuery As String
	On Error GoTo Fehler
	sPfad = ThisWorkbook.FullName
	sAdoConnectString = _
	"DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sPfad
	oAdoConnection.Open sAdoConnectString
	sQuery = "Select Max ([Wert]) from [Quelle$] where Artikel='Hammer'"
	With oAdoRecordset
		.Source = sQuery
		.ActiveConnection = oAdoConnection
		.Open
		MsgBox .Fields(0).Value
	End With
	Aufraeumen:
	On Error Resume Next ' Sehr Faul
	oAdoRecordset.Close
	oAdoConnection.Close
	Set oAdoRecordset = Nothing
	Set oAdoConnection = Nothing
	Exit Sub
	Fehler:
	MsgBox "Fehler: " & Err.Description
	Resume Aufraeumen
End Sub

Codeanalyse

Ich gehe mal stark davon aus, dass Sie die Sub mal durchlaufen haben lassen und eine geniale Msgbox ist erschienen mit der Ausgabe 28. Wir haben uns den höchsten Wert von Hammer ausgeben lassen. Ist doch ein Hammer - oder?
(Und wer jetzt vorlaut meint, dass man dies ja auch mit einfachsten Excelfunktionen hätte erledigen können, der hat Recht und kann - so er will - jetzt hier abbrechen und lieber ein Bier trinken gehen. Aber im Laufe dieses Tutorials wird es einige Dinge geben, die man nicht so einfach mit Funktionen erledigen kann und dann ist der Biertrinker aber blöd dran )

Kommen wir zu unserer ersten Deklarationszeile. Hier erstellen wir zwei Objekte, die Verbindung zu ADODB und ein Recordset von ADODB. Das wir dies in dieser Weise so tun können, liegt an unserer Vorarbeit, die ActiveX Data Objects in den Verweisen angehakt zu haben.
Wir haben hier ein Early Binding, und uns stehen die Eigenschaften und Methoden direkt beim Tippen danach zur Verfügung.

Um auf eine Mappe zugreifen zu können, brauche ich ihren kompletten Pfad - in unserem Fall verweisen wir auf die gleiche Mappe.
In den nächsten zwei Schritten wird die Verbindung zu ADODB mit unserer Mappe hergestellt.

Jetzt kommt der eigentlich interessante Teil, nämlich der SQL, der Abfragestring.
Schauen wir uns erst den from Part an:
from [Quelle$]
Wir erkennen hier unseren Tabellennamen wieder aber Achtung: Vergessen Sie nicht das Dollarzeichen hinter dem Namen und vor allem auch nicht die eckigen Klammern.
Select ist einfach nur ein SQL Ausdruck und bedeutet soviel wie wähle.
Max([Wert])

Hier benutzen wir die Datenbankfunktion Max, die genauso ist wie unsere Max Funktion in Excel.
Wert ist unsere Spaltenüberschrift - haben Sie sicherlich gleich erkannt. Auch hier in eckigen Klammern gesetzt.
Diese könnte man weglassen, sollte man aber niemals tun, denn wenn die Spaltenüberschrift Leerzeichen oder ähnliches enthält, dann gibt es sonst Probleme.
Und hinten haben wir noch eine Where Klausel, die ist aber sicherlich einfach zu verstehen, beachten Sie aber die einzelnen Apostrophe.
Letztendlich sagen wir nur:
Gib mir den größten Wert von Hammer zurück. Ganz simpel.

Im weiteren folgen Techniken, um das Recordset zu kreieren. Wie schon gesagt, einen ADO Kurs gibt es hier nicht, aber im Netzt gibt es viele Informationen zu ADO.

Unser Recordset, dass wir hier aufgebaut haben, hat nur eine Zeile und eine Spalte und ich greife mir über das Feld 0 einfach den Wert ab.

Ich habe bewusst am Anfang ein so simples Beispiel gewählt, weil es mir hier in der Einführung noch nicht um Recordsets und die Rückgaben geht, sondern um die Grundtechniken.
In den Folgebeiträgen gehe ich da noch näher darauf ein.



Wir wollen uns nun der zweiten Arbeitsmappe zuwenden, also der 1b!
Sie können die Arbeitsmappe 1a schließen, wenn Sie wollen.
Tatsächlich werden wir jetzt das Gleich nochmal machen, mit ein paar winzigen Änderungen aber ungeheurer Auswirkung.

Fügen Sie wieder ein allgemeines Modul ein. Diesmal verzichten wir aber auf unsere Extras Verweise und gehen anders an die Sache heran:
 Peter Haserodt
  • Formelhilfe
  • Makroentwicklung
  • VBA-Programmierung
  • + + + + + + + + +

Public Sub LateAdoTest()
Dim oAdoConnection As Object, oAdoRecordset As Object
Dim sAdoConnectString As String, sPfad As String
Dim sQuery As String
On Error GoTo Fehler
sPfad = ThisWorkbook.FullName
Set oAdoConnection = CreateObject("ADODB.CONNECTION")
sAdoConnectString = _
 "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sPfad
oAdoConnection.Open sAdoConnectString
Set oAdoRecordset = CreateObject("ADODB.RECORDSET")
sQuery = "Select Max ([Wert]) from [Quelle$] where Artikel='Hammer'"
With oAdoRecordset
	.Source = sQuery
	.ActiveConnection = oAdoConnection
	.Open
	MsgBox .Fields(0).Value
End With
Aufraeumen:
On Error Resume Next ' Sehr Faul
oAdoRecordset.Close
oAdoConnection.Close
Set oAdoRecordset = Nothing
Set oAdoConnection = Nothing
Exit Sub
Fehler:
MsgBox "Fehler: " & Err.Description
Resume Aufraeumen
End Sub

Codeanalyse

Auf den ersten Blick sieht das ganz ähnlich aus.
Beachten Sie aber, dass nun oben unsere zwei Variablen als Object deklariert sind.
Wir haben nun kein Early Binding mehr, da wir den Verweis auf ADO nicht gesetzt haben.
Deshalb brauchen wir im folgenden Code aber auch eine Möglichkeit, unsere Objektvariblen auf ADODB anzusetzen.
Dies machen wir in den beiden Anweisungen mit CreateObject.

Was wir jetzt nicht mehr haben, ist die Intellisense, wir müssen alles selber schreiben.
Außerdem dürfen wir nun keine ADODB Konstanten mehr verwenden (wenn wir mal welche brauchen) sonder müssen dann in diesem Fall uns selbst Konstanten schaffen oder die entsprechenden Werte einfügen.

Was ist nun der Vor - und Nachteil.
Nun, allgemein sagt man, dass Early Binding schneller ist.
Ich persönlich habe aber so meine Probleme damit und bevorzuge das Late Binding, um nicht Kompatibilitätsprobleme zu bekommen, wenn man einen höheren Verweis angehakt hat, als dann auf dem Zielrechner vorhanden ist.
Im Falle von ADODB habe ich dies nicht durchgetestet, ist meine ganz persönliche Einstellung!

In allen folgenden Teilen dieses Tutorials werde ich Late Binding benutzen.
Eine Technik die ich mir aber angewöhnt habe ist die, einfach eine zweite Mappe zu haben und dort einen Verweis - also Early Binding - um mir die Eigenschaften, Methoden und Ereignisse ansehen zu können.

Kleines Schmankerl zum Abschluss.

Wir wollen nun eine Zeile in dem Code ändern!
Und zwar die Pfadzuweisung.
Dies soll nun lauten:
sPfad = ThisWorkbook.Path & "\Ado1c.xls"

Was wo? Auf eine geschlossene Mappe zugreifen. Was ist denn das? Aber:

Hinweis

AB Excel 2007 schreiben Sie überall im Code (auch in den nachfolgenden Artikeln) anstatt:

sAdoConnectString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sPfad
den Ausdruck:
sAdoConnectString = "Provider=Microsoft.ACE.OLEDB.12.0; Extended Properties='Excel 12.0 Xml;HDR=YES';Data Source=" & sPfad

Vielen Dank für diesen Hinweis von Jochen Seyffert




Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben