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.
Anmerkungen
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
 
Beispiel-Aufruf
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
 
Links zum Thema
Daten aus einer geschlossenen Arbeitsmappe einlesen (ADO)
Daten aus einer geschlossenen Arbeitsmappe einlesen (Formeln)
Datumszuweisung in Tabellenzelle
Doppelte Datensätze ermitteln (DAO)
Doppelte Datensätze löschen (DAO)
Hinweis
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: [ 1302 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 29. Mai 2011