每个控制变量必须是变量或对象
Posted
技术标签:
【中文标题】每个控制变量必须是变量或对象【英文标题】: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”,但找不到任何地方可以解释为什么会这样。我敢肯定,这很明显,但我们会非常感谢您的指导。
谢谢。
【问题讨论】:
【参考方案1】:您不能在 For Each 中使用字符串变量。您在 For Each 循环中使用 tartget
和 cand
作为控制变量,但您已将它们定义为字符串。它们需要是一个对象,特别是一个包含您正在迭代的对象集合的对象。您正在迭代一个范围,它是范围的集合,因此您的控制变量需要是 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 中使用字符串 - 非常感谢您对替代方法的解释和建议,代码现在就像我最初打算的那样工作。干杯!以上是关于每个控制变量必须是变量或对象的主要内容,如果未能解决你的问题,请参考以下文章