修改Microsoft Excel中的embedded式连接stringmacros

我有一个Excel文档,它有一个macros,运行时将修改该连接的CommandText从Excel电子表格传入参数,如下所示:

 Sub RefreshData() ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary") .OLEDBConnection.CommandText = "Job_Cost_Code_Transaction_Summary_Percentage_Pending @monthEndDate='" & Worksheets("Cost to Complete").Range("MonthEndDate").Value & "', @job ='" & Worksheets("Cost to Complete").Range("Job").Value & "'" ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").Refresh End Sub 

我想刷新,不仅修改连接命令,而且还修改连接,因为我想用一个不同的数据库也:

在这里输入图像说明

就像macros使用电子表格中的值replace命令参数一样,我希望它也可以从电子表格中的值中replace数据库服务器名称和数据库名称。

一个完整的实现是不需要的,只需修改与表中的值连接的代码就足够了,我应该能够从那里得到它的工作。

我试图做这样的事情:

  ActiveWorkbook .Connections("Job_Cost_Code_Transaction_Summary") .OLEDBConnection.Connection = "new connection string" 

但是这不起作用。 谢谢。

下面是我的问题的答案。

所有其他的答案大多是正确的,并重点修改当前的连接,但我只想知道如何设置连接上的连接string。

错误归结于此。 如果你看看我的截图,你会看到连接string是:

 Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=ADCData_Doric;Data Source=doric-server5;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=LHOLDER-VM;Use Encryption for Data=False;Tag with column collation when possible=False 

我试图用ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.Connection = "connection string"设置该stringActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.Connection = "connection string"

当我试图将完整的string分配给Connection时,出现错误。 我能够MsgBox当前连接string与该属性,但不设置连接string没有得到错误。

我已经发现连接string需要有OLEDB; 前置到string。

所以这现在工作!

 ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.Connection = "OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=ADCData_Doric;Data Source=doric-server5;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=LHOLDER-VM;Use Encryption for Data=False;Tag with column collation when possible=False" 

非常微妙,但这是错误!

我想你是如此接近实现你想要的东西。

我能够改变ODBCConnection 。 对不起,我不能设置OLEDBConnectiontesting,你可以改变ODBCConnection发生OLEDBConnection你的情况。

尝试添加修改的这2个潜艇,并抛出你需要replace的CommandText连接string 。 注意我把.Refresh更新连接,你可能不需要,直到实际的数据刷新是必要的。

你可以改变其他领域使用相同的想法打破东西,然后join它:

 Private Sub ChangeConnectionString(sInitialCatalog As String, sDataSource As String) Dim sCon As String, oTmp As Variant, i As Long With ThisWorkbook.Connections("Job_Cost_Code_Transaction_Summary").ODBCConnection sCon = .Connection oTmp = Split(sCon, ";") For i = 0 To UBound(oTmp) - 1 ' Look for Initial Catalog If InStr(1, oTmp(i), "Initial Catalog", vbTextCompare) = 1 Then oTmp(i) = "Initial Catalog=" & sInitialCatalog ' Look for Data Source ElseIf InStr(1, oTmp(i), "Data Source", vbTextCompare) = 1 Then oTmp(i) = "Data Source=" & sDataSource End If Next sCon = Join(oTmp, ";") .Connection = sCon .Refresh End With End Sub Private Sub ChangeCommanText(sCMD As String) With ThisWorkbook.Connections("Job_Cost_Code_Transaction_Summary").ODBCConnection .CommandText = sCMD .Refresh End With End Sub 

