BI神器Power Query(20)-- PQ自適應目錄

使用Power Query可以輕鬆導入文本文件、XML、CSV文件等多種數據文件,但是如果保存文件的目錄發生變化(例如數據文件和Excel模板發送給客戶),刷新查詢時會出現類似於下圖所示的DataSource.Error錯誤提示。
在這裏插入圖片描述
此時需要打開【Power Query編輯器】,在【高級編輯器】對話框中更新文件目錄和名稱,但是PQ公式語法要求很嚴格,稍有不慎可能就會出現其他錯誤。
在這裏插入圖片描述
如果數據文件和Excel文件保存在同一目錄中,使用VBA代碼在實現自動更新,下述代碼寫入Excel文件的ThisWorkbook模塊中。

Private Sub Workbook_Open()
     Dim strCurPath As String
     Dim strPath As String
     Dim strFormula As String
     Dim arrPath As Variant
     Dim objQuery As Object
     Dim objRegEx As Object
     Dim objMatch As Object
     strCurPath = ThisWorkbook.Path
     Set objQuery = ThisWorkbook.Queries(1)
     strFormula = objQuery.Formula
     Set objRegEx = CreateObject("vbscript.regexp")
     objRegEx.Pattern = "Contents\(""([\S\s]:.+?)(?=\""\))"
     objRegEx.Global = True
     Set objMatch = objRegEx.Execute(strFormula)
     If objMatch.Count > 0 Then
         strPath = objMatch(0).submatches(0)
         arrPath = Split(strPath, "\")
         strCurPath = ThisWorkbook.Path & "\" & arrPath(UBound(arrPath))
         If Not UCase$(strCurPath) = UCase$(strPath) Then _
            objQuery.Formula = VBA.Replace(strFormula, strPath, strCurPath)
         Debug.Print objQuery.Formula
     Else
         Debug.Print "PowerQuery公式中沒有文件目錄"
     End If
     Set objMatch = Nothing
     Set objRegEx = Nothing
     Set objQuery = Nothing
End Sub

【代碼解析】
VBA代碼爲工作簿的Open事件代碼,工作簿打開時將自動執行此過程。
第9行代碼獲取示例文件所在路徑。
第10行代碼獲取示例文件中的查詢對象。
第11行代碼獲取查詢的公式,即Power Query公式。
第12行代碼創建正則表達式對象。
第13行代碼指定正則匹配模式字符串,用於提取Power Query公式中的路徑和文件名。
第14行代碼設置正則匹配爲全局模式。
第15行代碼對Power Query公式進行正則匹配。
如果匹配成功,那麼第17行代碼獲取匹配字符組。
第18行代碼將路徑和文件名使用“\”作爲分隔符拆分爲數組。
第19行代碼構建新的路徑和文件名,其中arrPath(UBound(arrPath))爲CSV文件名稱。
第20行判斷新路徑與原路徑是否一致,如果發生了變化,則更新Power Query公式。
第22行代碼在【立即】窗口中輸出更新後的Power Query公式。
如果正則表達式無法匹配Power Query公式中的字符串,那麼第24行代碼在【立即】窗口中輸出提示信息。

有了這個代碼,從此無論保存在哪個目錄,PQ刷新都不是事兒!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章