对于每个控制变量必须是变量或对象

时间:2013-04-23 14:55:33

标签: string excel vba for-loop each

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

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

希望这是有道理的。我已经复制了代码,这可能会对事情有所了解。

Dim target As String
Dim cand As String
Dim currentrow As Integer

Sub search_named_range()

    ' This range is hard coded; we can try A:A if hard code version works '
    For Each target In Worksheets("STOCK").Range("A2:A1000")

    ' retrieve the row of the current range, for use when setting target values '
    currentrow = Range(target).Row

        ' FOR loop to search range of part numbers in Mojave '
        For Each cand In Worksheets("Other").Range("N9:N150")
            If StrConv(cand.Value, 2) = StrConv(target, 2) Then
                Worksheets("STOCK").Range("G" + currentrow) = "True"
                GoTo FORend
            End If
        Next cand

' If part is not found, do nothing and return to find next target '
FORend: Next target

End Sub

目前我收到错误'For Each control variable必须是Variant或Object',但无法找到解释原因的地方。我确信这很明显,但是引导者会非常感激。

感谢。

1 个答案:

答案 0 :(得分:11)

您不能在For Each中使用String变量。您在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,但我喜欢。您可以使用范围迭代.Rows.Columns.Areas(尽管.Cells是默认值)。

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

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