基于迭代vba更改Target.Address位置

时间:2014-05-01 02:44:54

标签: excel vba

我有使用Target.Address基于单元格J17中的单元格值插入行的代码。我想在它下面的行上使用类似的代码;但是,它下面的行的位置取决于添加的行数。 有没有人知道将迭代次数添加到地址行的方法? 我知道如何使用Cells函数执行此操作,但我喜欢自动运行Target.Address

这是我的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$J$17" Then
    Dim i As Integer
    For i = 1 To Target.Value
        Cells(18, 9).EntireRow.Insert
        Cells(18, 9).Value = i
    Next i
End If

End Sub

1 个答案:

答案 0 :(得分:0)

  

有没有人知道将迭代次数添加到地址行的方法?

不确定。那部分是基本的。您可以使用Offset方法计算范围的新地址。但是你需要把它存放在某个地方。您可以创建CustomDocumentProperty,隐藏工作表或命名范围变量。所有这些都可以正常工作。

但最好的解决方案可能只是将该单元格最初定义为命名范围。命名范围很整洁,因为它们是动态的。如果插入行/列或删除行/列,Name将随单元格一起移动。然后,在您的代码中,只需与该范围的.Address属性进行比较,而不是像" $ J $ 18"这样的值进行硬编码。

以下是:

首先,为单元格J18定义命名范围。我把它命名为#34;插入",但你可以命名(几乎)你想要的任何东西。只需确保在代码中更新对它的引用。

enter image description here

如果您打算执行不同的操作,请使用类似的内容,具体取决于哪个目标正在发生变化。

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'This handles your original J17
If Target.Address = "$J$17" Then
    For i = 1 To Target.Value
        Cells(18, 9).EntireRow.Insert
        Cells(18, 9).Value = i
    Next i
End If

'This handles the new named range:
If Target.Address = Range("insert").Address Then
    'Do something else, here:
    MsgBox "Success!!"

End If
Application.EnableEvents = True
End Sub

如果你正在进行相同的插入和编号,那么我会这样想:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    With Target
        If .Address = "$J$17" Or .Address = Range("insert").Address Then
            For i = 1 To .Value
                .Offset(1, -1).EntireRow.Insert
                .Offset(1, -1).Value = i
            Next i
        End If
    End With
Application.EnableEvents = True
End Sub