Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 基于vba更改目标地址位置_Excel_Vba - Fatal编程技术网

Excel 基于vba更改目标地址位置

Excel 基于vba更改目标地址位置,excel,vba,Excel,Vba,我有一个代码,它使用Target.Address根据单元格J17中的单元格值插入行。我想在下面一行使用类似的代码;但是,它下面的行的位置取决于添加的行数。 有人知道一种将迭代次数添加到地址行的方法吗? 我知道如何使用Cells函数实现这一点,但我喜欢Target.Address的自动运行 这是我的密码: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$J$17" Then Dim i A

我有一个代码,它使用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
端接头

有人知道一种将迭代次数添加到地址行的方法吗

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

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

以下是方法:

首先,定义单元J18的命名范围。我把它命名为“insert”,但你可以(几乎)随意命名它。只需确保在代码中更新对它的引用

如果您要根据正在更改的目标执行不同的操作,请使用类似的方法

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

将$J$18中的单元格设置为命名范围,然后按名称引用它。这是动态的,并且随着工作表的更改而移动。