2013-11-21 68 views
12

我有具有运行将修改连接的CommandText在参数传递从Excel电子表格,像这样当宏的Excel文档:修改在Microsoft 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 

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

enter image description here

就像宏替换ŧ他使用电子表格中的值命令参数,我希望它也可以从电子表格中的值中替换数据库服务器名称和数据库名称。

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

我试图做这样的事情:

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

,但不起作用。谢谢。

+0

你需要看[**连接字符串**](HTTP: //www.connectionstrings.com/)并学习如何使用[** ADODB **](http://www.everythingaccess.com/tutorials.asp?ID=ADO-programming-examples) – 2013-11-21 08:15:44

+0

您是否曾经找到解决这个问题?如果是这样,我将不胜感激您与我们分享。 –

+0

不幸的是仍然手动编辑连接字符串。 – lukemh

回答

8

的回答我的问题如下。

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

错误归结于此。如果你看一下我的截图中,你会看到,连接字符串是:

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"

我得到时,我无非是想分配的全部串中的错误连接。我能够MsgBox当前连接字符串与该属性,但没有设置连接字符串没有得到错误。

我已经发现连接字符串需要在字符串前加OLEDB;

所以这现在工作!

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" 

非常微妙,但那是错误!

0

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

您可能要重命名的连接,并创建使用的名称一个新问题:

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这种连接和恢复旧连接/名称。 (我不能这个目前测试自己,所以胎面仔细

或者,你可能会改变当前连接SourceConnectionFile

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

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

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

同样,我无法测试这些建议,所以您应该进一步调查并采取一些预防措施 - 以免您丢失当前连接详细信息。

1

这应该做的伎俩:

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 

它循环工作簿中的每一个连接,并更改连接字符串(在2替代语句)。

所以修改例如:

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

你可以使用一个函数,它的的OleDbConnection和参数为输入进行更新,并返回新的连接字符串。它与Jzz的答案类似,但允许一些灵活性,而无需在每次要更改VBA代码时编辑连接字符串 - 最糟糕的是,您必须为函数添加新参数。

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 

注意,我已经从现有的,我已经使用特定应用程序的代码修改这一点,所以它的部分进行测试,可能需要一些调整它完全满足您的需求之前。

还要注意,它会需要某种形式的调用代码为好,这将是(假设新目录和数据源都存储在工作表单元格):

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 
2

我认为你是如此接近实现你想要的。

我能够更改为ODBCConnection。对不起,我无法安装OLEDBConnection进行测试,你可以改变发生的ODBCConnectionOLEDBConnection在你的情况。

试加这2级潜艇与修改,并在您需要在的CommandText连接字符串更换什么扔。注意我把.Refresh更新连接,你可能不需要,直到需要实际的数据刷新。

可以使用破事了后来加入它的同样的想法更改其他领域:

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 
1

我想在这里为这个老话题做点小贡献。 如果你在你的Excel文件很多连接,你要更改的数据库名称和数据库服务器的所有的人,你可以使用下面的代码,以及:

  • 它通过所有连接迭代并提取连接字符串
  • 每一个连接字符串分割成字符串数组
  • 它通过阵列寻找合适的连接值修改迭代,其他人都没有触及
  • 将它的阵列重新组合成字符串,并承诺变化

这样,您不需要使用替换并知道以前的值,并且字符串的其余部分将保持不变。 此外,我们可以参考一个单元名称,所以在您的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