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

String 对于每个控制变量,必须是变量或对象,string,excel,vba,for-loop,each,String,Excel,Vba,For Loop,Each,这里对VBA真的很陌生。。。我环顾四周,试图拼凑一些代码来满足我的需要。我想它就快到了,但我遇到了一些很容易克服的错误,但我不知道如何克服 代码查看当前工作表(库存),并从单元格A2中获取“目标”文本值。然后在另一个工作表“Other”中搜索命名范围。如果它确定另一个单元格中的一个单元格('cand')等于目标值,则“True”值将应用于库存表中与原始目标相同行的G列 希望这是有道理的。我复制了代码,这可能会让事情变得更清楚 Dim target As String Dim cand As St

这里对VBA真的很陌生。。。我环顾四周,试图拼凑一些代码来满足我的需要。我想它就快到了,但我遇到了一些很容易克服的错误,但我不知道如何克服

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

希望这是有道理的。我复制了代码,这可能会让事情变得更清楚

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 将目标变暗为字符串 暗烛光 将currentrow设置为整数 子搜索_命名_范围() '这个范围是硬编码的;如果硬代码版本有效,我们可以尝试A:A' 对于工作表中的每个目标(“库存”)。范围(“A2:A1000”) '检索当前范围的行,以便在设置目标值时使用' currentrow=范围(目标)。行 '用于循环搜索莫哈韦零件号的范围' 对于工作表(“其他”)范围(“N9:N150”)中的每个CAD 如果StrConv(cand.Value,2)=StrConv(target,2),则 工作表(“库存”)。范围(“G”+当前行)=“真” 转到前 如果结束 下一个坎德 '如果找不到零件,则不执行任何操作并返回以查找下一个目标' 前:下一个目标 端接头 目前我得到的错误是“每个控制变量必须是Variant或Object”,但找不到任何地方可以解释为什么会这样。我相信这是很明显的,但是如果你能给我一头牛,我会非常感激的


谢谢。

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

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
,但我喜欢这样做。您可以使用范围(尽管默认值为
.Cells
)在
.Rows
.Columns
.area
上迭代

StrConvert没有什么问题,但是您也可以使用LCase()或StrComp,就像我所做的那样


因为我已经有了对当前行(rCell)单元格的引用,所以我使用该引用和偏移量来填充我想要的列。

这绝对是完美的,非常感谢您的帮助!我现在可以看出,我尝试的一些事情有点迂回(例如,获取行号),我没有意识到你不能在每个行中使用字符串-非常感谢你对替代方法的解释和建议,代码现在的工作方式与我最初的预期一样。干杯