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

ADO und Excel (5) - Strukturen

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

ADO und Excel (5) - Strukturen

Grau ist alle Theorie - und nicht nur die (wenn man meine Haare anschaut)

So schön dies auch alles ist, was wir bis jetzt produziert haben, ein wenig sollte man sich doch Gedanken machen.
Grundsätzlich sollten unsere Daten als pure Listen vorhanden sein, also die einzigen Daten in einem Arbeitsblatt und den Anforderungen an Listen genügen.
Die Anfangsposition der Liste ist dabei unerheblich, da Excel hier auf den UsedRange zugreift.
Excel ist nunmal keine Datenbank und hat keine Datenbanktabellen. Deswegen muss hier sorgfältig gearbeitet werden.
Vor allem sollten natürlich die Datentypen einer Spalte unbedingt gleich sein.

Wir wollen im nachfolgendem ein paar Beispiele aufbauen, ohne wirklich Daten auszuwerten.
Dazu erstellen Sie eine Arbeitsmappe mit dem Namen Ado5.xls.
Diese hat zwei Arbeitsblätter, Ziel und Werte.
Dann brauchen wir noch ein allgemeines Modul mit dem folgendem Code:

Option Explicit

Public Sub AdoCheckFelder()
Dim oAdoConnection As Object, oAdoRecordset As Object
Dim sAdoConnectString As String, sPfad As String
Dim sQuery As String
Dim oZielStartRange As Range
On Error GoTo Fehler
sPfad = ThisWorkbook.FullName
Set oZielStartRange = ThisWorkbook.Worksheets("Ziel").Range("b2")
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 * from [Werte$]"
With oAdoRecordset
	.Source = sQuery
	.ActiveConnection = oAdoConnection
	.Open
	Call TestfelderAusgabe(oAdoRecordset, oZielStartRange)
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

Private Sub TestfelderAusgabe(DasRecordSet As Object, StartAusgabe As Range)
Dim i As Long
StartAusgabe.CurrentRegion.Clear
With StartAusgabe
	For i = 0 To DasRecordSet.fields.Count - 1
		.Offset(i, 0) = DasRecordSet.fields(i).Name
	Next i
End With
End Sub

Kurze Codeanalyse

Der Code macht nichts anderes, als die Feldnamen unserer Abfrage in das Blatt Ziel zu schreiben.
Ab jetzt ändern wir nur noch im Blatt Werte etwas, und schauen uns an, was dabei herauskommt.
 Peter Haserodt
  • Formelhilfe
  • Makroentwicklung
  • VBA-Programmierung
  • + + + + + + + + +

Wir schauen uns die Felder an

Zuerst stellen Sie im Blatt Werte folgendes her:
Werte

 ABCD
1    
2    
3 HausMaus 
4 12 

Speichern Sie jetzt und führen Sie die Prozedur AdoCheckFelder aus.
Und wenn alles in Ordnung ist, sehen wir im Blatt Ziel unsere Feldnamen.

Jetzt ändern wir in Werte etwas:
Werte

 ABCD
1    
2   Raus
3 HausMaus2
4 12 

Nachdem wir jetzt unsere Prozedur ausführen, wird es etwas seltsam.
In Ziel sehen wir aufeinmal: F1,F2,Raus
Was ist hier passiert?
Die Abfrage hat den Bereich erwischt und zwar beginnend in der Zeile mit Raus.
In dieser Zeile sind aber keine Feldnamen für die anderen Spalten, die erscheinen erst weiter unten.
Hier behilft sich ADO, künstliche Feldnamen - abhängig von der Position - zu erstellen.
Also F1 und F2 (Field1, Field2)

Änder wir wieder: Werte

 ABCDEFG
1       
2       
3 HausMaus Raus Laus
4 12 2 5
Hier erhalten wir Haus Maus F3 Raus F5.

Sie sollten hiemit nun selbst weiter experementieren und sich dies anschauen. In Verbindung mit Werteabfragen, wie wir es schon kennengelernt haben.

ABER !

Abfragen auch ohne Überschriften:

Es gibt durchaus Listen - leider - die keine Überschriften haben, sondern nur aus Werten bestehen.
Hier können wir uns diesen Feldersatz zu nutze machen:
Ein kleines Beispiel:
Werte

 ABCD
1    
2 1,51,71,8
3 2,52,72,8
4 3,53,73,8
5 4,54,74,8


Tatsächlich kann es mich aber interessieren, dass ich hier die erste und dritte Spalte meiner Liste haben will und vielleich sogar basierend auf einem Wert in der 2.Spalte.
Z.B. Gib mir alle von Spalte 1 und Spalte 3 wo in Spalte 2 der Wert größer als 3 ist.

Der Abfragestring - basierend darauf , dass die Werte in einem Blatt mit dem Namen Werte steht so aussehen:
(Beachten Sie, keine eckigen Klammern bei den Feldbezeichnungen in diesem Fall!)
sQuery = "Select F1,F3 from [Werte$] where F2 >3"



Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben