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

combobox mit recordset befüllen die 800ste

Forumthread: combobox mit recordset befüllen die 800ste

combobox mit recordset befüllen die 800ste
10.04.2015 01:27:09
Wusel
Hallo zusammen!
Es tut mir Leid, ich geh am Stock. Nach mehreren Stunden Recherche (hier und auch in anderen Foren) und x-fachem Rumprobieren bin ich immer noch nicht in der Lage diesen %&(/$§-Code zum Laufen zu bringen. Obwohl es wahrscheinlich alles sehr einfach ist. Ich glaube es fehlt nicht mehr viel :) Eigentlich ist alles was ich möchte eine Funktion(hier "testfunktion"), der ich einen SQL-Select als String füttere und die mir ein Recordset zurück gibt, mit dem ich dann nach Belieben verfahren kann.
Die Hauptfrage ist: Warum läuft das hier nicht?
    'Set rtest = ThisWorkbook.Worksheets("Ziel").Range("b2")
selectstr = "Select [STADT] from [Stadtinformationen_allgemein$] where PLZ =4626"
Set rs = testfunktion(selectstr)
'Call rscopy(rs, rtest)
Do While Not rs.EOF
Objektanzeige.STADT.AddItem rs.Fields("STADT")
rs.MoveNext
Loop
Das Recordset rs habe ich mit rscopy mal in ein Tabellenblatt geschrieben. Der Inhalt ist wie gewünscht eine Liste mit um die 10 Städtenamen. Diese hätte ich gerne im Dropdown meiner Combobox STADT auf dem Userform Objektanzeige, aber Excel möchte nicht wie ich will. Kann mich vielleicht hier jemand entwirren und mir sagen, warum das so ist? :)
Bonusfrage: Ich habe mir von Peter Haserodt von online-excel.de die folgende Funktion geborgt und etwas verändert. Im unteren Teil habe ich die close und = Nothing Zeilen auskommentiert, damit die Funktion auch tatsächlich mit dem Recordset des SQL-Querys rausrückt - ich muss gestehen ohne zu wissen warum. Ich bin über diverse Artikel gestolpert. Mal soll das Recordset nicht geschlossen werden, mal die Connection. Wenn man alles weglässt funktioniert's besonders gut :) NUr clever ist das wohl nicht... Kann mir das vielleicht jemand erläutern? Muss das evtl. zwingend an anderer Stelle nachgeholt werden?
Function testfunktion(strsqlselect As String) As ADODB.Recordset
Dim oAdoConnection As New ADODB.Connection
Dim oAdoRecordset As New ADODB.Recordset
Dim sAdoConnectString As String, sPfad As String
On Error GoTo Fehler
sPfad = ThisWorkbook.FullName
sAdoConnectString = "Provider=Microsoft.ACE.OLEDB.12.0; Extended      Properties='Excel 12. _
0 Xml;HDR=YES';Data Source=" & sPfad
Set oZielStartRange = ThisWorkbook.Worksheets("Ziel").Range("b2")
oAdoConnection.Open sAdoConnectString
With oAdoRecordset
.Source = strsqlselect
.ActiveConnection = oAdoConnection
.Open
End With
Set testfunktion = oAdoRecordset
Aufraeumen:
On Error Resume Next
'oAdoRecordset.Close
'oAdoConnection.Close
'Set oAdoRecordset = Nothing
'Set oAdoConnection = Nothing
Exit Function
Fehler:
MsgBox "Fehler: " & Err.Description
Resume Aufraeumen
End Function
Ich bin für jede Hilfe überaus dankbar und sage schon einmal "Danke" für jede Antwort, die Ihren Weg hierher findet :) Durch das viele Rumprobieren hab ich gerade echt den Faden verloren und "schwimme" nur noch *blubblub* Vielleicht wird es auch einfach Zeit für's Bett...
Euer Wusel

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: combobox mit recordset befüllen die 800ste
10.04.2015 08:43:19
Luschi
Hallo Wusel,
habe gerade ein Projekt in Abeit, bei der Daten aus einer Excel-Tabelle per ADOBO dynamisch in eine Combobox (ActiveX) eingelesen werden. Ich würde Dir helfen, wenn Du eine kleine Demodatei bereitstellst.
Leider verrätst Du nicht woher die Daten (Excel, Access, csv-Datei) kommen und ob die Combobox sich in einem Formular oder auf einem Tabellenblatt befindet.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: combobox mit recordset befüllen die 800ste
10.04.2015 10:50:45
Wusel
Hallo Luschi und vielen Dank für das Angebot!
Ich habe mal meine eigentliche Datei etwas entmüllt und diese "Demo" hochgeladen: https://www.herber.de/bbs/user/96994.zip
Du findest meinen "Spielcode", indem Du im TB-Startmenü auf den Button "Neues Objekt hinzufügen" klickst. Das so aufgerufene UF besitzt unten links eine Combobox "PLZ" im Change-Event steckt der Code(Die Funktionen rscopy und testfunktion findest Du im Modul SQLquery). Die Idee war ursprünglich nach der User-Eingabe der PLZ die Stadt automatisch zu füllen (die Daten dafür liefert TB-Stadtinformationen_allgemein). Jetzt habe ich aber dummerweise nicht bedacht, dass eine PLZ mehrere Städte zurückgeben kann. Die neue Idee ist nach der PLZ-Eingabe einen Vorschlag in STADT zu schreiben. Dazu eine Liste aller Städte mit der eingegebenen PLZ, damit der User im Zweifelsfall komfortabel auswählen kann. Im Moment verwende ich zum Testen die fixe PLZ 4626 - später baue ich mir den SQL-String natürlich mit der Usereingabe zusammen :)
Ja, soviel zur Ausgangssituation. Jetzt bekomme ich nur mein Recordset nicht in meine Combobox geschrieben :( Hoffe Du hast eine Idee woran es liegt, ich weiß nicht mehr weiter :(
Sonnige Morgenkaffeegrüße
Wusel

Anzeige
AW: combobox mit recordset befüllen die 800ste
10.04.2015 22:08:40
Luschi
Hallo Wusel,
ich habe mal Folgendes gemacht.
- bei der Userformular-Initialisierung werden alle PLZ per ADO-SQL eingelesen
  (keine Doppelten)
- nach Plz-Auswahl werden die dazugehörigen Gemeinden in STADT per ADO-SQL eingelesen
  siehe Plz: 3229 & 3238
https://www.herber.de/bbs/user/97015.zip
Gruß von Luschi
aus klein-Paris

Anzeige
AW: combobox mit recordset befüllen die 800ste
13.04.2015 12:11:11
Wusel
Hallo Luschi,
vielen Dank für Deine Hilfe und Zeit! Ich bin am Wochenende leider nicht dazu gekommen mir das hier anzuschauen - aber jetzt :)
Deine Funktion macht im Prinzip schon alles was ich möchte, nur kommt sie mit einem "kleinen" Problem, das ich nicht zu lösen vermag :( Nämlich die Tastatureingabe einer PLZ durch den Anwender.
In Deinem Code habe ich das hier gefunden und ich vermute Du versuchst das damit abzufangen:
Application.SendKeys "~", False
Diese Lösung funktioniert bei mir leider nicht. Ich erhalte immer Fehler 3021, sobald ich eine Zahl in PLZ eintippe :( Hast Du vielleicht eine Idee woran das liegen könnte?
Grüße
Wusel

Anzeige
AW: combobox mit recordset befüllen die 800ste
13.04.2015 17:26:43
Luschi
Hallo Wusel,
habe jetzt noch Folgendes eingebaut:
- bei der Eingabe der PLZ per Tastatur, wird bei neu eingegebenen Ziffer geprüft,
  ob es eine PLZ mit der beginnenden Ziffernfolge überhaupt gibt
- wenn nein - dann kommt eine Fehler-/Hinweismeldung
- wenn ja - dann wird die Liste der PLZ neu eingelesen mit der beginnenden Ziffernfolge
und in der PLZ-Liste stehen dann nur noch diese Werte (diese wird auch aufgeklappt)
- ist die PLZ dann 4-stellig (warum nicht 5-stellig - wir Ossis müssen uns doch
für die führende '0' nicht ärgern!)
dann werden die dazugehörigen Orte rausgesucht
https://www.herber.de/bbs/user/97058.zip
Gruß von Luschi
aus klein-Paris

Anzeige
AW: combobox mit recordset befüllen die 800ste
13.04.2015 17:54:30
Luschi
Hallo Wusel,
habe noch eine Kleinigkeit verändert;
- gibt es zu 1er PLZ mehrere Orte, dann wird die Stadliste automatisch aufgeklappt
- wird eine falsche Ziffer in PLZ eingegeben, wird nach der Warnmeldung die letzte
  Ziffer automatisch gelöscht.
https://www.herber.de/bbs/user/97059.zip
Gruß von Luschi
aus klein-Paris

Anzeige
AW: combobox mit recordset befüllen die 800ste
13.04.2015 19:07:13
Wusel
Awww Luschi Du bist ein Genie!
Vielen, vielen Dank! Ich glaube bis ich auf das alles gekommen wäre, hätte ich noch einige graue Haare angesetzt! :) Ich habe nur noch eine letzte Frage, weil ich ja - wie Du sicher gemerkt hast - bei Weitem kein Vorzeigeprogrammierer bin :) Deine Umstellung von early auf late binding ist das eine reine Vorliebe oder Gewohnheit oder was veranlasst Dich dazu?
Danke schonmal für Deine Antwort!
Grüße!
Wusel

Anzeige
AW: combobox mit recordset befüllen die 800ste
13.04.2015 19:24:24
Luschi
Hallo Wusel,
'Late Binding' hat diese Nachteile:
- es gibt keine IntelliSense-Unterstützung beim Programmieren.
- beim Kompilieren kann keine Syntax-Prüfung vorgenommen werden.
- es können keine eingebauten Konstanten verwendet werden.
  diese müssen durch eigene Variablen und deren Werte ersetzt werden
- etwas langsamer, da erst die Bibliothek (Com-Schnittstelle) zur Laufzeit initialisiert werden muß
hat aber 1en entscheidenden Vorteil:
Wenn die Anwendung auf einem anderen Rechner ausgeführt wird, auf dem nicht die gleiche Version der Bibliothek installiert ist, sind keine Probleme zu erwarten uns der Vba-Code läuft trotzdem; d.h., dieses Programm läuft auch auf einem Rechner mit WindowsXP & ExcelXP.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: combobox mit recordset befüllen die 800ste
14.04.2015 20:37:02
Wusel
Super! Das verstehe sogar ich! Danke nochmals :)
;
Anzeige
Anzeige

