更改 Power Query 数据源
Change Power Query Data Source
编辑:
我调试发现,虽然我可以在引用的工作表中看到我面前的所有查询表,但Excel统计并在任何工作表中找到0个查询表。
编辑 2:
所以我发现QueryTables
存在于ListObjects
下。所以现在,我正在尝试像这样创建一个新的数据源连接:
tw.Worksheets(2).ListObjects(1).QueryTable.Connection = "OLEDB;" & M1
tw.Worksheets(5).ListObjects(1).QueryTable.Connection = "OLEDB;" & M1
tw.Worksheets(3).ListObjects(1).QueryTable.Connection = "OLEDB;" & M2
tw.Worksheets(6).ListObjects(1).QueryTable.Connection = "OLEDB;" & M2
tw.Worksheets(4).ListObjects(1).QueryTable.Connection = "OLEDB;" & M3
tw.Worksheets(7).ListObjects(1).QueryTable.Connection = "OLEDB;" & M3
原版POST
我希望使用 VBA 进一步自动化报告流程。第一步是根据在摘要页面上输入的季度和年度数据刷新所有数据。
这是目前的样子
我的目标是做 3 件事,并且能够更新数据。
- 改变季度
- 更改
的年度报告
- 单击全部刷新按钮
下面是我试图用来执行此操作的代码。我确实有 Excel 16,我正在尝试使用 excel 工作簿连接更新宏工作簿。我 运行 陷入 "Subscript out of range" 的问题:
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
Public Sub Refresh_All()
Dim tw As ThisWorkbook: Set tw = ThisWorkbook
Dim qd As Worksheet: Set qd = tw.Worksheets("Quarterly Data")
Dim yr As String: yr = qd.Range("H11").Value2
Dim qrtr As String: qrtr = qd.Range("G11").Value2
Dim fpath As String: fpath = "X:\Dump Report for Loans\" & yr
Dim ldr As String: ldr = "\Loan Dump Report (000.Original).xlsx"
Dim M1 As String
Dim M2 As String
Dim M3 As String
If qrtr = "Q1" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "-01-" & yr & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
ElseIf qrtr = "Q2" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "-01-" & yr & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:=M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
ElseIf qrtr = "Q3" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "0-01-" & yr & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
ElseIf qrtr = "Q4" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "-01-" & yr + 1 & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
Else:
MsgBox "ERROR!! NO QUARTER ENTERED!!"
End If
ThisWorkbook.RefreshAll
End Sub
在此先感谢您的帮助!
在与@chillin 进行一些外部讨论后,我们提出了一个解决方案,该解决方案将使用 M/Power Query
使其更具动态性。下面是运行良好的代码。再次感谢@chillin.
let
GetNamedRangeInCurrentWorkbook = (nameOfRange as text) as any => Excel.CurrentWorkbook(){[Name=nameOfRange]}[Content][Column1]{0},
quarterFromSheet = Text.From(GetNamedRangeInCurrentWorkbook("quarter")),
yearFromSheet = Text.From(GetNamedRangeInCurrentWorkbook("year")),
quarterNumber = try Number.From(Text.End(quarterFromSheet, 1)) otherwise error "Could not convert 'quarter' to a number",
filename = "Loan Dump Report (000.Original).xlsx",
startOfFinancialYear = #date(Number.From(yearFromSheet), 2, 1),
MonthInFilePath = (startDate as date, quarter as number, month as number) as date => Date.AddMonths(startDate, ((quarter-1) * 3) + month - 1),
DetermineFilePath = (month as number) as text =>
let
targetMonth = MonthInFilePath(startOfFinancialYear, quarterNumber, month), folderPath = "X:\Dump Report for Loans\" & Date.ToText(targetMonth, "yyyy") & "\", subFolder = Date.ToText(targetMonth, "MM-dd-yyyy"), fullFilePath = folderPath & subFolder & "\" & filename
in
fullFilePath
in
DetermineFilePath
编辑:
我调试发现,虽然我可以在引用的工作表中看到我面前的所有查询表,但Excel统计并在任何工作表中找到0个查询表。
编辑 2:
所以我发现QueryTables
存在于ListObjects
下。所以现在,我正在尝试像这样创建一个新的数据源连接:
tw.Worksheets(2).ListObjects(1).QueryTable.Connection = "OLEDB;" & M1
tw.Worksheets(5).ListObjects(1).QueryTable.Connection = "OLEDB;" & M1
tw.Worksheets(3).ListObjects(1).QueryTable.Connection = "OLEDB;" & M2
tw.Worksheets(6).ListObjects(1).QueryTable.Connection = "OLEDB;" & M2
tw.Worksheets(4).ListObjects(1).QueryTable.Connection = "OLEDB;" & M3
tw.Worksheets(7).ListObjects(1).QueryTable.Connection = "OLEDB;" & M3
原版POST
我希望使用 VBA 进一步自动化报告流程。第一步是根据在摘要页面上输入的季度和年度数据刷新所有数据。
这是目前的样子
我的目标是做 3 件事,并且能够更新数据。
- 改变季度
- 更改 的年度报告
- 单击全部刷新按钮
下面是我试图用来执行此操作的代码。我确实有 Excel 16,我正在尝试使用 excel 工作簿连接更新宏工作簿。我 运行 陷入 "Subscript out of range" 的问题:
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
Public Sub Refresh_All()
Dim tw As ThisWorkbook: Set tw = ThisWorkbook
Dim qd As Worksheet: Set qd = tw.Worksheets("Quarterly Data")
Dim yr As String: yr = qd.Range("H11").Value2
Dim qrtr As String: qrtr = qd.Range("G11").Value2
Dim fpath As String: fpath = "X:\Dump Report for Loans\" & yr
Dim ldr As String: ldr = "\Loan Dump Report (000.Original).xlsx"
Dim M1 As String
Dim M2 As String
Dim M3 As String
If qrtr = "Q1" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "-01-" & yr & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
ElseIf qrtr = "Q2" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "-01-" & yr & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:=M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
ElseIf qrtr = "Q3" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "0-01-" & yr & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
ElseIf qrtr = "Q4" Then
M1 = fpath & "-01-" & yr & ldr
M2 = fpath & "-01-" & yr & ldr
M3 = fpath & "-01-" & yr + 1 & ldr
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
tw.Worksheets(2).QueryTables(1).Refresh
tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
tw.Worksheets(3).QueryTables(1).Refresh
tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
tw.Worksheets(4).QueryTables(1).Refresh
Else:
MsgBox "ERROR!! NO QUARTER ENTERED!!"
End If
ThisWorkbook.RefreshAll
End Sub
在此先感谢您的帮助!
在与@chillin 进行一些外部讨论后,我们提出了一个解决方案,该解决方案将使用 M/Power Query
使其更具动态性。下面是运行良好的代码。再次感谢@chillin.
let
GetNamedRangeInCurrentWorkbook = (nameOfRange as text) as any => Excel.CurrentWorkbook(){[Name=nameOfRange]}[Content][Column1]{0},
quarterFromSheet = Text.From(GetNamedRangeInCurrentWorkbook("quarter")),
yearFromSheet = Text.From(GetNamedRangeInCurrentWorkbook("year")),
quarterNumber = try Number.From(Text.End(quarterFromSheet, 1)) otherwise error "Could not convert 'quarter' to a number",
filename = "Loan Dump Report (000.Original).xlsx",
startOfFinancialYear = #date(Number.From(yearFromSheet), 2, 1),
MonthInFilePath = (startDate as date, quarter as number, month as number) as date => Date.AddMonths(startDate, ((quarter-1) * 3) + month - 1),
DetermineFilePath = (month as number) as text =>
let
targetMonth = MonthInFilePath(startOfFinancialYear, quarterNumber, month), folderPath = "X:\Dump Report for Loans\" & Date.ToText(targetMonth, "yyyy") & "\", subFolder = Date.ToText(targetMonth, "MM-dd-yyyy"), fullFilePath = folderPath & subFolder & "\" & filename
in
fullFilePath
in
DetermineFilePath