【问题标题】:Object required error when looping through cells in selection循环选择单元格时需要对象错误
【发布时间】:2017-01-18 10:25:21
【问题描述】:

我在一些单元格中循环,在垂直选择中,在 Excel 中,然后将该单元格作为参数传递给过程。

我已经这样做了,所以我没有两次ProcessCells的内容,在代码中,一次用于while循环,第二次用于For循环。

如果我尝试在 for 循环中写出单元格的值,它会起作用。 如果我将 ProcessCells 过程的内容放在 for 循环中,它也可以工作。

但如果我尝试将其作为参数传递到 ProcessCells 中,则会出现错误

'需要对象'

这里是代码,如果你想看看:

Sub loopThroughCells()

Dim c As Range
Dim autoSelect As String
Dim X, Y As Integer

autoSelect = Cells(3, 2).Value

If StrComp(autoSelect, "Y") = 0 Then
    Y = 5
    X = 4
    While Not IsEmpty(Cells(Y, X).Value)
        ProcessCells (Cells(Y, X))
        Y = Y + 1
    Wend
Else
    For Each c In Selection
        ProcessCells (c)
    Next c
End If
End Sub

Sub ProcessCells(ce As Range)
End Sub

怎么样

细胞(n,m)

不同于

c 在选择中

?

错误发生在 For 循环中,但不会发生在 while 循环中。

【问题讨论】:

  • 它可能应该是For Each c In Selection.Cells(并且你应该尽可能避免使用Select。另外,请参阅这个文档:stackoverflow.com/documentation/vba/7363/…
  • 谢谢,但遗憾的是这并没有解决问题。
  • 您是否更改了ProcessCells 中的单元格?因为您不能在For Each 循环中更改元素的值(我知道,这很痛苦……)
  • 不,即使 ProcessCells 过程为空,我也会遇到同样的错误。

标签: vba excel


【解决方案1】:

你应该这样做:

Option Explicit

Sub TestMe()

    Dim c   As Range

    For Each c In Selection
        Call ProcessCells(c)
    Next c
End Sub


Sub ProcessCells(ce As Range)
End Sub

您应该参考call,因为括号中有一个参数。 或者像这样,如果你不喜欢call

Option Explicit

Sub TestMe()

    Dim c   As Range

    For Each c In Selection
         ProcessCells c
    Next c
End Sub


Sub ProcessCells(ce As Range)
End Sub

加上一个小版本的代码。像这样进行声明:

Dim X as Long, Y As long

在您的代码中,X 被声明为变体,并且整数比 long 慢且小 - Why Use Integer Instead of Long?

这里有一些很好的解释,何时将参数放在括号中以及何时使用call - How do I call a VBA Function into a Sub Procedure

【讨论】:

  • 谢谢,使用“呼叫”修复了它。但是您提到我需要使用“呼叫”,因为括号中有一个参数。在While循环中不是同样的情况吗?
  • 没有。在 while 循环中,您使用的是 XL 内置函数 - IsEmpty()。它需要括号中的参数。这是一个很好的参考 - stackoverflow.com/questions/1072075/…
  • Nono,我的意思是我正在调用相同的过程,我也在 For 循环中调用:'ProcessCells' 但是我传递的是内置的 'Cells' 参数,而不是循环单元格。
  • 我现在明白了。我想 Cell 是一个对象 msdn.microsoft.com/en-us/library/office/… ,因此 VBA 更加尊重它(一等公民等),并且关于 c 范围,它是 iEnumerable 的一部分,因此 VBA 稍后意识到它(尽管它在顶部声明)。
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
相关资源
最近更新 更多