2016-10-31 2 views
0

Lassen Sie mich damit beginnen zu sagen, ich bin neu auf dieser Website sowie VBA so bitte bitte mit mir. Vielen Dank im Voraus für Ihre Hilfe.Excel VBA Ausführen von Access Query, die Links zu Oracle

Ich habe eine VBA-Funktion, die eine vorhandene Abfrage von Access ausführt. Einige der abgefragten Tabellen werden in einer Oracle-Datenbank gespeichert, die einen benutzerspezifischen Kennwortzugriff erfordert. Im Moment ruft ein Sub, das ich zum Automatisieren eines Berichts geschrieben habe, diese Funktion sieben Mal auf und fordert den Benutzer auf, jedes Mal, wenn die Funktion aufgerufen wird, sein Oracle-Passwort einzugeben (es stoppt auch das Sub und gibt eine Fehlermeldung aus, wenn sie das Passwort falsch eingeben) was ich als wahrscheinliches Ereignis sehe, wenn sie es 7 Mal tun müssen). Der Code funktioniert, aber ich würde gerne einen Weg finden, den Code einmal nach dem Passwort fragen zu lassen und damit fertig zu werden. Alle Lösungen, die ich gefunden habe, beziehen sich auf die direkte Verbindung mit und die Abfrage von Oracle, was eine sehr komplizierte SQL-Codierung erfordert, die ich auf keinen Fall schreiben kann.

Ich habe auch ein Problem, wo die Spalten in der Excel-Tabelle in einer anderen Reihenfolge als in Access für einige der Abfragen angezeigt werden. Dies scheint konsistent zu sein, so dass es kein großes Problem darstellt, aber ich würde gerne wissen, wie dies verhindert werden kann, um zukünftige Probleme zu vermeiden.

Hier ist der Code für die Funktion, die ich derzeit verwende. Jeder Einblick würde sehr geschätzt werden!

Option Explicit 

'Single Argument "qryName" as string. Runs access qry and copys recordset to active sheet. 
Function AccessQueryPull(qryName As String) 

'Declare variables 
Dim rs As ADODB.Recordset 
Dim cn As ADODB.Connection 

'open the connection to the access database 
Set cn = New ADODB.Connection 
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=filePath.accdb;" 

'format the command to run the query 
Dim cmd As New ADODB.Command 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = qryName 
cmd.ActiveConnection = cn 

'execute the query 
Set rs = New ADODB.Recordset 
Set rs = cmd.Execute() 

'copy data to excel sheet 
ActiveSheet.Cells(2, 1).CopyFromRecordset rs 

'Cleanup 
rs.Close 
Set rs = Nothing 
+0

Warum rufen Sie die Funktion sieben Mal an? Und bitte zeigen Sie das Sub, das diese Funktion aufruft. – Parfait

+0

Ich rufe die Funktion 7-mal im Subsystem an, da für jedes unserer Werke separate historische und vorausschauende Queries bereits im Zugriff eingerichtet sind, sowie eine Abfrage, die das Cut-off-Datum für die vorausschauenden Queries auf Basis von Anlagenplänen ermittelt. Das Sub ist einfach. Es setzt nur Variablen = auf Qry-Namen, löscht vorhandene Daten, führt einige Berechnungen durch, formatiert Diagramme usw. Gibt es Möglichkeiten, eine nicht definierte Anzahl von Abfragen mit dieser Funktion auszuführen, sodass sie nur einmal aufgerufen werden kann? –

Antwort

0

Der Grund, warum Sie jedes Mal für Oracle-Anmeldeinformationen aufgefordert wird, ist, dass Sie eine frische, neue Verbindung zu MS Access jedes Mal, wenn die Funktion aufgerufen wird, erstellen.

Behalten Sie einfach die MS Access-Verbindung, indem Sie einmal in der Sub, die Funktion aufruft und Verbindungsobjekt als Parameter übergeben. Auf diese Weise wird jeder Verbindungsfehler in der übergeordneten Routine abgefangen. Wie bei der Spaltenreihenfolge deklarieren Sie einfach die Spalten in der benötigten Reihenfolge in der SQL-Anweisung.

Sub RunQueries() 
    Dim rs As ADODB.Recordset 
    Dim cn As ADODB.Connection 

    'open the connection to the Access database 
    Set cn = New ADODB.Connection 
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=filePath.accdb;" 

    Call AccessQueryPull(cn, "SELECT Col1, Col2, Col3 FROM Qry1") ' AND OTHER 6 CALLS 

    cn.Close 
    Set cn = Nothing  
End Sub 

Function AccessQueryPull(accConn As ADODB.Connection, qryName As String)  
    'format the command to run the query 
    Dim cmd As New ADODB.Command 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = qryName 
    cmd.ActiveConnection = accConn 

    'execute the query 
    Set rs = New ADODB.Recordset 
    Set rs = cmd.Execute() 

    'copy data to excel sheet 
    ActiveSheet.Cells(2, 1).CopyFromRecordset rs 

    'Cleanup 
    rs.Close 
    Set rs = Nothing: Set cmd = Nothing 
End Function 
+0

Danke, das hat für das Anmeldungs-Problem funktioniert. Ich habe Ihre Lösung für die Spaltenreihenfolge nicht versucht, da die SQL für die Abfragen, die ich ausführe, sehr kompliziert ist. Ich habe einen Weg gefunden, Spaltenköpfe zusammen mit den Daten zu ziehen, die meinen Zwecken dienen. Danke für die Hilfe. –

Verwandte Themen