【问题标题】:Calling a variable assigned to an object调用分配给对象的变量
【发布时间】: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!如果您希望重新发布您的第一条评论作为答案,我会这样打勾。

标签: excel vba


【解决方案1】:

根据早期的 cmets,您的测试仅检查 是否相同,而不是它们是否是相同的单元格。

您可以测试.Address(External:=True) 属性或使用:

If cell_target Is cell2 Then

关于带有范围的Is 运算符的小注释:它在这里可以工作,因为您直接将一个范围变量分配给另一个。但是,如果您已将 Range("A1") 分配给两个变量,那么当您比较它们时,Is 运算符将返回 False,因为 Range 属性每次都会返回一个新引用。

【讨论】:

  • 感谢@Rory 对Is 运算符的补充评论。
【解决方案2】:

如前所述,您的测试会比较单元格内容。

我建议检查一下

Interect(cell_target,cell2).Cells.Count>0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多