2016-06-09 56 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