Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Access-Daten direkt in Listview?

Forumthread: Access-Daten direkt in Listview?

Access-Daten direkt in Listview?
23.02.2006 12:10:32
Andre
Hallo,
im Moment importiere ich Daten per VBA-Code in ein Excel-Tabellenblatt, um sie danach sofort in ein Listview einer UF zu schreiben. So weit, so gut.
Theoretisch sollte dies doch auch ohne den Umweg über das Tabellenblatt gehen, oder? Das heißt, die Daten aus Access direkt in mein Listview zu importieren.
Die UF soll weiterhin in einer Excel-Arbeitsmappe starten, aber ich spare mir einfach das Tabellenblatt.
Zum Einen brauch ich dann keine zahlreichen Tabellenblätter mehr, die nur dazu da sind die Daten zu "übergeben" und zum Anderen sollte es dann auch schneller gehen. Oder?
Gruß Andre
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Access-Daten direkt in Listview?
23.02.2006 15:38:32
Peter
Hallo Andre,
sicher geht das, aber nicht 'auf der grünen Wiese'. Das soll heißen, du solltest entweder deine bisherige Anwendung posten oder aber Angaben über Anzahl Spalten in der ListBox, ggf. Feld-/Tabellen-Namen der MDB machen usw.
Genial wäre es, auch eine abgemagerte Version der Access Datenbank zu haben. Wie soll sonst getestet werden?
Viele Grüße Peter
Anzeige
AW: Access-Daten direkt in Listview?
23.02.2006 16:22:04
Andre
Hi Peter,
danke für deine Hilfe.
Hab doch nicht mit einer fertigen Lösung gerechnet, nur ein Hinweis oder ein Beispiel-Code.
Hilfreich wäre auch, wenn jemand das schon mal realisiert hat und mir sagen kann ob das überhaupt Geschwindigkeit bringt.
Die Komponenten (Feldnamen, Anzahl der Spalten usw.) sind ja doch variabel, aber hier ein Beispiel:
Die Datenabfrage:
Sheets("Intro").Range("J2:L65536").ClearContents
With Sheets("Intro").QueryTables.Add(Connection:= _
"ODBC;PWD=" & Passwortkennziffer & ";DSN=Microsoft Access-Datenbank;DBQ=" & [Kontrolle!G55] & "\" & [Kontrolle!G56] & ";DefaultDir=" & [Kontrolle!G55] & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Sheets("Intro").Range("J1"))
.CommandText = Array("SELECT Anmeldungen.Benutzer, Anmeldungen.Arbeitsplatz, Anmeldungen.Datum, Anmeldungen.ID" & Chr(13) & "" & Chr(10) & "FROM `" & [Kontrolle!G55] & "\" & [Kontrolle!G56] & "`.Anmeldungen Anmeldungen")
.name = "Datenbankabfrage Anmeldungen"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Übergabe an Listview:
With Worksheets("Intro")
Dim intIndex As Integer
For I = 10 To 14
ListView1.ColumnHeaders.Add , , Sheets("Intro").Cells(1, I), 139
Next I
LetzteZeile = .Cells(Cells.Rows.Count, 12).End(xlUp).Row
For intIndex = 2 To LetzteZeile
With ListView1.ListItems.Add(, , .Range("J" & intIndex).Value)
For I = 11 To 14
.ListSubItems.Add , , Sheets("Intro").Cells(intIndex, I).Value
Next I
End With
Next
End With
Gruß Andre
Anzeige
AW: Access-Daten direkt in Listview?
23.02.2006 16:47:46
Peter
Hallo Andre,
hier ist ein laufendes Makro als Muster

'
'------------------------------------------------------------------------------'
'                                                                              '
'              Autor: Peter Feustel - p.feustel@system-kontor.de               '
'                                                                              '
'------------------------------------------------------------------------------'
'                                                                              '
'    Achtung der Verweis auf: Microsoft ActiveX Data Objects 2.0 Library       '
'    oder eine höhere Version (2.1, 2.5) muss aktiviert sein.                  '
'                                                                              '
'    das nachfolgende Makro liest aus einer Access-Datenbank Adressen          '
'    gemäß der Adressen-Nummer und gibt die Adressen anschließend in           '
'    ein UserForm(ular) in die ListBox1 aus.                                   '
'                                                                              '
'------------------------------------------------------------------------------'
'
Private Sub UserForm_Activate()
Dim DBPfad      As String     ' Pfad der Access-Anwendung
Dim DBDatei     As String     ' Name der Access-Datei bzw. DB
Dim DBTab       As String     ' Name der Access-Tabelle
Dim Connect     As Connection ' die Verbindung zu Access
Dim RecSet      As Recordset  ' der Access RecordSet
Dim SQLString   As String     ' der SQL Befehl
Dim iLiBoIndx   As Integer    ' ListBox-Index
Dim Suchbegr    As String     ' zum Suchen in der Access-Datenbank
   Suchbegr = "Feustel"
'
'  Pfad der Access Datenbank, Name der Access Datei, Name der Access Tabelle
'
   DBPfad = "C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Access-DBs\"
   DBDatei = "Adr-Feustel.mdb"
   DBTab = "Adressen"
   
'  die ListBox 'formatieren'
   UserForm2.ListBox1.ColumnCount = 9
   UserForm2.ListBox1.ColumnWidths = _
            "3,0 cm; 3,5 cm; 3,0 cm; 3,2 cm; 1,0 cm; 1,5 cm; 3,5 cm; 3,5 cm; 1,0 cm"
   
'  Die Datenbank öffnen
   Set Connect = New ADODB.Connection
   With Connect
      .Provider = "Microsoft.Jet.OLEDB.4.0"   ' für Access 2000 und höhere
      .ConnectionString = "Data Source=" & DBPfad & DBDatei
      .Open
   End With
'
'  hier nur ein paar Felder gemäß Suchbegiff aus der Access-Tabelle holen
'
   SQLString = "SELECT " & DBTab & ".Vorname, " _
                         & DBTab & ".Nachname, " _
                         & DBTab & ".Namensergänzung, " _
                         & DBTab & ".Straße, " _
                         & DBTab & ".Länderschlüssel, " _
                         & DBTab & ".PSTLZ_Straße, " _
                         & DBTab & ".Ort, " _
                         & DBTab & ".Ortszusatz, " _
                         & DBTab & ".Region " _
                         & " FROM " & DBTab & ";" '_
                         '& " WHERE " _
                         '& DBTab & ".Nachname Like '" & Suchbegr & "';"
                          
   If SQLString = "" Then
      MsgBox "hier ist der Wurm drin, der SQLString ist leer - Abbruch.", _
         16, "   der SQLString wurde nicht gefüllt."
      Exit Sub
    Else
      'MsgBox SQLString      ' den SQL-String anzeigen
   End If
 
   Set RecSet = New ADODB.Recordset
   RecSet.Open SQLString, Connect, adOpenDynamic, adLockReadOnly
   
'  Jetzt den selektierten Record holen und in die ListBox schreiben
    
   If RecSet.EOF = False Then  ' kein EOF => es gibt also Daten !
      RecSet.MoveFirst         ' auf dem ersten Datensatz aufsetzen
    Else
      MsgBox "es konnte nichts selektiert werden => Abbruch.", _
         16, "    fehlerhafte Selektion ?"
      Exit Sub
   End If
            
   Do While RecSet.EOF = False
      UserForm2.ListBox1.AddItem " "
      If RecSet.Fields.Item(0).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 0) = RecSet.Fields.Item(0).Value
      End If
      If RecSet.Fields.Item(1).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 1) = RecSet.Fields.Item(1).Value
      End If
      If RecSet.Fields.Item(2).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 2) = RecSet.Fields.Item(2).Value
      End If
      If RecSet.Fields.Item(3).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 3) = RecSet.Fields.Item(3).Value
      End If
      If RecSet.Fields.Item(4).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 4) = RecSet.Fields.Item(4).Value
      End If
      If RecSet.Fields.Item(5).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 5) = RecSet.Fields.Item(5).Value
      End If
      If RecSet.Fields.Item(6).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 6) = RecSet.Fields.Item(6).Value
      End If
      If RecSet.Fields.Item(7).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 7) = RecSet.Fields.Item(7).Value
      End If
      If RecSet.Fields.Item(8).Value <> "" Then
         UserForm2.ListBox1.List(iLiBoIndx, 8) = RecSet.Fields.Item(8).Value
      End If
      iLiBoIndx = iLiBoIndx + 1
      RecSet.MoveNext
   Loop
   RecSet.Close     ' Access Recordset schließen
   Connect.Close    ' Access schließen
Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Anzeige
AW: Access-Daten direkt in Listview?
24.02.2006 08:55:16
Andre
Guten Morgen Peter,
danke für dein Beispiel. Das ist schon mehr als ich erwartet hatte. Vielen Dank.
Für die Listbox funktioniert´s klasse. Es wird mir sicher gelingen, dein Code an ein Listview anzupassen.
Danke nochmal und bis bald.
Gruß Andre
;
Anzeige
Anzeige

Infobox / Tutorial

Access-Daten direkt in Listview importieren


Schritt-für-Schritt-Anleitung

  1. VBA-Umgebung öffnen: Starte Excel und öffne die VBA-Entwicklungsumgebung, indem du ALT + F11 drückst.

  2. UserForm erstellen: Füge eine UserForm hinzu, indem du im Projekt-Explorer mit der rechten Maustaste auf dein Projekt klickst und "Einfügen" > "UserForm" auswählst.

  3. ListView steuern: Füge ein ListView-Steuerelement auf die UserForm hinzu. Stelle sicher, dass du die Microsoft Windows Common Controls-Bibliothek aktiviert hast.

  4. Verbindung zur Access-Datenbank herstellen: Füge den notwendigen VBA-Code hinzu, um eine Verbindung zur Access-Datenbank herzustellen. Der Code könnte so aussehen:

    Dim conn As Object
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pfad\zu\deiner\Datenbank.mdb;"
  5. Daten abfragen und ins ListView einfügen: Verwende eine SQL-Abfrage, um die gewünschten Daten aus deiner Access-Datenbank zu holen. Beispiel:

    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM DeineTabelle", conn
    
    While Not rs.EOF
        With ListView1.ListItems.Add()
            .Text = rs.Fields(0).Value
            .ListSubItems.Add , , rs.Fields(1).Value
            .ListSubItems.Add , , rs.Fields(2).Value
        End With
        rs.MoveNext
    Wend
  6. Ressourcen freigeben: Schließe die Verbindung und den Recordset, wenn du fertig bist:

    rs.Close
    conn.Close

Häufige Fehler und Lösungen

  • Fehler 1: "Der SQL-String ist leer."

    • Lösung: Überprüfe deine SQL-Abfrage und stelle sicher, dass der String korrekt formatiert ist, bevor du ihn ausführst.
  • Fehler 2: "Zugriff verweigert auf die Datenbank."

    • Lösung: Stelle sicher, dass die Datei nicht schreibgeschützt ist und du die richtigen Berechtigungen hast.

Alternative Methoden

Falls du keine UserForm verwenden möchtest, kannst du die Daten auch direkt in ein Excel-Arbeitsblatt importieren und von dort aus in ein ListView steuern. Dies könnte einfacher sein, wenn du nicht mit der VBA-Umgebung vertraut bist.


Praktische Beispiele

  • Beispiel 1: Importiere spezifische Daten von Kunden aus einer Access-Datenbank und zeige sie im ListView an. Nutze eine WHERE-Klausel in deiner SQL-Abfrage, um nur relevante Datensätze abzurufen.

  • Beispiel 2: Verwende eine Schleife, um durch die Datensätze zu iterieren und die Informationen ins ListView zu übertragen, wie im Schritt-für-Schritt-Prozess beschrieben.


Tipps für Profis

  • Verbindung optimieren: Verwende Connection Pooling, um die Leistung zu verbessern, wenn du häufig auf die Datenbank zugreifst.
  • Fehlerbehandlung: Implementiere eine robuste Fehlerbehandlung in deinem VBA-Code, um unvorhergesehene Probleme zu vermeiden.
  • Performance-Überwachung: Teste die Geschwindigkeit der Datenabfragen und optimiere deine SQL-Abfragen, um die Effizienz zu maximieren.

FAQ: Häufige Fragen

1. Kann ich auch andere Datenbanken verwenden? Ja, du kannst auch andere Datenbanken wie SQL Server oder MySQL verwenden, indem du die entsprechenden Verbindungszeichenfolgen anpasst.

2. Ist dieser Prozess in allen Excel-Versionen verfügbar? Die beschriebenen Methoden sind in Excel 2007 und höher verfügbar, beachten jedoch die unterschiedlichen Bibliotheksanforderungen für die Datenbankverbindung.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige