使用活动列元素下标超出范围错误
我正在尝试编写代码,查看(“input表”)中的活动列中的行是否与位于不同工作表(“Sheet2”)范围内的单元格的内容匹配。
如果内容匹配,代码会将单元格的内容直接放到(“Sheet2”)单元格的右侧,并将其放入(“Input Sheet”)中的活动列的第39行。
我知道这很可能与代码的范围部分有关,但是实际上并没有解决方法。
任何帮助,将不胜感激。
Sub yellowgrey() Dim y As Range With y = Sheets("Sheet2").Range(Cells(2, 1), Cells(131, 1)) If Sheets("Input Sheet").Cells(38, ActiveCell.Column).Value = Sheets(“Sheet2”).Cells(y, 1) Then Sheets("Input Sheet").Cells(39, ActiveCell.Column) = Sheets("Sheet2").Cells(y, 2) End If End With End Sub
正如在注释中提到的,您需要限定对ActiveSheet
和ActiveWorkbook
隐式引用。 Rubberduck (免责声明:我大量参与了这个[免费开源] VBE加载项的开发)将会发现这个问题:
成员“单元格”隐式引用ActiveSheet
意即:
Sheets("Sheet2").Range(Cells(2, 1), Cells(131, 1))
真的是这样做的:
ActiveWorkbook.Sheets("Sheet2").Range(ActiveSheet.Cells(2, 1), ActiveSheet.Cells(131, 1))
这就是每当Sheet2不是活动工作表时代码崩溃的原因。
那么还有其他一些问题:
我想把你的注意力转移到局部variables“Sheet2”没有被宣布的检查结果。 请注意,双引号被parsing为标识符名称的一部分 – 出于某种原因,您正在使用curl引号。 VBAstring文字必须用ASCII 34分隔,即"
– 其他任何东西都不作为string文字分隔符。
variablesy
是一个Range
,它的引用需要用Set
关键字来分配。
With ThisWorkbook.Worksheets("Sheet2") Set y = .Range(.Cells(2, 1), .Cells(131, 1) '... End With
当你以后用这个y
:
Sheets("Sheet2").Cells(y, 2)
您传递的是由y
表示的单元格/范围的值 ,因为.Cells
调用将该y
参数作为RowIndex
参数,并且因为y
是一个Range
,所以VBA隐式地获取其默认属性 (即Range.Value
),使得任务完全依赖于y
包含的内容…除了y
不仅仅是一个单元格,所以你完全不清楚你在这里实现了什么。
谢谢你们,在你们的帮助下,我已经解决了它:
Sub yellowgrey() Dim hh As Long With Sheets("Sheet2") For hh = 2 To 131 Step 1 If Sheets("Input Sheet").Cells(38, ActiveCell.Column).Value = Sheets("Sheet2").Cells(hh, 1) Then Sheets("Input Sheet").Cells(39, ActiveCell.Column) = Sheets("Sheet2").Cells(hh, 2) End If Next hh End With End Sub
我们的目标是循环(Sheet2)第一列中的数据并查看它是否与(input表)中特定单元格的内容相匹配,并且如果是,则执行一个操作。
干杯