Ich mache ueber VBA eine Datenbank(Oracle) Abfrage und moechte diese in ein Excel-Sheet einfuegen. Die Daten werden auch korrekt angezeigt aber die Spaltennamen bekomm ich nicht hin. Hab auch schon gegoogelt und hier geschaut aber klappt alles irgendwie nicht.
Vielleicht kann wer mein Programm ergaenzen.
Sub connectiontest()
On Error GoTo fehler
Dim conn As New Connection
Dim comm As New Command
Dim rec As New Recordset
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(„Sheet2“)
schraub das doch mal mit Überschrift und Daten zu einem kompletten, lauffähigen Beispiel zusammen und poste das hier. So etwas wird häufiger gefragt, wenn ich das komplett zusammen habe, würde ich daraus gern eine FAQ bauen.
Do Until rst.EOF
ActiveSheet.Cells(i, 1).Value =
rst.Fields(„Name“).Value
rst.MoveNext
i = i + 1
Loop
Hi, habs gerade ausprobiert, klappt aber leider nicht.
Die Ueberschriften werden nicht angezeigt und ich muss fuer „Name“ den Spaltennamen eintragen (sehr umstaendlich…vielleicht gibts da ja auch was mit …=rst.Fields("*").Value oder so.
Do Until rst.EOF
ActiveSheet.Cells(i, 1).Value =
rst.Fields(„Name“).Value
rst.MoveNext
i = i + 1
Loop
Hi, habs gerade ausprobiert, klappt aber leider nicht.
Die Ueberschriften werden nicht angezeigt und ich muss fuer
„Name“ den Spaltennamen eintragen (sehr
umstaendlich…vielleicht gibts da ja auch was mit
…=rst.Fields("*").Value oder so.
Hi Heinzl,
sorry, mangels Oracle kann ich nix testen.
Wie wär es mit
=rst.Fields(i)
=rst.Fields(i).Name
Alternativ von Oracle heraus eine von Excel lesbare Datei erzeugen.
Oder von Oracle heraus nach Excel „senden“
Ich mache ueber VBA eine Datenbank(Oracle) Abfrage und moechte
diese in ein Excel-Sheet einfuegen. Die Daten werden auch
korrekt angezeigt aber die Spaltennamen bekomm ich nicht hin.
Hab auch schon gegoogelt und hier geschaut aber klappt alles
irgendwie nicht.
kostenlos testbarer (dann 35 €) Datenviewer der u.a. Oracle DBs und Excel Tabellen anzeigen und synchronisieren kann, was ja wohl bedeutet, bei leerer Exceltabelle kopiert er von Oracle nach Excel:
Der Code ist sicherlich nicht der Beste aber wenn sich wer besser mit VBA auskennt kanns ja verbessern und hier posten.
Sub DBAbfrage()
On Error GoTo fehler
Dim conn As New Connection
Dim comm As New Command
Dim rec As New Recordset
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet2")
'Connection String
conn.Provider = "MSDASQL.1:stuck\_out\_tongue\_winking\_eye:assword=PW:stuck\_out\_tongue\_winking\_eye:ersist Security Info=True;User ID=ID ;Data Source=Source"
conn.Open
LoginConnect = True
Set comm.ActiveConnection = conn
'SQL-Befehl
comm.CommandText = \_
"SELECT \* FROM irgendwas"
'Record
rec.Open comm
'der entscheidende Teil fuer die Spaltennamen als Ueberschrift
i = 0
ed = rec.Fields.Count - 1
For i = 0 To ed
ActiveSheet.Cells(1, i + 1).Value = rec.Fields.Item(i).Name
Debug.Print rec.Fields.Item(i).Name
Next
'uebertrag der restlichen Daten ins Excel-Sheet2
ws.[a2].CopyFromRecordset rec
'Close
rec.Close: conn.Close
fehler:
LoginConnect = False
End Sub
[MOD] Pre-Tags eingefügt
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
schraub das doch mal mit Überschrift und Daten zu einem
kompletten, lauffähigen Beispiel zusammen und poste das hier.
So etwas wird häufiger gefragt, wenn ich das komplett zusammen
habe, würde ich daraus gern eine FAQ bauen.
Hi, ich habs jetzt.
Der Code ist sicherlich nicht der Beste aber wenn sich wer
besser mit VBA auskennt kanns ja verbessern und hier posten.
Hallo Heinzl, Rainer,
am Code sehe ich erst mal so auf die Schnelle nichts was verbessert werden könte, klar das Debug.Print raus und optisch komprimieren, ggfs auskommentieren was da was macht pro Zeile. Das ist aber alles nicht so wichtig.
Es gibt aber ein Problem, der Code läuft so natürlich nicht bei Anderen.
Grund ist(sind) fehlende Verweise.
Schon Dim conn As New Connection wird bemeckert, weil unbekannteer Typ.
@Rainer, ich weiß jetzt nicht ob man Verweise in VB6 kennt, sind halt Verweise auf DLLs o.ä. wo halt z.B. „Connection“ als Variablentyp bekannt gemacht, definiert, deklariert, sonstwas, wird.
Um den Code überhaupt für alle brauchbar zu machen, müßte man schon wissen welche Verweise da gesetzt werden müssen.
Und die Angabe der Excelversion mit der er bei dir läuft ist wichtig.
Vielleicht auch die Oracleversion.
schraub das doch mal mit Überschrift und Daten zu einem
kompletten, lauffähigen Beispiel zusammen und poste das hier.
So etwas wird häufiger gefragt, wenn ich das komplett zusammen
habe, würde ich daraus gern eine FAQ bauen.
Hi, ich habs jetzt.
Der Code ist sicherlich nicht der Beste aber wenn sich wer
besser mit VBA auskennt kanns ja verbessern und hier posten.
Hallo Heinzl, Rainer,
am Code sehe ich erst mal so auf die Schnelle nichts was
verbessert werden könte, klar das Debug.Print raus und optisch
komprimieren, ggfs auskommentieren was da was macht pro Zeile.
Das ist aber alles nicht so wichtig.
Debug.Print raus stimmt
Es gibt aber ein Problem, der Code läuft so natürlich nicht
bei Anderen.
Grund ist(sind) fehlende Verweise.
Schon Dim conn As New Connection wird bemeckert, weil
unbekannteer Typ.
Available References:
Visual Basic For Applications
Microsoft Excel 11.0 Object Library
OLE Automation
Microsoft Office 11.0 Object Library
Mocrosoft ActiveX Data Objects 2.7 Library
Datenbank ist eine Oracle 9i
und ODCB treiber ist auch noch installiert.
@Rainer, ich weiß jetzt nicht ob man Verweise in VB6 kennt,
sind halt Verweise auf DLLs o.ä. wo halt z.B. „Connection“ als
Variablentyp bekannt gemacht, definiert, deklariert, sonstwas,
wird.
Um den Code überhaupt für alle brauchbar zu machen, müßte man
schon wissen welche Verweise da gesetzt werden müssen.
Und die Angabe der Excelversion mit der er bei dir läuft ist
wichtig.
Vielleicht auch die Oracleversion.
Gruß
Reinhard
Mehr weiss ich jetzt auch nicht, hab mir die sachen halt im Internet und beim Kofler zusammengesucht
Um den Code überhaupt für alle brauchbar zu machen, müßte man
schon wissen welche Verweise da gesetzt werden müssen.
Und die Angabe der Excelversion mit der er bei dir läuft ist
wichtig.
Vielleicht auch die Oracleversion.
Mehr weiss ich jetzt auch nicht, hab mir die sachen halt im
Internet und beim Kofler zusammengesucht
Hallo Heinz,
kein Problem, ruf ich halt bei Kofler an und frage welche Excelversion du hast.
PS: wer issen das überhaupt, hab grad keine Telefonnummer von ihm
Okay, spar mir den Anruf, aufgrund der Verweise ist es XL2003.
Hi ich habs nicht zuhause testen koennen aber ich wurde es noch so ergaenzen:
dim Conn As ADODB.Connection
dim Rs As ADODB.Recordset
set Conn = new ADODB.Connection
Conn.ConnectionString = "Provider=MSDAORA:stuck\_out\_tongue\_winking\_eye:assword=deinpass;User ID=deinuser;Data Source=deindatabase"
Conn.Open
set rs = new ADODB.Recordset
rs.open "select \* from tbl"
for i = 0 to rs.fields.count - 1
ActiveSheet.Cells(1, i + 1).Value = rs.Fields.Item(i).Name
next i
'weitere aufgaben wie z.B.
dim counter as integer
counter = 2
do until rs.eof
for i = 0 to rs.fields.count - 1
ActiveSheet.Cells(counter, i + 1).Value = rs(i)
next i
counter = counter + 1
rs.movenext
loop
rs.close
Conn.close
set rs=nothing
set conn=nothing
cheers
[MOD] Pre-Tags eingefügt
woolli.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Es gibt aber ein Problem, der Code läuft so natürlich nicht
bei Anderen.
das ist IMO nur eine Zeile die angepasst werden muss, alles andere ist für jede Datenbank zu verwenden, für die ein ODBC-Treiber installiert ist.
Grund ist(sind) fehlende Verweise.
Schon Dim conn As New Connection wird bemeckert, weil
unbekannteer Typ.
@Rainer, ich weiß jetzt nicht ob man Verweise in VB6 kennt,
Ja, klar.
sind halt Verweise auf DLLs o.ä. wo halt z.B. „Connection“ als
Variablentyp bekannt gemacht, definiert, deklariert, sonstwas,
wird.
Um den Code überhaupt für alle brauchbar zu machen, müßte man
schon wissen welche Verweise da gesetzt werden müssen.
Der auf den installierten und aktivierten ODBC-Treiber. Hab’ ich in der Firma für SAPDB gemacht, war auch ohne Anleitung kein Problem. Ich denke, wer den Code hier sucht, hat diese Hürde längst genommen.
Und die Angabe der Excelversion mit der er bei dir läuft ist
wichtig.
Vielleicht auch die Oracleversion.
OK, steht ja jetzt da, ich werde es in der FAQ mit verarbeiten … das werde ich wohl am WE ganz in Ruhe machen …
dim counter as integer
counter = 2
do until rs.eof
for i = 0 to rs.fields.count - 1
ActiveSheet.Cells(counter, i + 1).Value = rs(i)
next i
counter = counter + 1
rs.movenext
loop
So hab ichs jetzt auch gelöst aber Danke nochmal.
Im Endefekt macht wohl
Loesung als Sub
und hier nochmal eine loesung fuer vba. Man kann diese sub in ein modul einbinden und einfach aufrufen wann es benoetigt wird. Ein verweis auf Microsoft ActiveX Data Objects 2.6 oder > wird benoetigt.
Public Sub ExportOracle(xlsSheet As Worksheet, sqlQuery As String, oraConnection As String)
Dim Conn As ADODB.Connection
Set Conn = New ADODB.Connection
Conn.Open oraConnection
Dim Rs, i, counter
Set Rs = Conn.Execute(sqlQuery)
For i = 0 To Rs.Fields.Count - 1
xlsSheet.Cells(1, i + 1).Value = Rs.Fields.Item(i).Name
Next
counter = 2
Do Until Rs.EOF
For i = 0 To Rs.Fields.Count - 1
xlsSheet.Cells(counter, i + 1).Value = Rs(i)
Next
counter = counter + 1
Rs.MoveNext
Loop
Rs.Close
Conn.Close
Set Rs = Nothing
Set Conn = Nothing
End Sub
das ganze kann dann so ausgefuehrt werden:
Private Sub getExport()
Dim strSQL, strConn As String
strSQL = "Select \* from tbl;"
strConn = "Provider=MSDAORA:stuck\_out\_tongue\_winking\_eye:assword=deinpass;User ID=deinuser;Data Source=deindb:stuck\_out\_tongue\_winking\_eye:ersist Security Info=True"
Call ExportOracle(Me.ActiveSheet, strSQL, strConn)
End Sub