【问题标题】:Loop through a list of Worksheets and copy paste data into summary sheet遍历工作表列表并将粘贴数据复制到摘要表中
【发布时间】:2017-12-19 09:51:50
【问题描述】:

大家好,我正在尝试遍历在特定范围内命名的特定工作表列表,然后将这些工作表中的粘贴数据复制到摘要表中。

到目前为止,我有这个代码:

Sub MacroToDoTheWork()

Dim ws As Worksheet
Dim ZeileUntersucht As Integer
Dim ZeileEintragen As Integer
Dim sheet_name As Range


ZeileUntersucht = 17  
ZeileEintragen = 2

For each sheet_name in Sheets("Frontend").Range("L21:L49")

 For ZeileUntersucht = 20 To 515
    If ws.Cells(ZeileUntersucht, 238).Value = "yes" Then
        Worksheets("Market Place Output").Cells(ZeileEintragen, 1) = ws.Cells(ZeileUntersucht, 1)
        ZeileEintragen = ZeileEintragen + 1

    End If
Next ZeileUntersucht

Next sheet_name

End Sub

For 循环正在工作并遍历选定的工作表范围以检查条件并将值粘贴到另一个工作表中。我遇到的问题是 For each 循环。使此循环适用于工作表列表。 Frontend Range L21:L49 是存储工作表名称的范围。

如果您需要更多信息,请询问

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您可以从Rangesheet_names 数组中读取所有工作表名称。

    稍后,当循环遍历ThisWorkbook 中的所有Sheets 时,您可以使用Match 函数检查循环中的当前工作表是否与数组中的名称之一匹配。

    注意:如果您尝试以其他方式执行此操作,循环通过 Sheets("Frontend").Range("L21:L49") 中的工作表名称,然后使用该工作表的名称,您可能会遇到运行时错误, 如果工作表名称不会出现在工作簿的任何工作表中。

    修改后的代码

    Dim Sht As Worksheet
    Dim sheet_names As Variant
    
    ' getting the sheet names inside an array
    sheet_names = Application.Transpose(Sheets("Frontend").Range("L21:L49").Value)
    
    ' loop through worksheets
    For Each Sht In ThisWorkbook.Sheets
        ' use Macth function to check if current sheet's name matches one of the sheets in your Range
        If Not IsError(Application.Match(Sht.Name, sheet_names, 0)) Then
            ' do here your copy Paste
    
    
        End If
    
    Next Sht
    

    【讨论】:

    • 感谢您的建议,我会立即测试它
    • @Tim 有什么反馈吗?它是否按您的预期工作?
    【解决方案2】:

    我没有完全理解你的问题,但我想它会得到解决,如果你这样尝试:

    For Each sheet_name In Sheets("Frontend").Range("L21:L49")
        Set ws = Worksheets(sheet_name.Text)
        For ZeileUntersucht = 20 To 515
            If ws.Cells(ZeileUntersucht, 238).Value = "yes" Then
                Worksheets("Market Place Output").Cells(ZeileEintragen, 1) = ws.Cells(ZeileUntersucht, 1)
                ZeileEintragen = ZeileEintragen + 1
            End If
        Next ZeileUntersucht
    Next sheet_name
    

    如果您认为sheet_name 是工作表的名称,那么它应该可以工作。


    两个想法:

    【讨论】:

    • 感谢您的建议,如果我能让我的问题更清楚。我无法创建一个循环工作表列表并在我的宏中执行第二个 For 循环的工作循环。我现在将测试您的解决方案。
    • 感谢您提供有用的提示,我实现了您的解决方案并且宏确实运行了,但过了一段时间我收到一条错误消息“下标超出范围”并且宏也需要很长时间才能运行我猜测是因为它必须检查大量数据。有什么办法可以让这个运行更顺畅吗?
    • @Tim - 您确定 L21:L49 中的所有工作表都存在于工作簿中吗?没有空格什么的?您在哪张纸上收到此错误?它存在于工作簿中吗?它有空间还是什么?为什么我觉得自己像那些在英语课本上写问题的人?
    • 哈哈我确实感受到了在课堂上被质疑的压力。我解决了这个问题,同时它仍然是拼写错误的人为错误。谢谢先生。
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多