您可以使用一个函数,将OLEDBConnection和参数更新为input,并返回新的连接string。 它与Jzz的答案类似,但是允许一些灵活性,而无需在每次要更改VBA代码时编辑连接string – 最糟糕的是,您必须为函数添加新参数。

 Function NewConnectionString(conTarget As OLEDBConnection, strCatalog As String, strDataSource As String) As String NewConnectionString = conTarget.Connection NewConnectionString = ReplaceParameter("Initial Catalog", strCatalog) NewConnectionString = ReplaceParameter("Data Source", strDataSource) End Function Function ReplaceParameter(strConnection As String, strParamName As String, strParamValue As String) As String 'Find the start and end points of the parameter Dim intParamStart As Integer Dim intParamEnd As Integer intParamStart = InStr(1, strConnection, strParamName & "=") intParamEnd = InStr(intParamStart + 1, strConnection, ";") 'Replace the parameter value Dim strConStart As String Dim strConEnd As String strConStart = Left(strConnection, intParamStart + Len(strParamName & "=") - 1) strConEnd = Right(strConnection, Len(strConnection) - intParamEnd + 1) ReplaceParameter = strConStart & strParamValue & strConEnd End Function 

请注意,我已经从我用于特定应用程序的现有代码修改了这个,所以它已经部分testing过了,可能需要一些调整才能完全满足您的需求。

还要注意,它也需要一些调用代码,这将是(假设新的目录和数据源存储在工作表单元格中):

 Sub UpdateConnection(strConnection As String, rngNewCatalog As Range, rngNewSource As Range) Dim conTarget As OLEDBConnection Set conTarget = ThisWorkbook.Connections.OLEDBConnection(strConnection) conTarget.Connection = NewConnectionString(conTarget, rngNewCatalog.Value, rngNewSource.Value) conTarget.Refresh End Sub 

这应该做的伎俩:

 Sub jzz() Dim conn As Variant Dim connectString As String For Each conn In ActiveWorkbook.Connections connectString = conn.ODBCConnection.Connection connectString = Replace(connectString, "Catalog=ADCData_Doric", "Catalog=Whatever") connectString = Replace(connectString, "Data Source=doric-server5", "Data Source=Whatever") conn.ODBCConnection.Connection = connectString Next conn End Sub 

它循环工作簿中的每个连接,并更改连接string(在2replace语句中)。

所以要修改你的例子:

 ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").ODBCConnection.Connection = "new connection string" 

我认为你有必要保持相同的连接名称? 否则,忽略它并创build一个新的连接将是最简单的。

您可以重命名连接,然后使用名称创build一个新连接:

 ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").Name = "temp" 'or, more drastic: 'ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").Delete ActiveWorkbook.Connections.Add "Job_Cost_Code_Transaction_Summary", _ "a description", "new connection string", "command text" '+ ,command type 

之后, Delete此连接并恢复旧的连接/名称。 (我目前无法自己testing这个,所以仔细一点 。)

或者,您可以更改当前的连接SourceConnectionFile

 ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.SourceConnectionFile = "..file location.." 

这通常引用包含连接详细信息的保存在系统上的.odc文件(Office Data Connection)。 您可以从窗口的控制面板创build该文件。

您没有指定,但.odc文件可能是您当前的连接正在使用。

再一次,我无法testing这些build议,因此您应该进一步调查并采取一些预防措施 – 以免您丢失当前的连接细节。

我想在这里对这个老话题做一些小小的贡献。 如果您的Excel文件中有很多连接,并且想要更改所有这些连接的数据库名称和数据库服务器,则还可以使用以下代码:

  • 它遍历所有连接并提取连接string
  • 每个连接string被分成一个string数组
  • 它遍历数组,search正确的连接值进行修改,其他未触及
  • 它将数组重新组合到string中并提交更改

这样你不需要使用replace和知道以前的值,而其余的string将保持不变。 另外,我们可以引用一个单元格名称,所以你可以在你的Excel文件中有名字

我希望它可以帮助

 Sub RelinkConnections() Dim currConnValues() As String For Each currConnection In ThisWorkbook.Connections currConnValues = Split(currConnection.OLEDBConnection.Connection, ";") For i = 0 To UBound(currConnValues) If (InStr(currConnValues(i), "Initial Catalog") <> 0) Then currConnValues(i) = "Initial Catalog=" + Range("DBName").value ElseIf (InStr(currConnValues(i), "Data Source") <> 0) Then currConnValues(i) = "Data Source=" + Range("DBServer").value End If Next currConnection.OLEDBConnection.Connection = Join(currConnValues, ";") currConnection.Refresh Next End Sub