如何使用 VBA 逐步浏览工作簿中的 Excel 工作表并刷新查询

问题描述 投票:0回答:1

我的某些代码存在问题,其行为不符合我的预期。我有 2 个电子表格,一个包含代码和摘要表,另一个包含一系列表,每个表都包含链接到 SQL 数据库的查询。该代码旨在逐步执行查询电子表格的每个工作表,刷新查询,复制工作表名称,然后更新代码电子表格中的工作表,给出工作表的名称和刷新发生的时间。代码正确启动,找到第一个工作表,刷新查询,切换到另一个工作表更新信息,然后切换回来,但是它不会移动到下一个工作表,而只是不断重复同一张工作表。我认为问题在于 For ... ..Next 循环以及我在电子表格之间切换的事实,使其失去了位置,然后重新启动。有什么想法可以让我完成这项工作。 (请注意,查询电子表格每个月都可以添加或删除新工作表,因此我不能只使用固定列表。)

我已经考虑过将摘要表移至查询表,但我不相信这仍然不会因切换表而失败。 这是我的代码

Sub refresh_data_1()
Dim sheetname As String
Dim ws As Worksheet
Dim sc As Integer

Let curr_dir = Application.ActiveWorkbook.Path
Let curr_dir = curr_dir & "\data\"
'
'open raw data
'
Workbooks.Open curr_dir & "query_sheet.xlsx"
Windows("query_sheet.xlsx").Activate

Let sc = ThisWorkbook.Sheets.Count
Windows("code_spreadsheet.xlsm").Activate
Sheets("refresh dates").Visible = True
Sheets("refresh dates").Select

Range("D1").Select
Let ActiveCell = sc ' record how many sheets there are
Range("b3").Select
Windows("query_sheet.xlsx").Activate
For Each ws In .ActiveWorkbook.Worksheets

With ws
Let sheetname = ActiveSheet.Name
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End With
Windows("code_spreadsheet.xlsm").Activate
Let ActiveCell = sheetname
ActiveCell.Offset(0, 1).Activate
Let ActiveCell = Now()
ActiveCell.Offset(1, -1).Activate
Windows("query_sheet.xlsx").Activate
Next

End Sub`
excel vba
1个回答
0
投票
Sub refresh_data_1()
    Dim oSht As Worksheet
    Dim shtCnt As Integer, oTab As ListObject
    Dim currDir As String, rCell As Range
    Dim currWK As Workbook, qryWK As Workbook
    Set currWK = ActiveWorkbook ' code_spreadsheet.xlsm
    currDir = currWK.Path & "\data\"
    'open raw data
    Set qryWK = Workbooks.Open(currDir & "query_sheet.xlsx")
    shtCnt = qryWK.Sheets.Count
    With currWK.Sheets("refresh dates")
        .Visible = True
        .Range("D1").Value = shtCnt ' record how many sheets there are
        Set rCell = .Range("B3")
    End With
    For Each oSht In qryWK.Worksheets
        For Each oTab In oSht.ListObjects
            oTab.QueryTable.Refresh BackgroundQuery:=False
        Next
        rCell = oSht.Name
        rCell.Offset(0, 1) = Now()
        Set rCell = rCell.Offset(1)
    Next
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.