Infobox / Tutorial

Combobox mit Recordset befüllen in Excel


Schritt-für-Schritt-Anleitung

Um eine Combobox in Excel mit einem Recordset zu befüllen, folge diesen Schritten:

  1. Erstelle ein Userform:

    • Öffne den VBA-Editor (Alt + F11).
    • Füge ein neues Userform hinzu.
  2. Füge eine Combobox hinzu:

    • Ziehe eine Combobox auf das Userform.
  3. Schreibe die SQL-Abfrage:

    • Definiere deine SQL-Abfrage, um die benötigten Daten zu erhalten. Beispielsweise:
      selectstr = "SELECT [STADT] FROM [Stadtinformationen_allgemein$] WHERE PLZ = 4626"
  4. Erstelle die Funktion zur Datenabfrage:

    • Implementiere die testfunktion, um das Recordset zurückzugeben:
      Function testfunktion(strsqlselect As String) As ADODB.Recordset
       Dim oAdoConnection As New ADODB.Connection
       Dim oAdoRecordset As New ADODB.Recordset
       Dim sAdoConnectString As String, sPfad As String
       On Error GoTo Fehler
       sPfad = ThisWorkbook.FullName
       sAdoConnectString = "Provider=Microsoft.ACE.OLEDB.12.0; Extended Properties='Excel 12.0 Xml;HDR=YES';Data Source=" & sPfad
       oAdoConnection.Open sAdoConnectString
       With oAdoRecordset
           .Source = strsqlselect
           .ActiveConnection = oAdoConnection
           .Open
       End With
       Set testfunktion = oAdoRecordset
      Aufraeumen:
       On Error Resume Next
       Exit Function
      Fehler:
       MsgBox "Fehler: " & Err.Description
       Resume Aufraeumen
      End Function
  5. Befülle die Combobox:

    • Verwende das Recordset, um die Combobox mit den Daten zu füllen:
      Do While Not rs.EOF
       Objektanzeige.STADT.AddItem rs.Fields("STADT")
       rs.MoveNext
      Loop

