使用目标识别单元位置
我碰到这个问题很多,而且很好奇,如果有人能告诉我为什么或者怎样写这个清洁剂。
下面是我的代码,它确实工作。
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
一样使用rTime
,但是我只是想弄明白这一点。
似乎没有什么工作,除了每次指定单独的行和列。 有人可以向我解释这个吗? 还有,还有比第一个例子更好的写法吗?
感谢任何减轻我的困惑的事情。
范围对象的默认属性是.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
其他小区。 因此,如果单元格B1
=“Sid”和单元格F1
=“Sid”,并select单元格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
replace为Target.Cells.CountLarge
对于L42
你的方法是正确的,但你也必须把上面的检查才能得到正确的结果。
尝试这个:
编辑1:涵盖Chis的关注
If Target.Address = rtime.Offset(0,1).Address(,,,True) then cboStatus.Activate
你不能比较对象,只是属性? 我不确定。