【问题标题】:Subscript out of range error with active column element活动列元素的下标超出范围错误
【发布时间】:2017-03-31 15:56:37
【问题描述】:

我正在尝试编写代码来查看(“输入工作表”)中活动列中的行是否与不同工作表(“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

【问题讨论】:

  • 您需要限定每个 Range 对象,其中包括 Cells() 及其相应的父对象:Set y = Sheets("Sheet2").Range(Sheets("Sheet2").Cells(2, 1), Sheets("Sheet2").Cells(131, 1)) 并且您需要将对象设置为不使用,因此删除 End With
  • 另外你不能使用 y 作为 Range 变量作为 Cells() 中的一行,因为这需要很长的时间。
  • (你也从来没有Sety。)
  • 我照你说的做了,Scott 仍然收到 Object required 错误?
  • 你的代码有很多问题,不清楚你想让它做什么,所以很难帮助。请在原始帖子中发布帖子/模拟数据和预期输出并进行编辑。您正在混淆 Ranges 和 Longs,您正在尝试将整个范围与单个单元格进行比较,并且列表还在继续。我们需要更多信息来帮助您。

标签: vba excel


【解决方案1】:

正如 cmets 中提到的,您需要限定ActiveSheetActiveWorkbook 的隐式引用。 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 不是活动工作表时,这就是您的代码崩溃的方式。


还有这些其他问题:

我想提请您注意局部变量'“Sheet2”'未声明检查结果。请注意,双引号被解析为标识符名称的一部分 - 您出于某种原因使用了大引号。 VBA 字符串文字必须用 ASCII 34 分隔,即" - 其他任何内容都不会作为字符串文字分隔符。

变量yRange,它的引用需要用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 参数,并且由于@987654339 @ 是一个Range,VBA 隐式获取它的默认属性(即Range.Value),这使得赋值完全依赖于y 包含的内容......除了y 不只是一个单元格,因此完全不清楚您要在这里实现什么。

【讨论】:

  • 非常感谢 Mat,您的程序听起来令人印象深刻。我试图用 y 实现的是它成为(“Sheet2”)中的行索引,这不是我似乎做对的事情。
  • 谢谢!它远非完美,但它[几乎]每天都在改进!至于y,仍然不清楚它应该如何成为行索引,因为您[尝试] 将其分配给跨越 129 行的Sheets("Sheet2").Range(Cells(2, 1), Cells(131, 1)) - 如果您希望它成为行索引,则声明它As Long 并将其分配给行号,而不是 Range
【解决方案2】:

谢谢大家,在你们的帮助下,我已在下面修复它:

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) 的第 1 列中的数据并查看它是否与 (Input Sheet) 中特定单元格的内容匹配,如果匹配则执行操作。

干杯

【讨论】:

  • 当您使用 With 块时,您可以只用 . 替换每个引用。因此,由于您使用的是 With Sheets("Sheet2"),因此在 with 块内不需要对该工作表的每个引用:Sheets("Sheet2").Cells(hh, 2) 只需为 .Cells(hh, 2) 否则没有理由使用 With 块。此外,在正确的位置缩进代码使其更易于阅读。
  • 我编辑了您对缩进的答案,随意回滚我只是想向您展示我的意思,现在您可以轻松查看每个块的开始和结束位置。
  • ActiveCell.Column 可能不在Input Sheet 中,这可能意味着麻烦。考虑将hh 重命名为currentRow。至于缩进,您会发现 Rubberduck (/Smart Indenter) 每次都能帮助您正确处理 =) ..考虑通过选择答案并单击投票按钮旁边的空心绿色复选标记将问题标记为已回答。
  • 别担心,在我正在制作的程序中,Activecell.column 在运行此 Sub 时将始终位于输入表中。感谢您的帮助,垫子。
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多