【发布时间】:2016-08-04 12:51:10
【问题描述】:
这是我代码的一小部分:
If cell1.Offset(0, 8) = "Alpha" Then
Set cell_target = cell2
ElseIf cell1.Offset(0, 8) = "Bravo" Then
Set cell_target = cell3
Else
MsgBox "ERROR"
End
End if
其中 cell1 只是 Sheet1 上 myRange 内 for...next 循环内的一个单元格,而 cell2 和 cell3 只是位于 Sheet2 和 Sheet3 上的单个单元格(范围“A2”)。
在我的代码末尾,我想将 cell2 或 cell3(取决于上面代码中的 cell_target)向下移动一行,我在以下代码行中执行了此操作:
If cell_target = cell2 Then
Set cell2 = cell2.Offset(1)
ElseIf cell_target = cell3 Then
Set cell3 = cell3.Offset(1)
Else
MsgBox "ERROR"
End
End if
问题是所有单元格都被视为单元格2,即使它们不是。我通过写作解决了这个问题:
If cell1.Offset(0, 8) = "Alpha" Then
Set cell2 = cell2.Offset(1)
ElseIf cell1.Offset(0, 8) = "Bravo" Then
Set cell3 = cell3.Offset(1)
Else
MsgBox "ERROR"
End
End if
我只是好奇为什么第一种方法不起作用。我个人的猜测是,通过输入cell_target = cell2,代码不是检查引用名称(cell2 或 cell3)(这是我需要的),而是检查cell2 是否是一个对象;既然是这样,所有的细胞最终都被视为细胞2。
如果您能证实我的理解或反驳它并为我澄清这个问题,我将不胜感激。如果我的描述过于模糊,我可以在这里或通过 Excel 文件提供我的完整代码。
【问题讨论】:
-
您的测试只检查值是否相同,而不是它们是否是相同的单元格。您可以测试
.Address属性或使用:If cell_target Is cell2 Then -
@Rory 是对的。在比较
.Address属性时要小心谨慎(尤其是如果单元格位于不同的工作表或工作簿上),因为Sheet1.Range("A1").Address = Sheet2.Range("A1").Address将返回True。 -
@Ambie 提出的好观点 - 如果您使用地址,请务必使用
.Address(External:=True) -
@Rory 和@Ambie,非常感谢你们富有洞察力的 cmets!
Is运算符正是我所需要的,@Rory!如果您希望重新发布您的第一条评论作为答案,我会这样打勾。