Häufige Fehler und Lösungen

  • Fehler 3021: Dies passiert häufig, wenn die SQL-Abfrage keine Daten zurückliefert. Überprüfe, ob die PLZ korrekt ist und tatsächlich Daten vorhanden sind.

  • Combobox bleibt leer: Stelle sicher, dass der Code, der die Combobox befüllt, nach dem Öffnen des Userforms ausgeführt wird.

  • Verbindungsprobleme: Achte darauf, dass der ADO-Provider korrekt installiert ist. Bei Excel-Versionen unter 2010 könnte es zu Komplikationen kommen.


Alternative Methoden

Eine alternative Methode zum Befüllen von Comboboxen könnte das direkte Arbeiten mit Excel-Tabellen sein, anstatt über ADO:

  1. Daten direkt aus einem Bereich:

    Dim rng As Range
    Set rng = ThisWorkbook.Worksheets("Ziel").Range("A1:A10")
    For Each cell In rng
       If cell.Value <> "" Then
           Objektanzeige.STADT.AddItem cell.Value
       End If
    Next cell
  2. Verwendung von Excel-Formeln: Du könntest auch eine dynamische Liste in einer Zelle erstellen, die die Daten über eine Formel aggregiert.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um die Combobox mit PLZ und Städten zu verknüpfen:

