Tipp 0453
|
Daten aus einer Arbeitsmappe einlesen (DAO)
|
 |
|
Autor/Einsender: Datum: |
|
Angie 22.05.2005 |
|
Entwicklungsumgebung: |
|
Excel 2000 |
|
|
Mittels DAO (Data Access Objects) ist es möglich, Daten aus geschlossenen (!)
Arbeitsmappen auszulesen. Hier kann unterschieden werden, ob alle Daten im angegebenen
Tabellenblatt ausgelesen werden sollen, oder nur ein bestimmter Bereich oder eine einzelne Zelle,
oder ein Bereich, dem ein Name zugewiesen wurde.
|
In der SQL-Anweisung können zusätzlich weitere Kriterien/Bedingungen angegeben werden, z. B.
dass nur Daten bestimmter Spalten ausgelesen werden sollen und/oder bestimmte Bedingungen erfüllt
sein müssen.
|
|
|
Lese-/schreibgeschützte Arbeitsmappen
|
Arbeitsmappen, die mit einem Lese-/Schreibkennwort geschützt sind, können nicht mittels DAO
bearbeitet werden!
|
Tabellenblattname
|
Für den Zugriff auf die Excel-Tabelle mittels DAO muss der Tabellenblattname mit dem $-Zeichen
ergänzt werden und auch in eckigen Klammern ([ ]) gesetzt werden.
|
|
|
[Tabellenname$]
[Tabellenname$A1:C5]
[Tabellenname$A2:A2]
|
|
|
Sollte der Tabellenblattname Leerzeichen enthalten, so muss der Tabellenblattname mit
Hochkommas eingeschlossen werden, aber nur dann, wenn kein Zellbereich angegeben wird. Je nach
verwendeter DAO-Version wird jedoch das zweite Hochkomma entweder vor oder nach dem $-Zeichen
platziert:
|
|
|
DAO 3.5x -> ['Tabellenname mit Leerzeichen'$]
DAO 3.6 -> ['Tabellenname mit Leerzeichen$']
|
|
|
Quellbereich
|
Wird als Quellbereich ein Bereich angegeben, das keine Daten enthält, so werden unter Umständen
trotzdem Datensätze zurückgegeben. Dies ist z. B. dann der Fall, wenn im Quellbereich
irgendwann Daten enthalten waren, diese jedoch lediglich mit der Taste Entf gelöscht
wurden, und nicht die Zeile selbst (Zellen löschen... /Ganze Zeile).
|
Spaltenüberschriften
|
Wird als Quellbereich nur eine Zeile oder eine einzelne Zelle angegeben, muss beim Aufruf
der folgenden Funktion für das Argument fColHDR False übergeben werden!
|
|
Funktion zum Auslesen der Daten (DAO) |
|
Der Prozedur zum Auslesen der Daten aus der geschlossenen Arbeitmappe wird
|
- der Dateiname der geschlossenen Arbeitsmappe inkl. Pfad
|
- der SQL-String, in dem der Quellbereich angegeben ist und ggf. weitere Kriterien/Bedingungen
|
- ob Spaltenüberschriften vorhanden sind
|
- und ein Datenfeld für die Daten aus dem Quellbereich
|
übergeben.
|
Wenn bei der Ausführung der Funktion keine Fehler aufgetreten sind, ist der Rückgabewert der
Funktion True, und im Datenfeld avarDataXL() sind die
entsprechenden Daten aus dem Quellbereich enthalten.
|
|
|
Public Function GetDataFromWkb_DAO(ByVal strDBName As String, _
ByVal strSQL As String, ByVal fColHDR As Boolean, _
ByRef avarDataXL() As Variant) As Boolean
Dim dbsDAO As DAO.Database
Dim rstDAO As DAO.Recordset
Dim strConnect As String
Dim nFieldsCnt As Long
Dim nRecordsCnt As Long
Dim nFld As Long
Dim nRec As Long
Dim blnData As Boolean
strConnect = "Excel 8.0;"
If Not fColHDR Then
strConnect = strConnect & "HDR=No;"
End If
On Error GoTo err_GetValues
Set dbsDAO = DBEngine.OpenDatabase( _
strDBName, False, True, strConnect)
Set rstDAO = dbsDAO.OpenRecordset(strSQL)
With rstDAO
If Not (.EOF Or .BOF) Then
.MoveLast: .MoveFirst
nFieldsCnt = .Fields.Count - 1
nRecordsCnt = .RecordCount - 1
ReDim avarDataXL(0 To nRecordsCnt, 0 To nFieldsCnt)
nRec = 0
On Error Resume Next
Do While Not .EOF
For nFld = 0 To nFieldsCnt
If Not IsNull(.Fields(nFld).Value) Then
If IsDate(.Fields(nFld).Value) Then
avarDataXL(nRec, nFld) = _
Format$(.Fields(nFld).Value, "yyyy-mm-dd")
Else
avarDataXL(nRec, nFld) = .Fields(nFld).Value
End If
blnData = True
End If
Next
nRec = nRec + 1
.MoveNext
Loop
On Error GoTo 0
If blnData Then
GetDataFromWkb_DAO = True
Else
MsgBox "Der Quellbereich enthält keine Daten!", _
vbInformation, "VB-fun-Demo"
End If
Else
MsgBox "Keine entsprechenden Datensätze gefunden!", _
vbInformation, "VB-fun-Demo"
End If
End With
exit_Func:
On Error Resume Next
rstDAO.Close
Set rstDAO = Nothing
dbsDAO.Close
Set dbsDAO = Nothing
On Error GoTo 0
Exit Function
err_GetValues:
MsgBox "Fehler " & Err.Number & vbCrLf & Err.Description, _
vbCritical, "VB-fun-Demo"
Resume exit_Func
End Function
|
|
|
|
Wenn die Funktion zum Ermitteln der Daten erfolgreich ausgeführt werden konnte, werden
in diesem Beispiel die Daten ab der nächsten freien Zeile im Ziel-Tabellenblatt eingefügt.
|
|
|
Public Sub Start_GetDataFromWkb_DAO()
Dim strDBName As String
Dim strSource As String
Dim strSQL As String
Dim avarDataXL() As Variant
Dim optXLCalcMode As Long
Dim wksDest As Worksheet
Dim nColDest As Integer
Dim nRowDest As Long
strDBName = ThisWorkbook.Path & "\TestDateien\Mappe1.xls"
strSource = "[Tabelle1$]"
strSQL = "SELECT * FROM " & strSource & ";"
If Len(Dir$(strDBName)) = 0 Then
MsgBox "Die Datei " & vbCrLf & strDBName & vbCrLf & _
"existiert nicht!", vbInformation, "VB-fun-Demo"
Exit Sub
End If
If GetDataFromWkb_DAO(strDBName, strSQL, True, avarDataXL()) Then
With Application
optXLCalcMode = .Calculation
.Calculation = xlManual
.EnableEvents = False
End With
nColDest = 1
Set wksDest = ActiveWorkbook.Worksheets(1)
On Error Resume Next
With wksDest
If Application.WorksheetFunction.CountA(.Cells) > 0 Then
nRowDest = .Cells.Find(What:="*", After:=.Cells(1, 1), _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1
Else
nRowDest = 2
End If
Err.Clear
.Cells(nRowDest, nColDest).Resize( _
UBound(avarDataXL, 1) + 1, _
UBound(avarDataXL, 2) + 1).Value = avarDataXL
If Err.Number = 0 Then
.UsedRange.Columns.AutoFit
MsgBox "Die Daten aus dem Quellbereich '" & strSource & _
"' wurden eingelesen!", vbInformation, "VB-fun-Demo"
Else
MsgBox "Fehler " & Err.Number & vbCrLf & _
Err.Description, vbCritical, "VB-fun-Demo"
End If
End With
Erase avarDataXL
Set wksDest = Nothing
With Application
.EnableEvents = True
.Calculation = optXLCalcMode
End With
End If
On Error GoTo 0
End Sub
|
|
|
|
|
|
Um diesen Tipp ausführen zu können, muss die Microsoft DAO 3.x Object Library
in das Projekt eingebunden werden.
|
|
Windows-Version |
95 |
 |
|
98 |
 |
|
ME |
 |
|
NT |
 |
|
2000 |
 |
|
XP |
 |
|
Vista |
 |
|
Win
7 |
 |
|
|
Excel-Version |
95 |
 |
|
97 |
 |
|
2000 |
 |
|
2002
(XP) |
 |
|
2003 |
 |
|
2007 |
 |
|
2010 |
 |
|
|
|
Download (23,5
kB)
|
Downloads bisher: [ 1298 ]
|
|
|