使用目标识别单元位置

我碰到这个问题很多,而且很好奇,如果有人能告诉我为什么或者怎样写这个清洁剂。

下面是我的代码,它确实工作。

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”) ThenIf 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.ColumnTarget.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.Countreplace为Target.Cells.CountLarge

对于L42

你的方法是正确的,但你也必须把上面的检查才能得到正确的结果。

尝试这个:

编辑1:涵盖Chis的关注

 If Target.Address = rtime.Offset(0,1).Address(,,,True) then cboStatus.Activate 

你不能比较对象,只是属性? 我不确定。