【发布时间】:2019-06-14 14:55:34
【问题描述】:
编辑:
我调试后发现,即使我可以在引用的工作表中看到我面前的所有查询表,但 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
原帖
我希望使用 VBA 进一步自动化报告流程。第一步是根据摘要页面输入的季度和年度数据刷新所有数据。
我的目标是做 3 件事并能够更新数据。
- 改变季度
- 在 上更改年份报告
- 点击全部刷新按钮
以下是我试图用来执行此操作的代码。我确实有 Excel 16,我正在尝试使用 Excel 工作簿连接更新宏工作簿。我遇到“下标超出范围”的问题: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 & "\02-01-" & yr & ldr
M2 = fpath & "\03-01-" & yr & ldr
M3 = fpath & "\04-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 & "\05-01-" & yr & ldr
M2 = fpath & "\06-01-" & yr & ldr
M3 = fpath & "\07-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 & "\08-01-" & yr & ldr
M2 = fpath & "\09-01-" & yr & ldr
M3 = fpath & "\010-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 & "\11-01-" & yr & ldr
M2 = fpath & "\12-01-" & yr & ldr
M3 = fpath & "\01-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
提前感谢您的帮助!
【问题讨论】:
-
该错误表明索引(您在括号中提供)超过了集合计数(因此您指的是某些仅包含
n对象的集合的n+1th 项) .例如,您引用tw.Worksheets(2),但如果tw只有 1 个工作表,我认为您会收到与您遇到的错误类似的错误。另一个例子是如果tw.Worksheets(2)不包含任何查询表,那么tw.Worksheets(2).QueryTables(1)会给你一个错误。 -
出于调试的目的,我建议您在代码前添加
Debug.Assert tw.Worksheets(2).QueryTables.Count > 0或Debug.Print tw.Worksheets(2).QueryTables.Count。或者Dim someVariable as QueryTables,然后是Set someVariable = tw.Worksheets(2).QueryTables,然后在VB 编辑器的Locals 窗口中检查someVariable——看看它的状态是否符合您的预期。 -
@chillin 我现在不在工作,但会在星期一尝试。谢谢!
-
您是否在
M/Power Query 代码中使用了File.Contents函数? (如果您通过 GUI 创建查询,它可能会为您自动生成代码,但您可以通过Query Editor -> Advanced Editor查看它。)我的意思是,如果您将quarter和year单元格命名为范围,然后您可以在 Power Query 本身中获取它们的值;然后,您可以使用动态/条件确定的文件路径刷新查询。 -
没问题,很高兴您解决了所有问题。
标签: excel vba powerquery excel-2016