使用Target识别单元格位置

时间:2013-11-11 06:56:41

标签: excel excel-vba range cell target vba

我在这个问题上遇到了相当多的问题,如果有人能告诉我为什么或怎么写这个更清洁的话,我很好奇。

以下是我的代码,它确实有效。

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,但我只想弄清楚这一点。

除了每次指定单独的行和列之外,似乎没有任何作用。有人可以向我解释一下吗?另外,有没有比我在第一个例子中做的更好的方式来写这个呢?

感谢任何可以减轻我困惑的事情。

2 个答案:

答案 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.ColumnTarget.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

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