Private Sub PLZ_Change()
    Dim rs As ADODB.Recordset
    Dim selectstr As String
    selectstr = "SELECT [STADT] FROM [Stadtinformationen_allgemein$] WHERE PLZ = '" & Me.PLZ.Text & "'"
    Set rs = testfunktion(selectstr)

    Me.STADT.Clear
    Do While Not rs.EOF
        Me.STADT.AddItem rs.Fields("STADT")
        rs.MoveNext
    Loop
    rs.Close
End Sub

Tipps für Profis

  • Late Binding vs. Early Binding: In vielen Fällen ist es vorteilhaft, Late Binding zu verwenden, um Probleme bei der Ausführung auf verschiedenen Rechnern zu vermeiden.

  • Fehlerbehandlung: Implementiere eine robuste Fehlerbehandlung in deiner Funktion, um potenzielle Probleme sauber zu identifizieren.

  • Optimierung der SQL-Abfragen: Stelle sicher, dass deine SQL-Abfragen optimal sind, um die Performance zu verbessern.


FAQ: Häufige Fragen

1. Wie kann ich die Combobox mit Daten aus einer anderen Quelle als Excel füllen? Du kannst ADO verwenden, um Daten aus verschiedenen Datenquellen wie Access oder SQL Server zu holen.

2. Was ist der Vorteil von ADO gegenüber einer direkten Excel-Datenabfrage? ADO ermöglicht komplexere Abfragen und eine bessere Datenmanipulation, insbesondere bei großen Datenmengen.

3. Wie kann ich sicherstellen, dass die Combobox aktualisiert wird, wenn der Benutzer eine PLZ eingibt? Nutze das Change-Event der PLZ-Combobox, um die Städte dynamisch zu aktualisieren, während der Benutzer eingibt.

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