【问题标题】:for each control variable must be variant or object每个控制变量必须是变量或对象
【发布时间】:2013-04-16 20:38:29
【问题描述】:

这里对 VBA 真的很陌生...我环顾四周并尝试拼凑一些代码来满足我的需求。认为它几乎就在那里,但我遇到了可能很容易克服但我不知道如何克服的错误。

代码查看当前工作表 (STOCK),并从单元格 A2 中获取“目标”文本值。然后它在另一个工作表“其他”中搜索命名范围。如果它确定 Other 中的一个单元格('cand')等于目标值,则“True”值将应用于 STOCK 表中的 G 列,位于原始目标的同一行。

希望这是有道理的。我已经复制了代码,这可能会更清楚地说明事情。

将目标调暗为字符串
将糖果点心为字符串
将当前行变暗为整数

子 search_named_range()

    ' 这个范围是硬编码的;如果硬代码版本有效,我们可以尝试 A:A '
    For Each target In Worksheets("STOCK").Range("A2:A1000")

    ' 检索当前范围的行,用于设置目标值时 '
    currentrow = Range(target).Row

        ' FOR 循环在 Mojave 中搜索零件编号范围 '
        For Each cand In Worksheets("Other").Range("N9:N150")
            如果 StrConv(cand.Value, 2) = StrConv(target, 2) 那么
                Worksheets("STOCK").Range("G" + currentrow) = "True"
                转到 FORend
            万一
        下一个糖果

'如果没有找到零件,什么都不做,返回寻找下一个目标'
FORend:下一个目标

结束子

目前我收到错误消息“对于每个控制变量都必须是 Variant 或 Object”,但找不到任何地方可以解释为什么会这样。我敢肯定,这很明显,但我们会非常感谢您的指导。

谢谢。

【问题讨论】:

    标签: string excel vba for-loop each


    【解决方案1】:

    您不能在 For Each 中使用字符串变量。您在 For Each 循环中使用 tartgetcand 作为控制变量,但您已将它们定义为字符串。它们需要是一个对象,特别是一个包含您正在迭代的对象集合的对象。您正在迭代一个范围,它是范围的集合,因此您的控制变量需要是 Range 对象。

    Sub search_named_range()
    
        Dim rCell As Range
        Dim rCand As Range
    
        For Each rCell In Worksheets("STOCK").Range("A2:A1000").Cells
            For Each rCand In Worksheets("Other").Range("N9:N150").Cells
                If StrComp(rCand.Value, rCell.Value, vbTextCompare) = 0 Then
                    rCell.Offset(0, 6).Value = "True"
                    Exit For 'exits the rCand For, but no the rCell one
                End If
            Next rCand
        Next rCell
    
    End Sub
    

    其他未纠正错误的更改:

    我不确定你为什么在 sub 之外声明变量,但我把它们放在里面。

    您不需要在 For Each 行的末尾定义 .Cells,但我喜欢这样做。您可以使用 Range 迭代 .Rows.Columns.Areas(尽管 .Cells 是默认值)。

    StrConvert 没有任何问题,但您也可以使用 LCase() 或像我一样使用 StrComp。

    由于我已经引用了当前行 (rCell) 上的一个单元格,我使用它和 Offset 来填充我想要的列。

    【讨论】:

    • 这绝对是完美的,非常感谢您的帮助!我现在可以看到我正在尝试的一些事情有点迂回(例如获取行号),而且我没有意识到您不能在 For Each 中使用字符串 - 非常感谢您对替代方法的解释和建议,代码现在就像我最初打算的那样工作。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多