Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Daten aus Access direkt in Listbox einlesen (SQL)

Forumthread: Daten aus Access direkt in Listbox einlesen (SQL)

Daten aus Access direkt in Listbox einlesen (SQL)
06.01.2020 06:46:26
Klaus
Hallo Forum,
ich habe eine Userform, in der ich Werte aus einer Access-Datenbank zeige.
In ListBox1 werden alle Auftragsnummern gezeigt.
Wird ein Auftrag aus ListBox1 ausgewählt, wird die Modellnummer in Label1 angezeigt, und in UserForm2 werden alle Artikelnummern aus der zu dem Modell gehörenden Stückliste angezeigt.
(und dann passiert noch eine Menge mehr, aber für die Frage habe ich den Code auf das wesentliche gekürtzt)
Bisher löse ich das so, und es funktioniert auch:
Sub Laden_SQL(mySQLcmd As String)
Dim cmd As ADODB.Command
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\herber\myAccDb.accdb" & _
"Mode=Share Exclusive"
Set cmd = New ADODB.Command
cmd.ActiveConnection = con
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open mySQLcmd, _
ActiveConnection:=con, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
With Tabelle1
.UsedRange.ClearContents
.Range("A1").CopyFromRecordset Data:=rs
End With
Set cmd = Nothing
con.Close
Set con = Nothing
End Sub
Private Sub UserForm_Initialize()
Dim i As Long
Call Laden_SQL("SELECT AuftragsNr FROM AuftragAlle AS mytab WHERE [mytab.DatumStart] = " & Date) _
With Tabelle1
For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
UserForm1.ListBox1.AddItem .Cells(i, 1).Value
Next i
End With
End Sub
Private Sub ListBox1_Change()
Dim i As Long
Call Laden_SQL("SELECT Modell FROM AuftragAlle AS mytab WHERE [mytab.AuftragsNr] = " &  _
UserForm1.ListBox1.Value)
UserForm1.Label1.Caption = Tabelle1.Range("A1").Value
Call Laden_SQL("SELECT Artikelnr FROM Stueckliste AS mytab WHERE [mytab.Modell] = " & UserForm1. _
Label1.Caption)
With Tabelle1
For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
UserForm1.ListBox2.AddItem .Cells(i, 1).Value
Next i
End With
End Sub
Wenn es bei drei Objekten bleiben würde wäre es ja auch ok. Es geht mir aber tierisch auf den Keks, mit jedem SQL Kommando umständlich den Weg über eine Exceltabelle zu gehen.
Hat jemand eine Idee, ob ich die "Laden_SQL" Sub in eine Function umschreiben kann, um dann den/die Wert/e aus der Access DB direkt zu übergeben, ohne ihn erst in eine Tabelle zu schreiben? In Pseudocode könnte das dann so aussehen:
Function Laden_SQL(mySQLcmd As String)
[... AccDb initilaisieren ...]
Laden_SQL = mySQLcmd
End Function
Private Sub ListBox1_Change()
UserForm1.Label1.Caption = Laden_SQL("SELECT Modell FROM AuftragAlle AS mytab WHERE [mytab. _
AuftragsNr] = " & UserForm1.ListBox1.Value)
End Sub
Kann das für einen Wert, um ein Label zu beschriften, funktionieren?
Kann das auch für viele Werte, um eine Listbox zu füllen, funktionieren?
LG,
Klaus M.
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Daten aus Access direkt in Listbox einlesen (SQL)
06.01.2020 08:09:23
Luschi
Hallo Klaus,
'rs' ist ein RecordSet-Object, daß man auch in einer Schleife vom 1. bis zum letzten Datensatz _ durchlaufen kann und den Inhalt sofort in die Listbox(en) schreiben kann nach dem Muster:

If Not rs.BOF Or rst.EOF Then
rs.MoveFirst
Do While Not rst.EOF
UserForm1.ListBox2.AddItem rs.Fields(0).value
rs.MoveNext
Loop
End If
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Daten aus Access direkt in Listbox einlesen (SQL)
06.01.2020 08:33:51
volti
Hallo Klaus,
das ist so ein spezieller Fall, den ich in meinem Thread vom 04.12.2019 gemeint hatte. :-)
http://www.herber.de/cgi-bin/callthread.pl?index=1727182
Mach es so wie Luschi vorschlägt.
M.E. müssten aber die zwei rst noch in rs geändert werden, oder sehe ich da was falsch.
viele Grüße
Karl-Heinz
Anzeige
AW: Daten aus Access direkt in Listbox einlesen (SQL)
06.01.2020 08:46:27
Luschi
Hallo Karl-Heinz,
Genau hingeguckt - sch... Copy & Paste
Gruß von Luschi
aus klein-Paris
Danke für die Hinweise ...
07.01.2020 06:18:33
Klaus
... damit werde ich heute mal rumprobieren :-) Habt nen guten Tag!
Klaus M.
;
Anzeige
Anzeige

