【问题标题】:Loop through sheets and execute calculations based on dynamic sheet references循环工作表并根据动态工作表引用执行计算
【发布时间】:2014-08-21 06:56:43
【问题描述】:

是否可以遍历工作表列表并执行一些具有来自不同工作表列表的工作表引用的计算?例如,您有一个工作表列表(列表 1),它将作为计算的目标,并且您有第二个工作表列表(列表 2)作为计算的基础。因此,假设列表 1 中有 sheet1 和 sheet2,列表 2 中有 sheetA 和 sheetB。基于 sheetA 的计算将出现在 sheet1 中,基于 sheetB 的计算将出现在 sheet2 中。我认为代码看起来像这样:

Sub LoopthroughWorksheets()
Dim sheet_name As Range
Dim sheet_name2 As Range
Set sheet_name2 = Sheets("WS").Range("F:F")
For Each sheet_name In Sheets("WS").Range("C:C")
    If sheet_name.Value = "" Then
        Exit For
    Else
        With Sheets(sheet_name.Value)
                .Range("K1") = .Range("sheet_name2.Value!A14").Value
        End With
    End If
    Next sheet_name
End Sub

我在此行收到“运行时错误 '1004:应用程序定义或对象定义错误”:.Range("K1") = .Range("sheet_name2.Value!A14").Value

非常感谢任何帮助。

问候,

【问题讨论】:

    标签: excel vba loops dynamic reference


    【解决方案1】:

    是的,有可能,但你的代码是错误的。

    您必须以某种方式遍历 C 和 F 列,然后检索匹配的工作表名称:

    Sub LoopthroughWorksheets()
        Dim sheet_name As Range
        Dim sheet_name2 As Range
        Set sheet_name2 = Sheets("WS").Range("F:F")
        ' NEW
        Dim counter As Long
        counter = 1
    
        For Each sheet_name In Sheets("WS").Range("C:C")
            If sheet_name.Value = "" Then
                Exit For
            Else
                With Sheets(sheet_name.Value)
                    .Range("K1").Value = Sheets(sheet_name2(counter, 1).Value).Range("A14").Value
                    ' NEW                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                   
                    counter = counter + 1
                End With
            End If
        Next sheet_name
    End Sub
    

    【讨论】:

    • 感谢@MP24 的回复。使用此代码:.Range("K1") = Sheets("sheet_name2").Range("A14").Value 我收到运行时错误 9:下标超出范围。使用此代码:.Range("K1") = Sheets(sheet_name2).Range("A14").Value 我收到运行时错误 13:类型不匹配。使用此代码:.Range("K1") = Sheets(sheet_name2.Value).Range("A14").Value 我收到运行时错误 13:类型不匹配。
    • 对可能出现的问题有什么想法吗?列表 1 的工作表列表为 A1:A51,列表 2 的工作表列表为 F1:F51。单元格 A14 包含数字而不是文本。
    • 成功了!!非常感谢。这将减少我花在编码上的时间。我认为这将是一个相当普遍的问题,但我无法在任何地方找到答案。只是好奇,柜台是如何工作的?我不确定 sheet_name2(1,1) 如何等同于单元格 A1 中列出的工作表。
    • 最好从内到外分析代码:sheet_name2 是一个包含所有工作表名称的范围(F 列)。大括号(counter, 1) 将充当行列访问,即如果counter = 3sheet_name2(3, 1) 将是F 列中的第三行/第一列单元格。然后,构造访问第三个的值(即单元格内容)行/第一列,这是您的工作表名称。然后,它使用Sheets(...) 检索工作表并访问此工作表上的范围 A1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多