2016-06-09 26 views
1

我有一個宏,它將查詢的數據從SQL導出到Excel中的查詢表中。整個過程通過一個宏來完成,並且它已經建立了一個ODBC連接。由於連接已經建立,基本上我所做的只是更新宏中的命令字符串中的一些數據,然後刷新它。當我在電腦上運行它時,一切正常;但是它被同一網絡上的多個人使用。儘管與查詢相關的宏最終對每個人都適用,但除我之外的所有用戶都獲得了「選擇數據源」和用戶名/密碼提示。如何繞過「選擇數據源」提示查詢表w/VBA

有沒有辦法讓我可以設置宏執行,以便所有的用戶都可以運行它而不需要那些提示,也不必在他們的機器上設置ODBC數據源?我一直在尋找幾個小時來看看其他人如何能夠繞過這個提示(例如How to disable the "Select Data source window in VBA"),但是我找到的東西並沒有爲我工作。

下面是如何連接字符串連接當前設置:

"DSN=RTP;UID=J4;Trusted_Connection=Yes;APP=Microsoft Office 2010;WSID=123;DATABASE=C;" 

這裏是我的宏目前的樣子:

Sub Vols_L() 

Application.ScreenUpdating = False 

    Dim cn As WorkbookConnection 
    Dim odbcCn As ODBCConnection, oledbCn As OLEDBConnection 

    Set cn = ActiveWorkbook.Connections("Vols_L") 

    Set ws = Sheets("Setup") 
    Set ws6 = Sheets("L Graph") 
    Set ws7 = Sheets("Queries") 

    Dim Query As String 
    Dim SSD As String 
    Dim SED As String 
    Dim PM As String 
    Dim AD As String 
    Dim ID As String 

    Query = ws7.Range("Vols_L_Query") 
    SSD = ws.Range("SSD").Value 
    SED = ws.Range("SED").Value 
    PM = ws.Range("FOM_PM").Value 
    AD = ws.Range("AD").Value 
    ID = ws.Range("ID").Value 

    Query = Replace(Query, "#SD", SSD) 
    Query = Replace(Query, "#ED", SED) 
    Query = Replace(Query, "#PM", PM) 
    Query = Replace(Query, "#AD", AD) 
    Query = Replace(Query, "#ID", ID) 

    Updates the workbook Connection Depending on Type 
    With cn 
     If .Type = xlConnectionTypeODBC Then 
      Set odbcCn = cn.ODBCConnection 
      odbcCn.CommandText = Query 
      odbcCn.Refresh 

     ElseIf cn.Type = xlConnectionTypeOLEDB Then 
      Set oledbCn = cn.OLEDBConnection 
      oledbCn.CommandText = "Query" 
      oledbCn.Refresh 
     End If 
    End With 

Application.ScreenUpdating = True 

End Sub 

編輯:所以我有很大的問題是,我顯然很愚蠢。我非常感謝你的幫助,但我已經嘗試了下面的回覆中提到的所有不同方法,並且無法讓他們爲我工作。我試着輸入UpdateWorkbookConnection查詢到一個我前面粘貼(它取代一切後評論「更新工作簿連接取決於類型」),因此它看起來像:

UpdateWorkbookConnection ActiveWorkbook.Connections("Vols_L"), Query, "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=C;Data Source=RTP;" 

當我這樣做,雖然,我得到在您的宏點的錯誤,說:

".OLEDBConnection.Connection = ConnectionString" 
+0

也許您可以使用不同的連接字符串,該連接字符串不需要在每臺計算機上預先配置ODBC連接。 – Chuck

回答

2

您使用的是DSN因此,如果用戶沒有自己的機器上配置了你使用它的確切名稱是DSN不會知道要使用什麼。您可以執行DSN-less連接字符串,以便您不必去每臺計算機並設置DSN。

我有時使用一個技巧來構建連接字符串,就是在桌面上用文件擴展名「.udl」創建一個文件。當你雙擊它時,你可以選擇提供者和連接細節並測試連接是否工作。然後,您可以在記事本中打開「.udl」文件並查看構建的連接字符串。

我使用下面的VBA代碼來更改excel命令和/或連接字符串。它運行良好,並防止在某些情況下有時會出現錯誤creates a new connection when modifying a connection

Sub UpdateWorkbookConnection(WorkbookConnectionObject As WorkbookConnection, Optional ByVal CommandText As String = "", Optional ByVal ConnectionString As String = "") 
'example usage 
'UpdateWorkbookConnection ActiveWorkbook.Connections("Connection"), "EXEC sp_procedure"[, "optional connection string here"] 

With WorkbookConnectionObject 
    If .Type = xlConnectionTypeODBC Then 
     If CommandText = "" Then CommandText = .ODBCConnection.CommandText 
     If ConnectionString = "" Then ConnectionString = .ODBCConnection.Connection 
     .ODBCConnection.Connection = Replace(.ODBCConnection.Connection, "ODBC;", "OLEDB;", 1, 1, vbTextCompare) 
    ElseIf .Type = xlConnectionTypeOLEDB Then 
     If CommandText = "" Then CommandText = .OLEDBConnection.CommandText 
     If ConnectionString = "" Then ConnectionString = .OLEDBConnection.Connection 
    Else 
     MsgBox "Invalid connection object sent to UpdateWorkbookConnection function!", vbCritical, "Update Error" 
     Exit Sub 
    End If 
    If StrComp(.OLEDBConnection.CommandText, CommandText, vbTextCompare) <> 0 Then 
     .OLEDBConnection.CommandText = CommandText 
    End If 
    If StrComp(.OLEDBConnection.Connection, ConnectionString, vbTextCompare) <> 0 Then 
     .OLEDBConnection.Connection = ConnectionString 
    End If 
    .Refresh 
End With