Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excelvba;更新连接字符串_Vba_Excel_Connection String_Excel 2010 - Fatal编程技术网

excelvba;更新连接字符串

excelvba;更新连接字符串,vba,excel,connection-string,excel-2010,Vba,Excel,Connection String,Excel 2010,我只是想让VBA更新OLEDB连接字符串。当我单步执行代码时,没有收到任何错误,但是连接刷新失败,当我在UI中检查连接字符串时,很明显我的代码根本没有更改它(因此刷新失败)。我错过了什么 代码如下: Sub UpdateQueryConnectionString(ConnectionString As String) With ActiveWorkbook.Connections("Connection Name"). _ OLEDBConnection .Conn

我只是想让VBA更新OLEDB连接字符串。当我单步执行代码时,没有收到任何错误,但是连接刷新失败,当我在UI中检查连接字符串时,很明显我的代码根本没有更改它(因此刷新失败)。我错过了什么

代码如下:

Sub UpdateQueryConnectionString(ConnectionString As String)

  With ActiveWorkbook.Connections("Connection Name"). _
      OLEDBConnection
      .Connection = StringToArray(ConnectionString)
  End With
  ActiveWorkbook.Connections("Connection Name").Refresh
End Sub
正在输入的连接字符串为:

ConnectionString = = "Provider=SLXOLEDB.1;Data Source=SERVER;Initial Catalog=DATABASE" _
& ";User ID=" & Username & ";Password=" & Password & _
";Persist Security Info=True;Extended Properties=" _
& Chr(34) & "PORT=1706;LOG=ON;CASEINSENSITIVEFIND=ON;INCLUDECALCFIELDS=ON;" & Chr(34)

函数StringToArray直接从示例4中复制而来,这一行用于刷新使用OLEDB的代码:

ActiveWorkbook.Connections("Connection Name").OLEDBConnection.Refresh

原因似乎是excel要求您指示类型,即使您引用的是特定的、命名的连接。

明白了。下面的代码已经运行

Sub UpdateQueryConnectionString(ConnectionString As String)

  Dim cn As WorkbookConnection
  Dim oledbCn As OLEDBConnection
  Set cn = ThisWorkbook.Connections("Connection Name")
  Set oledbCn = cn.OLEDBConnection
  oledbCn.Connection = ConnectionString

End Sub

只需像我在第一个问题中所说明的那样,将ConnectionString作为字符串输入。

即使我们可以刷新特定的连接,它也会刷新链接到它的所有枢轴

对于这段代码,我从Excel中的表创建了切片器:

Sub UpdateConnection()
    Dim ServerName As String
    Dim ServerNameRaw As String
    Dim CubeName As String
    Dim CubeNameRaw As String
    Dim ConnectionString As String

    ServerNameRaw = ActiveWorkbook.SlicerCaches("Slicer_ServerName").VisibleSlicerItemsList(1)
    ServerName = Replace(Split(ServerNameRaw, "[")(3), "]", "")

    CubeNameRaw = ActiveWorkbook.SlicerCaches("Slicer_CubeName").VisibleSlicerItemsList(1)
    CubeName = Replace(Split(CubeNameRaw, "[")(3), "]", "")

    If CubeName = "All" Or ServerName = "All" Then
        MsgBox "Please Select One Cube and Server Name", vbOKOnly, "Slicer Info"
    Else
        ConnectionString = GetConnectionString(ServerName, CubeName)
        UpdateAllQueryTableConnections ConnectionString, CubeName
    End If
End Sub

Function GetConnectionString(ServerName As String, CubeName As String)
    Dim result As String
    result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
    '"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"
    GetConnectionString = result
End Function

Sub UpdateAllQueryTableConnections(ConnectionString As String, CubeName As String)
    Dim cn As WorkbookConnection
    Dim oledbCn As OLEDBConnection
    Dim Count As Integer, i As Integer
    Dim DBName As String
    DBName = "Initial Catalog=" + CubeName

    Count = 0
    For Each cn In ThisWorkbook.Connections
        If cn.Name = "ThisWorkbookDataModel" Then
            Exit For
        End If

        oTmp = Split(cn.OLEDBConnection.Connection, ";")
        For i = 0 To UBound(oTmp) - 1
            If InStr(1, oTmp(i), DBName, vbTextCompare) = 1 Then
                Set oledbCn = cn.OLEDBConnection
                oledbCn.SavePassword = True
                oledbCn.Connection = ConnectionString
                Count = Count + 1
            End If
        Next
    Next

    If Count = 0 Then
         MsgBox "Nothing to update", vbOKOnly, "Update Connection"
    ElseIf Count > 0 Then
        MsgBox "Connection Updated Successfully", vbOKOnly, "Update Connection"
    End If
End Sub

我建议您仔细检查“本地人”窗口中的每个属性,以确保它们确实存在——我不太清楚语法。考虑到ConnectionString是一个字符串的事实,数组(ConnectionString)看起来像是奇怪的语法。@KimGysen似乎是对的-这是什么
Array()
,试着不用
Array()
,只使用
ConnectionString
。我认为数组部分是由宏记录器生成的,正如@KimGysen所说的,在这里不适用。仅使用
ConnectionString
进行尝试。我在没有使用数组()的情况下进行了尝试,但出现了运行时错误。稍微挖掘一下就发现了这个。参见示例4。数组用于阻止超过255个字符的字符串被截断,但我认为我做得不对。我将把问题中的代码更新为我现在所做的。UI仍然没有显示对连接字符串的更改(对或错)。我没有计算字符数,但您的连接字符串看起来没有超过255个字符的限制?刷新正常,但UI仍然报告我通过UI输入的连接字符串。不是VBA应该插入的连接字符串。我检查了字符串,238个字符,258个空格…您可以删除CHR(34)[双引号]-这是必要的吗?是的,CHR(34)是连接字符串的必需部分。这是我发现的将“作为字符串的一部分”转义的最简单方法。不,我没有尝试获取连接文件。