Autor: Peter Haserodt --- Aus Excel VBA - Gruppe:
TutorialsADO 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.
Wir schauen uns die Felder an
Zuerst stellen Sie im Blatt Werte folgendes her:
Werte
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 | A | B | C | D |
1 | | | | |
2 | | | | Raus |
3 | | Haus | Maus | 2 |
4 | | 1 | 2 | |
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 | A | B | C | D | E | F | G |
1 | | | | | | | |
2 | | | | | | | |
3 | | Haus | Maus | | Raus | | Laus |
4 | | 1 | 2 | | 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 | A | B | C | D |
1 | | | | |
2 | | 1,5 | 1,7 | 1,8 |
3 | | 2,5 | 2,7 | 2,8 |
4 | | 3,5 | 3,7 | 3,8 |
5 | | 4,5 | 4,7 | 4,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