Infobox / Tutorial

Daten aus Access in eine Listbox einlesen


Schritt-für-Schritt-Anleitung

Um Daten aus einer Access-Datenbank direkt in eine Listbox in Excel zu laden, kannst Du den folgenden VBA-Code verwenden. Hierbei wird eine Userform genutzt, um die Daten anzuzeigen.

  1. UserForm erstellen: Erstelle eine UserForm mit einer ListBox (z.B. ListBox1) und einem Label (z.B. Label1).
  2. Verbindung zur Access-Datenbank herstellen: Füge den folgenden Code in das Modul Deiner UserForm ein:
Sub Laden_SQL(mySQLcmd As String)
    Dim cmd As ADODB.Command
    Dim con As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set con = New ADODB.Connection
    con.Open ConnectionString:= _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=C:\herber\myAccDb.accdb" & _
    "Mode=Share Exclusive"

    Set cmd = New ADODB.Command
    cmd.ActiveConnection = con
    Set rs = New ADODB.Recordset
    rs.Open mySQLcmd, ActiveConnection:=con, CursorType:=adOpenStatic, LockType:=adLockPessimistic

    With Tabelle1
        .UsedRange.ClearContents
        .Range("A1").CopyFromRecordset Data:=rs
    End With

    rs.Close
    con.Close
End Sub

Private Sub UserForm_Initialize()
    Dim i As Long
    Call Laden_SQL("SELECT AuftragsNr FROM AuftragAlle WHERE [DatumStart] = #" & Date & "#")

    With Tabelle1
        For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
            UserForm1.ListBox1.AddItem .Cells(i, 1).Value
        Next i
    End With
End Sub
  1. ListBox aktualisieren: Im ListBox1_Change-Ereignis kannst Du die Auswahl verarbeiten:
Private Sub ListBox1_Change()
    Dim i As Long
    Call Laden_SQL("SELECT Modell FROM AuftragAlle WHERE [AuftragsNr] = '" & UserForm1.ListBox1.Value & "'")
    UserForm1.Label1.Caption = Tabelle1.Range("A1").Value

    Call Laden_SQL("SELECT Artikelnr FROM Stueckliste WHERE [Modell] = '" & UserForm1.Label1.Caption & "'")
    With Tabelle1
        For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
            UserForm1.ListBox2.AddItem .Cells(i, 1).Value
        Next i
    End With
End Sub

Häufige Fehler und Lösungen

  1. Fehler bei der Datenverbindung: Überprüfe den ConnectionString. Achte darauf, dass der Pfad zur Access-Datenbank korrekt ist.
  2. Leere ListBox: Stelle sicher, dass die SQL-Abfrage korrekt ist und tatsächlich Daten zurückgibt.
  3. Typkonflikte: Achte darauf, die richtigen Datentypen in den SQL-Abfragen zu verwenden (z.B. Datum mit # umschließen).

Alternative Methoden

Falls Du die Laden_SQL-Subroutine nicht verwenden möchtest, kannst Du die Daten auch direkt in die ListBox einfüllen, indem Du den Recordset durchläufst:

If Not rs.BOF Or Not rs.EOF Then
    rs.MoveFirst
    Do While Not rs.EOF
        UserForm1.ListBox2.AddItem rs.Fields(0).Value
        rs.MoveNext
    Loop
End If

Diese Methode ermöglicht es Dir, die Listbox ohne Umweg über eine Excel-Tabelle direkt zu füllen.


Praktische Beispiele

  • Auftragsnummern aus Access laden: Die oben gezeigten Beispiele laden die Auftragsnummern aus der AuftragAlle-Tabelle.
  • Artikelnummern anzeigen: Bei der Auswahl einer Auftragsnummer wird die entsprechende Modellnummer angezeigt und die Artikelnummern aus der Stueckliste-Tabelle in die zweite ListBox geladen.

Tipps für Profis

  • Nutze Option Explicit am Anfang Deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.
  • Optimiere Deine SQL-Abfragen, um die Performance zu verbessern, indem Du nur die benötigten Felder abfragst.
  • Überlege, wie Du die Benutzeroberfläche verbessern kannst, z.B. durch die Verwendung von ComboBoxen oder zusätzlichen Labels zur Anzeige von Informationen.

FAQ: Häufige Fragen

1. Funktioniert dieser Code auch in Excel 2010?
Ja, der Code sollte auch in Excel 2010 ohne Probleme funktionieren, solange die Microsoft Access Database Engine installiert ist.

2. Kann ich die ListBox auch manuell füllen?
Ja, Du kannst die ListBox auch manuell füllen, indem Du AddItem verwendest, um Werte hinzuzufügen, ohne eine Datenbankverbindung zu nutzen.

3. Gibt es eine Möglichkeit, mehrere Spalten in einer ListBox anzuzeigen?
Ja, Du kannst die ListBox-Eigenschaft ColumnCount nutzen und die Spaltenwerte in einer Schleife hinzufügen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige