Excel vba-获取更改工作表事件代码以适用于新复制的范围

时间:2018-04-12 14:12:28

标签: excel-vba vba excel

问题很简单。我在带有交叉命令的工作表的更改事件中有一些代码。我在工作表上还有一个按钮,单击该按钮时将一系列单元格(为其写入更改事件中的代码)复制到该位置。同一张纸。

问题是如何让更改事件的代码适用于刚粘贴按钮宏的新范围。

编辑:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C6:C30")) Is Nothing Then
        UnprotectSheet ActiveSheet

        If Not Target.Value = "" Then
            Target.Offset(0, -1).Value = Now()
        Else
            Target.Offset(0, -1).ClearContents
        End If

        ProtectSheet ActiveSheet
    End If
End Sub

按钮代码:

Sub Macro()

Range("B3:F3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("N3").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
End Sub

1 个答案:

答案 0 :(得分:0)

我建议始终将按钮中新复制的范围添加到命名范围(本例中为"MyName"),然后使用Worksheet_Change中的命名范围与:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("MyName")) Is Nothing Then

使用按钮宏中的Test程序之类的内容将新复制的范围添加到指定范围。

Public Sub Test()
    AddRangeToNamedRange "MyName", Selection 'instead of selection better specify a range
                                             'like Range("A1:C5")
    Debug.Print Range("MyName").Address 'shows which addresses are represented by the named range MyName
End Sub


'**
'* Adds a new range to an existing named range.
'* If the named range does not exist yet it adds a named range with the
'* given range name and the given range.
'*
Public Sub AddRangeToNamedRange(RangeName As String, AddNewRange As Range)
    Dim NamedRange As Range

    On Error GoTo NameDoesNotExists
    Set NamedRange = Range(RangeName) 'throws error if name does not exists
    On Error GoTo 0

    'add new range to the named range
    ThisWorkbook.Names(RangeName).RefersTo = Union(NamedRange, AddNewRange)

    Exit Sub
NameDoesNotExists:
    Err.Clear
    ThisWorkbook.Names.Add RangeName, AddNewRange 'add the name (first time)
End Sub

这样Range("MyName")始终表示使用按钮复制的所有复制范围。