我经常遇到这个问题,并且很好奇是否有人可以告诉我原因或如何将其写得更干净。
下面是我的代码,它确实有效。
If Target.Row = rTime.Offset(0, 1).Row Then
If Target.Column = rTime.Offset(0, 1).Column Then
cboStatus.Activate
End If
End If
我怎么就不能这样写呢?
If Target = rTime.Offset(0, 1) Then
cboStatus.Activate
End If
如果目标已经是一个范围,那么为什么我需要指定单独的行和单独的列?第二个代码不起作用,我已经尝试了它的许多变体。我什至尝试了类似 If Target.Range = range(“C4”) then
或 If Target.Range = cells(4, 3) Then
的方法,但这些都不起作用任何一个。我尝试了类似东西的许多变体。虽然,我不想使用像 A4
这样的特定范围,因为我想像示例中那样使用 rTime
,但我只是想弄清楚这个出来了。
除了每次指定单独的行和列之外,似乎没有什么作用。有人可以向我解释一下吗?另外,是否有比我在第一个示例中所做的更好的方法来编写此代码,该方法确实有效?
感谢任何能缓解我困惑的事情。
最佳答案
范围对象的默认属性是 .Value
,因此当您说 If Target = rTime.Offset(0, 1)
时,它始终会比较该范围而不是这些范围的地址。
L42 已经展示了一种方法。这是使用 Intersect
如果不相交(Target, rtime.Offset(0, 1)) 就什么都没有,那么 cboStatus.Activate
编辑
当您说 Target.Column
和 Target.Row
时,您将始终获得该范围内单元格的第一列和第一行,即使 目标
有多个单元格。为了避免这种情况,请使用以下方法来确保您拥有所需的目标
。即使 Target
中只有一个单元格,您的代码也会给您带来意想不到的结果。例如,假设单元格 B1
的值等于当前为 target
的任何其他单元格。因此,如果 Cell B1
= "Sid"且 Cell F1
= "Sid"并且您选择单元格 F1
那么您将得到“Hello World”消息框。
对于 xl2003,您可以使用附加检查
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rtime As Range
Set rtime = Range("A1")
If Target.Cells.Count > 1 Then
MsgBox "you have chosen more than one cell"
Exit Sub
End If
If Not Intersect(Target, rtime.Offset(0, 1)) Is Nothing Then
MsgBox "Hello World"
End If
End Sub
对于 xl2007+,将 Target.Cells.Count
替换为 Target.Cells.CountLarge
L42
您的方法是正确的,但您还必须进行上述检查才能获得正确的结果。
关于excel - 使用目标来识别小区位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19900537/