PDA

Vollständige Version anzeigen : Datenbankabfrage über VBA in Excel


hallo1112
30.06.2015, 15:20
Hi,

ich möchte mehrere Produkte über Excel vergleichen. Die gesamten Daten der Produkte sind in einer SQL-Datenbank. Nun habe ich ein wenig im Internet rechechiert, aber so viele Fachbegriffe gefunden, wie z.B. AOD und sonstige Wörter, die mir grad nicht mehr einfallen.

Kann mir einer ganz leicht erklären, wie ich auf die Datenbank zugreifen kann über Excel/VBA bzw. einfach gut erklärte Links geben. Damit ich einen Startpunkt hab für mein Projekt. Meinen Select werde ich schon mit einer Gruppenschleife denke ich hinbekommen, nur die Verbindung mit der Datenbank über Excel/VBa versteh ich absolut nicht.

Vielen Dank für die Tipps.

Grüße

Michael

Storax
30.06.2015, 16:47
http://www.online-excel.de/excel/singsel_vba.php?f=135
https://www.google.de/search?q=excel+vba+ado&ie=utf-8&oe=utf-8&gws_rd=cr&ei=87mSVd_yIoSQsAH9-4DAAw#q=excel+vba+ado+access+database

ebs17
30.06.2015, 19:03
Meinen Select werde ich schon mit einer Gruppenschleife denke ich hinbekommen
In einer Datenbank dreht man besser keine Schleifen weil ineffizient, sondern primär erstellt man gescheite Abfragen (SQL-Anweisungen). Denn eine Datenbank ist etwas anderes als eine größere Exceltabelle.

hallo1112
01.07.2015, 07:30
In einer Datenbank dreht man besser keine Schleifen weil ineffizient, sondern primär erstellt man gescheite Abfragen (SQL-Anweisungen). Denn eine Datenbank ist etwas anderes als eine größere Exceltabelle.

Ich hab das so gelernt, dass man eine Schleife solange ausführt, bis kein Datensatz mehr übrig ist vom Select. Ist das falsch mit Excel bezogen?

@Storax Danke für den ersten Link. Diesen werd ich mir aufjedenfall genau durchlesen. Beim zweiten Link: Ich hab keine Access-Datenbank. Ist das genau das Gleiche bei der Verbindung mit einer mysql-datenbank in VBA?

Grüße

ebs17
01.07.2015, 07:59
Ich hab das so gelernt ...
Was soll man dazu sagen?

