我在这个问题上遇到了相当多的问题,如果有人能告诉我为什么或怎么写这个更清洁的话,我很好奇。
以下是我的代码,它确实有效。
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
,但我只想弄清楚这一点。
除了每次指定单独的行和列之外,似乎没有任何作用。有人可以向我解释一下吗?另外,有没有比我在第一个例子中做的更好的方式来写这个呢?
感谢任何可以减轻我困惑的事情。
答案 0 :(得分:4)
范围对象的默认属性为.Value
,因此当您说If Target = rTime.Offset(0, 1)
时,它将始终比较该范围内的值而不是这些范围的地址。
L42已经展示了一种方法。这是使用Intersect
If Not Intersect(Target, rtime.Offset(0, 1)) Is Nothing Then cboStatus.Activate
修改强>
当您说Target.Column
和Target.Row
时,即使Target
有多个单元格,您也始终会获得该范围内第一列和第一行的单元格。为避免这种情况,请使用以下内容确保您拥有所需的Target
。即使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
您的方法是正确的,但您还必须进行上述检查以获得正确的结果。
答案 1 :(得分:2)
试试这个:
编辑1:以涵盖Chis'关注
If Target.Address = rtime.Offset(0,1).Address(,,,True) then cboStatus.Activate
你不能比较对象,只是属性?我不确定。