6

对 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:下一个目标

结束子

目前我收到错误“对于每个控制变量必须是变体或对象”,但找不到任何解释为什么会这样的地方。我敢肯定,这很明显,但我会非常感激引导。

谢谢。

4

1 回答 1

13

您不能在 For Each 中使用字符串变量。您在 For Each 循环中使用tartgetandcand作为控制变量,但您已将它们定义为字符串。它们需要是一个对象,特别是一个包含您正在迭代的对象集合的对象。您正在迭代一个范围,该范围是范围的集合,因此您的控制变量需要是 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 之外声明你的变量,但我把它们放在里面。

您不需要.Cells在 For Each 行的末尾定义,但我喜欢这样做。您可以遍历.Rows.Columns使用.AreasRange(尽管.Cells是默认设置)。

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

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

于 2013-04-23T16:10:13.293 回答