循环选择单元格时需要对象错误
Posted
技术标签:
【中文标题】循环选择单元格时需要对象错误【英文标题】: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
。另外,请参阅这个文档:***.com/documentation/vba/7363/…
谢谢,但遗憾的是这并没有解决问题。
您是否更改了ProcessCells
中的单元格?因为您不能在For Each
循环中更改元素的值(我知道,这很痛苦……)
不,即使 ProcessCells 过程为空,我也会遇到同样的错误。
【参考方案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()。它需要括号中的参数。这是一个很好的参考 - ***.com/questions/1072075/… Nono,我的意思是我正在调用相同的过程,我也在 For 循环中调用:'ProcessCells' 但是我传递的是内置的 'Cells' 参数,而不是循环单元格。 我现在明白了。我想Cell
是一个对象 msdn.microsoft.com/en-us/library/office/… ,因此 VBA 更加尊重它(一等公民等),并且关于 c
范围,它是 iEnumerable 的一部分,因此 VBA 稍后意识到它(尽管它在顶部声明)。以上是关于循环选择单元格时需要对象错误的主要内容,如果未能解决你的问题,请参考以下文章
在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格
UITableView 选择单元格时所有组件都更改了背景颜色