【问题标题】:For Each cell in Range cannot bring to another Sub? [duplicate]对于 Range 中的每个单元格不能带到另一个 Sub? [复制]
【发布时间】:2017-09-22 05:46:43
【问题描述】:

当使用 For Each cell in Range 时,我想使用 cell.row 属性来引用当前单元格的行。但是,如果我在另一个 Sub 中使用它,我会收到错误 Run-time error:'424' Object required

下面是一个简单的代码来说明我的意思。我做错了什么还是有办法在另一个 Sub 中引用当前单元格的行?谢谢!

Sub CommandButton2_Click()

 Dim rng As Range
 Set rng = Range("P290:P293")

 For Each cell In rng
  Third
 Next cell

End Sub

Sub Third()

 MsgBox cell.row

End Sub

【问题讨论】:

  • 你没有在任何一个过程中声明cell,所以除了隐式Variant类型之外,它们的范围也只在过程级别,这意味着即使两个过程共享cell 这个名字,这两个不同的cell 是两个不同的东西。在Third 过程的情况下,cell 是一个未定义的变量,一个空/无/空字符串,它没有.row 属性。适当的范围界定、传递变量,最重要的是声明您的变量将帮助您避免这些错误。
  • 谢谢!抱歉,这是我第一次写宏>.

标签: excel vba


【解决方案1】:
Sub CommandButton2_Click()

 Dim rng As Range, cell As Range
 Set rng = Range("P290:P293")

 For Each cell In rng
  Third cell
 Next cell

End Sub

Sub Third(cell As Range)

 MsgBox cell.row

End Sub

您需要将其作为参数传递。

【讨论】:

  • 或使用Public cell As Range制作cell全局变量
  • @Vasily 你确实可以 - 但在循环中,你必须在每次迭代中 Set 引用该引用,这意味着更多开销。对于不循环的代码,使用公共范围的变量会更容易
  • 我不这么认为,我认为excel 95 的时间已经结束,所以它只是用户自己应该使用的。我的评论只是为了添加额外的选项...从我这边 +1
  • @Vasily 我对你所说的没有异议——这是一个完全可行的选择。从编程的角度来看,虽然一般个人会避免在循环的每次迭代中设置对象的实例。在此示例中,这很好 - 但可能并非每次有人遇到此问题时都如此。我说的是一般性,而不仅仅是 VBA 和 Excel。你说的完全正确
  • 就一般方法而言......同意你的看法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2012-08-04
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多