VBA 多个子循环和长范围的类型不匹配

VBA Type mismatch for multiple sub-loops and a long range

这里对 VBA 相当陌生,但是已经设法将这个循环遍历多个工作表的脚本放在一起,一路完成一个 sumif 函数 - 它被存储然后在每个循环之后打印。共有65张纸,以后可能会增加一些,所以我把每个标签名都列在一个命名的Table("tab_ref[Tab]")中,并以此作为循环的参考。

我 运行 遇到了一个非常奇怪的错误。当我将 sheetrange 设置为仅 table ("H15:H18") 中列出的前 4 张时,该功能完美运行,但是当我尝试遍历整个范围(甚至只是一个 - "H15:H19"!) 我在代码的下方收到类型不匹配错误。任何人都可以看到导致此错误的原因吗?修复或任何建议将不胜感激。谢谢!

Sub ClusterLevel()

Dim inputcell As Range, itemrange As Range, sheetrange As Range, _
FullRow As Range, Items As Range, CalcRange As Range, printCalc As Range

Set inputcell = Sheets("Calculations").Range("C10")
Set itemrange = Sheets("Calculations").Range("A21:A22")
Set sheetrange = Sheets("Reference Sheet").Range("H15:H19") 'Sheets listed here. "H15:H18" WORKS - BUT "tab_ref[Tab]" DOESN'T!!

i = 21

For Each entry In itemrange
sumState = 0

For Each sheet In sheetrange
    Set FullRow = Sheets(sheet.Value).Range("A5:EE5")
    Set Items = Sheets(sheet.Value).Range("A6:A500")

    For Each Cell In FullRow
        If Cell.Value = inputcell.Value Then 'TYPE MISMATCH HERE
            With FullRow
            Set SumRange = Range(.Cells(Cell.Row - 3, Cell.Column), .Cells(520, Cell.Column))
            sumState = sumState + WorksheetFunction.SumIf(Items, entry, SumRange)
            End With
        End If
    Next Cell
Next sheet

Set printCalc = Sheets("Calculations").Cells(i, 4)
printCalc = sumState
i = i + 1
Next entry

End Sub

对您的主工作表循环进行以下修改。

For Each Sheet In sheetrange
    On Error GoTo bm_NoSheet
    Set FullRow = Sheets(Sheet.Value).Range("A5:EE5")
    Set Items = Sheets(Sheet.Value).Range("A6:A500")
    On Error GoTo 0

    For Each Cell In FullRow
        If Cell.Value = inputcell.Value Then 'TYPE MISMATCH HERE
            With FullRow
            Set SumRange = Range(.Cells(Cell.Row - 3, Cell.Column), .Cells(520, Cell.Column))
            sumState = sumState + WorksheetFunction.SumIf(Items, entry, SumRange)
            End With
        End If
    Next Cell
    GoTo bm_Next
bm_NoSheet:
    If Err.Number = 9 Then
        With Worksheets.Add(after:=Sheets(Sheets.Count))
            .Name = Sheet.Value
        End With
        Resume
    End If
bm_Next:
Next Sheet

如果找不到,这将创建一个工作表。我仍然不清楚是哪一行产生了错误,但这是我最好的猜测。如果在工作表队列的末尾创建了一个新工作表,那么您需要仔细检查您存储的工作表名称。如果不是,请提供产生错误的实际代码行。

FullRow 中的单元格是在每个选项卡上使用 vlookup 创建的,有些正在返回 N/A。这是在引用时抛出错误。

通过转换为字符串轻松修复: If CStr(Cell.Value) = CStr(inputcell.Value Then)

感谢大家的帮助!