In einer DATENBANK kommen (potentiell) sehr viele Daten vor. Da ist eine Einzel-Abarbeitung per Schleifen dann auch langwierig. Daher benutzt man seit ewigen Zeiten eine eigene Abfragesprache (erster SQL ANSI Standard 1989).
SQL bietet Methoden der Massendatenverarbeitung, die dann das Ganze zeitlich erträglich machen.
Siehe auch Grundlagen - SQL ist leicht (0) - Vorspiel (http://www.ms-office-forum.net/forum/showthread.php?t=317692)

hallo1112
02.07.2015, 08:12
Hallo nochmal,

ich habe aus dem Internet eine Codierung bezogen auf die Verbindung zur Datenbank testweise geripped. Nun bekomme ich einen Laufzeitfehler beim Ausführen.

Laufzeitfehler 91: "Objektvariable oder With-Blockvariable nicht festgelegt". ocn.close wird markiert.

Bisher steht im Modul nur das:

Function Datenverbindung(Server As String, DatabaseName As String, UserId As String, Password As String) As Connection

Dim sConnectionString As String
Dim ocn As New Connection

sConnectionString = "Provider=SQLOLEDB.1;Driver=SQL Server;" & _
"Server=" & Server & ";Database=" & DatabaseName & ";UID=" & UserId & _
";PWD=" & Password
ocn.ConnectionString = sConnectionString
'hier können noch die verschiedensten Einstellungen getroffen werden,
'soll nur als Beispiel dienen
ocn.CursorLocation = adUseClient
ocn.ConnectionTimeout = 60
ocn.CommandTimeout = 60
ocn.Mode = adModeReadWrite
On Error Resume Next
ocn.Open
If Err Then
MsgBox "Verbindung konnte nicht hergestellt werden!", vbCritical, "Bad News"
Exit Function
End If
Set Datenverbindung = ocn

End Function

Sub VerbindungHerstellen()

Dim sUserId As String, sDataBase As String, sServer As String, sPassWord As String
Dim ocn As Connection
Dim orec As New Recordset
Dim sCommand As String

sServer = "test"
sDataBase = "test"
sUserId = "test"
sPassWord = "test"

Set ocn = Datenverbindung(sServer, sDataBase, sUserId, sPassWord)

If Not ocn Is Nothing Then
MsgBox ocn.State, vbInformation, "Good News"
sCommand = "Select * From produkt"
With orec
.Source = sCommand
.ActiveConnection = ocn
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open
End With
While orec.EOF = False
MsgBox orec.AbsolutePosition, vbInformation, "Position"
orec.MoveNext
Wend
End If

ocn.Close

End Sub

Die UserID, Passwort etc. sind richtig eingegeben. Hat jemand einen Tipp?

Grüße

Michael

hallo1112
02.07.2015, 12:36
Kann mir niemand helfen? :(

ebs17
02.07.2015, 12:41
Ich würde denken, ocn ist nur ein Verweis auf die Connection, die in Datenverbindung erstellt wird. An der Stelle kannst du also bestenfalls den Verweis löschen, aber nicht so die Connection schließen.

hallo1112
02.07.2015, 12:59
Ich habs mal gedebugged und mir ist aufgefallen, dass nach dem ocn.Open er dann sofort in den Error mit der MsgBox "Verbindung konnte nicht hergestellt werden" springt. Und mit ocn verweis meinst du ocn.close einfach löschen?

Habe ich so gemacht, funktioniert aber leider immer noch nicht. Heißt das, dass meine eingegebenen Daten, wie id pw, datanbank und serverip nicht passen(weil eigentlich stimmen die überein) und deshalb funktioniert die Verbindung nicht oder muss man irgendwelche Einstellungen in VBA erst einmal machen. Ich habe beispielsweise einen Haken in Microsoft ActiveX Data Objects 6.1. Library rein gemacht bei Verweisen. Muss noch irgendwas angehakt bzw. entfernt werden?

Grüße

hallo1112
03.07.2015, 07:36
Hallo Leute,

habe mittlerweile einen anderen Code, aber es kommt nun wieder eine Fehlermeldung...

Laufzeitfehler 3706:
Der Provider kann nicht gefunden werden. Möglicherweise ist er nicht richtig installiert worden.

Ich sollte noch angeben, dass dieser Mysql-Server auf einer Remotedesktopverbindung liegt, nur leider ist da kein Excel drauf :/
Könnte es daran liegen?

Sub GetDataFromADO()
'Declare variables'
Set objMyConn = New ADODB.Connection
Set objMyRecordset = New ADODB.Recordset
Dim strSQL As String

'Open Connection'
objMyConn.ConnectionString = "Provider=test;Data Source=test; Initial Catalog=MyDatabase;User ID=sa; Password=test;"
objMyConn.Open

'Set and Excecute SQL Command'
strSQL = "select * from kunde"

'Open Recordset'
Set objMyRecordset.ActiveConnection = objMyConn
objMyRecordset.Open strSQL

'Copy Data to Excel'
ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)

End Sub

ios707
03.07.2015, 11:16
Dein ConnectionString ist falsch bzw. entspricht zumindest keinem der Beispiele von MS:
https://msdn.microsoft.com/en-us/library/ms807027.aspx
Ansonsten, was ist denn das eigentlich für ein Server MS SQL oder MySQL oder Oracle oder? Mit dieser Info auch hier nachschauen:
http://www.connectionstrings.com/

Ganz wild geraten: Als Provider mal "MSDASQL" eintragen.

hallo1112
03.07.2015, 12:35
Vielen Dank für deine Antwort. Es ist eine MSSQL-Datenbank.

Ich werde mir mal deine Links anschauen.

EDIT: Wenn ich provider zu MSDASQL ändere, kommt ein Laufzeitfehler -2147467259 :D

[Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben

FAZIT: Habs gelöst. Es lag daran, dass provider nicht MSDASQL war und weil der server auf ner remotedesktopverbindung war, habs aufn lokalen probiert und jetzt funzt es. DANKE allen beteiligten