Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Zugriff mit VBA über ODBC auf mysql-DB

Frage Entwicklung VB for Applications

Mitglied: manuel5

manuel5 (Level 1) - Jetzt verbinden

26.01.2008, aktualisiert 08.02.2008, 31701 Aufrufe, 27 Kommentare

Hallo zusammen,

also ich hab ne VBA-Form - EXCEL - bisher habe ich auf Daten zugegriffen die in den Excel-Tabellen lagen.
Nun habe ich die Daten in eine mySql-DB ausgelagert
Ich moechte nun per VBA mit ODBC auf die Sql-DB zugreifen und da dann per Abfragen Daten holen und mir in der Form - in Textfeld und auch in ComboBoxen etc dementsprechend die Daten anzeigen lassen.

So - also die Form steht - der ODBC steht und die MySql-DB steht auch

Wie geh ich un weiter vor?

Ich habs mals so versucht-->

Private Sub CommandButton5_Click()
Dim Conn, RS
Dim strSender As String
Dim strCompName1 As String
Dim intSQL As Integer


Set Conn = CreateObject("ADODB.Connection")
Conn.Provider = "MSDASQL"
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 3.51 Driver};" & _
"DATABASE=XXXXXXXXX;" & _
"SERVER=localhost;", _
"xxxx;", _
"xxxx;"

Set RS = CreateObject("ADODB.Recordset")
RS.CursorLocation = adUseClient
RS.Source = "SELECT * FROM sender ORDER BY sender "
'oRS.Open "SELECT * FROM sender", oConn
'CompName1 = "Select * FROM sender WHERE CompName1 = 'XXXXXX;"

Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open
RS.Source = strSender
'strSender = RS.Source
'Set Conn = Nothing
MsgBox strSender

RS.Close
Set RS = Nothing

Conn.Close

End Sub



Ok - um ganz ehrlich zu sein - das klappt NULL! Ich habe auch lange Zeit deswegen gegoogelt - aba nichts gefunden

Grundsätzlich geht es mir darum -->

- Wie stelle ich eine Verbindung von VBA zu MySql-DB her (über ODBC)?
- Wie kann ich dann Daten aus der MySql-DB mir anzeigen lassen - Textbox und aber auch in ComboBoxen?
- Nett waere hier kein fertiges Script - eher so --> Schritt a) Recordset definieren- Schritt b) Datenbank verbinden Schritt c) Datenbank öffnen - Schritt d) und so weiter.

Also kein fertiges Script und so -ich wills ja gerne lernen )


Danke euch schon und bis dann

Gruss Manuel
27 Antworten
Mitglied: miniversum
26.01.2008 um 15:28 Uhr
Schau mal ob Dir dashier hilft:
http://www.activevb.de/tutorials/tut_ado_db/adodb.html

miniversum
Bitte warten ..
Mitglied: manuel5
26.01.2008 um 17:41 Uhr
Hallo miniversum,

danke fuer den Tip! Genau sowas hab ich gesucht.
Die Verbindung taucht nun!
Jetzt muss ich nur noch die Daten holen und anzeigen - aber soweit schon mal super Danke

Gruss Manuel
Bitte warten ..
Mitglied: manuel5
26.01.2008 um 20:45 Uhr
Hallo

also ich habs nun mal so versucht -->

Sub Start()
UserForm5.Show

Cn.Provider = "SQLOLEDB.1"
Cn.ConnectionString = "Password=xxx;" & _
"Persist Security Info=True;" & _
"User ID=xxxx;" & _ (<-- Benutzer)
"Initial Catalog=XXXXXXXXXXX;" & _ (<---ist dies die Datenbank?)
"Data Source=XXXXXXX" (<-- und hier die Tabelle?)
End Sub



somit - denke ich - sollte sich beimStarten des Forms eine Verbindung zur Datenbank aufbaun - hoffe ich liege recht in meiner Annahme)


Ok - wie kann ich nun "checken" ob die Verbindung steht?

Habe mal nen Button gemacht der mir eine Tabelle in einer msgbox ausgeben soll - eben nur um zu checken - aba da passiert nuescht ((


Private Sub CommandButton5_Click()
'Dim Rs As New ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT * FROM XXXXXX LIMIT 100"

MsgBox strSQL
End Sub


Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
31.01.2008 um 16:47 Uhr
hi wenn du ein recodset füllen willst geht das ein wenig anders. Dein sqlstring enthält nur das select da weiß die datenbank noch nichts von. Hier mal ein Beispiel. Das findest du aber auch in jedem guten VB uch.


DB Connection
verbindung zur ODBC Schnittstelle
01.
Set condb = New ADODB.connection 
02.
condb.Open "Provider=MSDASQL.1;DATA SOURCE=admintooldb"
01.
Dim rec as ADODB.RECORDSET 
02.
 
03.
Set rec = New ADODB.Recordset 
04.
 
05.
rec.CursorLocation = adUseClient 
06.
 
07.
rec.Open "select * from T_BEFEHLE ORDER BY namebefehl ", condb, adOpenForwardOnly, adLockReadOnly 
08.
 
09.
 
10.
while not rec.eof  
11.
 
12.
 msgbox(rec.fields(1)) 
13.
 
14.
 
15.
WEND 
16.
 

Schließen der Verbindung
01.
condb.Close
Bitte warten ..
Mitglied: manuel5
01.02.2008 um 14:38 Uhr
WAHNSINNNNNN!!!!!!!!!

Es löfft! Super DANKE!

Nur den Provider ausgetauscht und schon funtzt es!

Super!

Gruss Manuel
Bitte warten ..
Mitglied: manuel5
02.02.2008 um 09:24 Uhr
Hallo nochmal,

nun is es so das mir das ganze in eine Endlosschleife geht und ich nur über den Taskmanager dies abschiessen kann.

While Not rec.EOF
MsgBox (rec.Fields(2))
Wend

Eigentlich klar - aba wie kann ich das verhindern? Er soll ja nur die Select-Abfrage "finden" --> anzeigen --> und gut is!


Hätte Ihr da evetnl noch ne Idee wie ich das verhindern kann?

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
02.02.2008 um 15:30 Uhr
japp hier musst du natürlich noch ein rec.movenext machen. sorry.


01.
'Bleibe in der Schleife so lange das Recordset nicht EOF ( End of File ) erreicht hat 
02.
While Not rec.EOF 
03.
'Ausgabe des 3 Feldes Des Recordsetsobjektes 
04.
MsgBox (rec.Fields(2)) 
05.
 
06.
'Wenn Das dritte Feld gleich der Bedingung ist dann springe zu exit 
07.
if rec.Fields(2) = Bedingung then goto exit 
08.
 
09.
'Lese nächsten Datensatz aus dem Recordset 
10.
rec.movenext 
11.
Wend 
12.
'Ausgangspunkt für den GoTo 
13.
exit: 
14.
 
15.
'Weiterer Quellcode
lese das gerade. Du musst natürlich um das Recordset anzuzeigen nicht erst die Whileschleife durchlaufen.
Kannst auch direkt ein Datagrid oder ein MSHFlexgrid auf deine Form ziehen und dann diesem das Recordset als Datasorce zuweisen.

Als Beispiel
01.
With Datagrid 
02.
 
03.
.....Weitere Eigenschaften fürs Datagrid 
04.
.enable = true 
05.
.datasourde = rec 
06.
 
07.
 
08.
end with 
09.
 
10.
oder einfach Datagrid.datasource = rec 
11.
 
12.
 
Bitte warten ..
Mitglied: manuel5
02.02.2008 um 16:54 Uhr
Hallo,

ja - das schaut gut aus - bzw logisch
Aber was meinst du mit "Bedingung"? true oder false?

also wenn rec.Fields is true dann goto exit -->
wenn nicht rec.movenext solange bis die Bedingung erfuellt ist...

aber diesen "Ausgangspunkt für den GoTo versteh ich ned

exit: <-- und weiterer Quellqode? das versteh ich ned wirklich

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
02.02.2008 um 18:00 Uhr
also nehmen wir an dein Datansatz in der DB sieht folgendermaßen aus

"Andrea" "Guenter" "15.10.1969" "weiblich"
"Sven" "Guenter" "22.07.1971" "maennlich"

diese liest du nun aus mit
'Bedingung für eine Anzeige ist das die alle haben willst die maennlich sind

01.
WHILE NOT rec.EOF 
02.
 
03.
IF rec.(Fields(3)) = maennlich then GoTo exit 
04.
 
05.
 
06.
rec.MoveNext 
07.
WEND 
08.
exit: 
09.
msgbox(rec(fields(3))
In diesem Beipiel
Wird sobald ein Datensatz gefunden wurde der maennlich enthält zum Punkt exit gesprungen und das Attribut maennlich wird ausgegeben.
Wenn du aber alles anzeigen lassen willst was das Recordset enthält solltest du dir ein DataGrid auf deine Form ziehen und diesem Datagrid dein Recordset als Datenquelle angeben und zwar folgendermaßen. ( Hier kannst du die Whileschleife weglassen )

01.
DataGrid.Datasource = rec
Beim starten deines Programmes werden nun alle Datensätze die dein Recordset enthält im DataGrid angezeigt.
Bitte warten ..
Mitglied: manuel5
02.02.2008 um 18:57 Uhr
Hallo,

ich hab meine SELECT-Abfrage nun so gemacht -->
rec.Open "SELECT * from *tabelle* WHERE *feld* = '0_0' ", condb, adOpenForwardOnly, adLockReadOnly


So dann findet er mit die Zeile in der 0_0 steht und gibt mir davon das 3 Feld aus - hier is es der Name - aba das is ja egal....es klappt

Also - der DB Zugriff/Verbindung passt - Die Suche/Select passt auch
Mit dem Grid hab ich das ganze mal begonnen - das stimmt schon is auch ne gute Sache - aba ich will lieber auf die SQL drauf

Was mach ich aber nun wenn ich zum Beispiel in einer ComboBox alle Daten die in der Spalte Namen stehen dort mir ausgeben will?

Private Sub ComboBox6_Change

dim blablabla
...
...
ComboBox6.Value = (rec.Fields(2))


hmmm- das fehlt im ein Objekt.

Textbox6.Value funtzt ja auch....

Gruss Manuel
Bitte warten ..
Mitglied: SvenGuenter
03.02.2008 um 23:19 Uhr
^^ also das erkläre ich dir morgen nun geh ich erstmal in die heia...


schau dir aml die additem methode an die macht das ;o)
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 08:03 Uhr

Klar - schlafen darfste auch mal! So bin ich ja garned.

Also mit dem additem hab ichs natuerlich zuallerganzerst versucht. Da meldet er mir
"Ein Objekt das dem angeforderten Namen oder dem Ordinalverweis entspricht, kann nicht gefunden werden"

?

Ich denk mal - das ich anstatt der Fields hier in etwa Rows oder Columns angeben muss.....denk ich!

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 08:28 Uhr
so ein neuer Tag und hier erstmal der schnippsel für dich.

01.
 
02.
'Recordset auf den ersten Datensatz setzen 
03.
rec.MoveFirst 
04.
 
05.
'Schleife durchlaufen bos ende der Datensätze erreicht ist 
06.
While Not rec.EOF 
07.
'Datenfeld im Combofeld anzeigen 
08.
Me.Combo1.AddItem (rec.Fields(1)) 
09.
'Nächsten Datensatz lesen 
10.
rec.MoveNext 
11.
Wend 
12.
 
13.
 
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 08:33 Uhr

Textbox6.Value funtzt ja auch....




Eine Frage am Rande. Reden wir von VB6 oder VB.net?

Meines Wissens nach unterstützt eine Textbox in VB6 kein .Value sondern nur .net ;o)

Gruß

Sven
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 08:55 Uhr
Hallo,

nein nein nicht von .Net

aba auch nicht von VB6 - sondern von VBA...

Aba das sollte ja nicht das Problem ansich sein.


Set condb = New ADODB.Connection
condb.Open "DRIVER=MySQL ODBC 3.51 Driver; SERVER=localhost; DATABASE=meineDatenbank;USER=XXXX;PASSWORD=XXXX;"
Dim rec As ADODB.Recordset
Set rec = New ADODB.Recordset
rec.CursorLocation = adUseClient
rec.Open "SELECT * from tabelle WHERE blablabla = blablabla", condb, adOpenForwardOnly, adLockReadOnly
rec.MoveFirst
While Not rec.EOF

Me.ComboBox6.AddItem (rec.Fields(2))
If rec.Fields(2) = True Then
End If
rec.MoveNext
Wend
condb.Close


Hmmm - selbe Fehlermeldung wie oben...

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 10:26 Uhr
Und sicher das diese ComboBox acuh ComboBox6 heißt?
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 10:31 Uhr
Absulut!
Habs nochmal gecheckt

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 10:39 Uhr
und dein recordset auch 3 felder hat?

Denk dran das das recordset bei 0 anfängt.

und zwar immer.

wenn dein Recordset irgendwann nur 2 Datenteile erhält bekommst du einen fehler weil er das Rec.Fields(2) nicht findet weil nicht vorhanden
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 10:46 Uhr
Äh? Was meinst du damit? Mein Recordset also meine Tabelle?
Oder versteh ich dich jetzt total falsch?

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 11:00 Uhr
du machst ein select welches dein Recordset füllt.

01.
 
02.
rec.Open "SELECT * from *tabelle* WHERE *feld* = '0_0' ", condb, adOpenForwardOnly, adLockReadOnly
frage ist nun ob dieses Recordset immer so aussieht

Wert1,Wert2,Wert3 das entspricht im Recordset Rec.Fields(0),Rec.Fields(1),Rec.Fields(2)

Sprich das dein Wert3 Immer gefüllt ist. Grund ist folgender wenn dein Recordset irgendwann auf einen Wert3 trifft der nicht gefüllt ist bekommtst du die Fehlermeldung da dein Rec.Fields(2) nothing ist und somit kein Objekt welches die ComboBox aber bracuht um was anzeigen zu können.
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 11:07 Uhr
Jop - das hab ich grad geaendert Habe jetzt Fields (0) genommen da is alles voll

Jetzt wenn ich die Daten reinschieben will bringt er mir die Meldung "Nicht näher bezeichneter Fehler"

Kann es sein das es zuviele Daten sind?
Also er soll mir "nur" die Spalte 1 (bzw 0) in der Combobox anzeigen ......

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 13:00 Uhr
japp wenn du mehr als 2000 Zeichen hast ( also alle zeichen der Einträge ) dann macht VBA nicht mehr mit.

Muss das eine Combobox sein die du da benutzt?
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 13:33 Uhr
Hmmm - da bin ich doch relativ offen
Es sollte ein Auswahl-Feld ......hmmm - also er soll mir hier die ganzen Firmennamen anzeigen - bzw - Ich möchte hier die Firma auswählen können.
Könnte also ne Textbox sein im Grunde - die mir dann die Select-Abfrage direkt macht

Also wenn das Textbox1 ist - dann nen Commandbutton daneben der dann sagt - Select CombName1 from *tabelle" where CombName1 = Textbox1

Könnte so so funtzen oder?

Dann halt textbox2 und textbox3 in denen ich die Daten einfuellen lassen
Praktisch - wenn der die Abrage erfolgreich getaetigt hat soll er mir CombName1 in Textbox2 und Strasse1 in Textbox3 einfuellen - also eingeben!

Und ne Chance mit Combobox hab ich garned?

Gruß Manuel
Bitte warten ..
Mitglied: SvenGuenter
04.02.2008 um 13:54 Uhr
wenn du über 2000 zeichen kommst wohl nein.

Tut mir leid. Ich überlege mir mal was mit einer Listbos. Aber das fuellen geht genau so wie mit einem Comboboxfeld.


welche Excel Version nutzt du denn?

Gruß

Sven
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 14:51 Uhr
Hmmmmmm - ok - ich versuchs auch...... irgendwie muss es gehen!

Danke und Gruß

Manuel
Bitte warten ..
Mitglied: manuel5
04.02.2008 um 19:12 Uhr
Hallo,

habs soweit hinbekommen - NUR!! zeigt er mir erst zig Zeilen leer an und faengt dann irgendwann mal aufzulisten - also genau die Felder die ich brauch
Das is seltsam - warum tut er m ir ned gleich von vornherein richtig die Daten wiedegeben?

Private Sub CommandButton5_Click()
Set condb = New ADODB.Connection
condb.Open "DRIVER=MySQL ODBC 3.51 Driver; SERVER=localhost; DATABASE=datenbank;USER=xxxx;PASSWORD=xxxx;"
Dim rec As ADODB.Recordset
Set rec = New ADODB.Recordset
rec.CursorLocation = adUseClient
rec.Open "SELECT * FROM `table`ORDER BY `feld1`.`feld2` ", condb, adOpenForwardOnly, adLockReadOnly

rec.MoveFirst
While Not rec.EOF
ComboBox6.AddItem (rec.Fields(3))
rec.MoveNext
Wend

condb.Close

End Sub
Bitte warten ..
Mitglied: manuel5
08.02.2008 um 10:46 Uhr
Hallo Sven,

soweit steht die "Datenbank-Excel-Form-Sache" nun!
Nur noch hier und da ne Kleinigkeit.

Danke dir für deine Geduld und deiner Hilfe!
Hast mich echt weitergebracht.
Danke dir!

Gruß Manuel
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Webbrowser
gelöst Daten in entfernte Mysql DB schreiben (3)

Frage von nullacht15 zum Thema Webbrowser ...

VB for Applications
gelöst VBA Skript funktioniert auf lokalen Zugriff, aber nicht auf Netzwerkshare (1)

Frage von Dr.Cornwallis zum Thema VB for Applications ...

VB for Applications
gelöst Zugriff auf Datei auf Sambalaufwerk mit VBA(Execl) (3)

Frage von qwertz1 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...