从此以后只要让数据源和查询的数据透视表文件在同一个文件夹里面(可更改文件夹名),那么就可以随意刷新数据,而不必担心需要更换外部数据源路径了。
接下来是关键的三个msgbox帮助深入理解。
以下为代码(包括注解运作原理)
Private Sub Workbook_Open()
Dim strCon As String, iPath As String, i As Integer, iFlag As String, iStr As String
strCon = ActiveSheet.PivotTables(1).PivotCache.Connection
MsgBox (strCon) '这里先查看一下这个数据透视表的连接信息。
Select Case Left(strCon, 5)
Case "ODBC;"
iFlag = "DBQ="
Case "OLEDB"
iFlag = "Source="
Case Else
Exit Sub
End Select
iStr = Split(Split(strCon, iFlag)(1), ";")(0) '首先里面的split以iFlag所给字符串为分隔符,这个case里面就是DBQ=。把这之后的一堆都放在了这个数组里面,DBQ=为0号位置,后面一堆是一号位置。外面那个split以分号为分隔符,去0号位置的数组字符串。即为文件地址。
MsgBox (iStr)
iPath = Left(iStr, InStrRev(iStr, "\") - 1) '先说InstrRev其实它返回一个数值,就是\最后出现的地方。然后用个left,则锁定好了文件夹的位置了。
MsgBox (iPath)
With ActiveSheet.PivotTables(1).PivotCache
.Connection = VBA.Replace(strCon, iPath, ThisWorkbook.Path) 'Replace(整个字符串,要查找的字符串,把要查找的替换成某个字符串),此处成功偷梁换柱了地址,文件夹可以随便挪地方了。
.CommandText = VBA.Replace(.CommandText, iPath, ThisWorkbook.Path) '含数据源的文件夹可以改名字,但必须所有表都在同个文件夹。
End With
End Sub
接下来是关键的三个msgbox帮助深入理解。
strCon
iStr
iPath
心得:该代码里面有很多function比如split和Instrrev的灵活运用。都值得了解。个人最大收获是懂得了如何去截取Cache的一大段里面信息中的一小部分了。这个的应用范围可以很广。