簡體   English   中英

Excel VBA:在剪切/粘貼/刪除/插入事件上觸發宏

[英]Excel VBA: Trigger macro on cut/paste/delete/insert events

我有一個定義為宏的條件格式設置規則,該規則將刪除舊規則並將其替換為更新規則:

Sub setCondFormat()
    Set Table = ActiveSheet.ListObjects("Rules")
    Table.Range.FormatConditions.Delete
    Set Attribute = Table.ListColumns("Attribute")
    With Attribute.DataBodyRange.FormatConditions _
    .Add(xlExpression, xlEqual, "=ISEMPTY(A2)")
        With .Interior
            .ColorIndex = 0
        End With
    End With
End Sub

Excel中的條件格式需要更新。 否則,規則中的單元格區域將變得零散。

假設您有兩個規則:

  1. 使$A$1:$A$30變紅
  2. 使$B$1:$B$30變成藍色現在選擇A10:B10並將其復制/粘貼到A20:B20
    Excel要做的是刪除條件格式。

對於適用於這些單元格的規則中的A20:B20 ,並添加具有A20:B20格式的新規則。 您最終有四個規則:

  1. 使=$A$20紅色
  2. 使=$B$20藍色
  3. Make =$A$1:$A$19,$A$21:$A$30紅色
  4. Make =$B$1:$B$19,$B$21:$B$30藍色

通過剪切/粘貼/刪除/插入事件更改表結構時,會發生這種情況。

如何在剪切/粘貼/刪除/插入事件上觸發上述VBA宏?

您可以為宏使用快捷方式

VBA事件觸發復制嗎?

如果您不想采用這種方式,則需要使用Windows API:

編輯單元格時,按下任何鍵會觸發任何事件嗎?

我發現的解決方案是在打開工作簿時使用表的內容創建一個新的工作表。 首先,您需要使用公共變量創建一個模塊。

Public OldRange As Range
Public NewRange As Range
Public Table As ListObject

然后,使用“打開工作簿”事件。

Private Sub Workbook_Open()
    Dim sh As Worksheet
    Dim address As String

    For Each sh In Worksheets
        If sh.Name = "DATA" Then
            Worksheets("DATA").Activate
            ActiveSheet.Delete
        End If
    Next

    ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = "DATA"


    Set sh = ActiveWorkbook.Sheets("Plan1")
    sh.Activate

    Set Table = ActiveSheet.ListObjects("Rules")
    Set OldRange = Table.Range
    address = Table.Range.address

    Table.Range.Copy

    Set sh = ActiveWorkbook.Sheets("DATA")
    sh.Activate
    Range(address).PasteSpecial (xlPasteAll)
End Sub

然后,使用事件Worksheet_Change來驗證原始表和先前保存的表的內容。

Private Sub Worksheet_Change(ByVal Target As Range)
    Set Table = ActiveSheet.ListObjects("Rules")

    If Intersect(Target, Table.Range) Is Nothing Then Exit Sub 'this will guarantee that the change made in your sheet is in your desired table

    Set NewRange = Table.Range

    Dim rng As Range
    Dim rngaddr As String
    Dim TableChanged As Boolean

    TableChanged = False

    For Each rng In NewRange
        rngaddr = rng.address
        If rng.Value <> ActiveWorkbook.Sheets("DATA").Range(rngaddr).Value Then
             'do something
             TableChanged = True
        End If
    Next
End Sub

請記住:每次更改表時,都需要保存表的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM