这里对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',但无法找到解释原因的地方。我确信这很明显,但是引导者会非常感激。
感谢。
答案 0 :(得分:11)
您不能在For Each中使用String变量。您在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
,但我喜欢。您可以使用范围迭代.Rows
或.Columns
或.Areas
(尽管.Cells
是默认值)。
StrConvert没有任何问题,但您也可以使用LCase(),或者像我一样使用StrComp。
由于我已经有一个对当前行(rCell)上的单元格的引用,我使用它和Offset来填充我想要的列。