簡體   English   中英

使用 Excel VBA 事件檢測單元格的合並/取消合並?

[英]Using Excel VBA Events to detect merging/unmerging of cells?

我試圖找到一種方法來檢測合並(或取消合並)單元格的立即使用。 更改事件觸發也不選擇更改。 我嘗試了其他一些,但似乎沒有事件觸發合並 - 我覺得這很奇怪。 我在更改事件中的代碼當前根據單元格的內容更改 Interior.Color。 如果單元格先合並后又取消合並,則顏色會保留在整個選區中。 但我希望它只在帶有文本的單元格中保留顏色,其余部分返回到 xlNone 。 無論如何要把它拉下來?

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column < 3 Then Exit Sub
If Target.Row <> 3 Then Exit Sub
Select Case Target.Text
    Case "Blackberry Serrano", "BS"
        Target.Interior.Color = RGB(120, 33, 111)
    [...more of the same...]
    Case ""
        Target.Interior.Color = xlNone
End Select
End Sub

據我所知,無法檢測單元格上的格式更改。 合並被視為格式更改,因此無法通過 VBA 事件檢測到。 然而,我做了一些挖掘,發現了這個有趣的列表:

  • 更改單元格的格式不會觸發 Change 事件(如預期)。 但是復制和粘貼格式確實會觸發 Change 事件。 選擇 Home=>Editing=>Clear=>Clear Formats 命令也會觸發該事件。
  • 合並單元格不會觸發 Change 事件,即使在此過程中刪除了某些合並單元格的內容。
  • 添加、編輯或刪除單元格注釋不會觸發 Change 事件。
  • 即使單元格一開始是空的,按 Delete 也會生成一個事件。
  • 使用 Excel 命令更改的單元格可能會也可能不會觸發 Change 事件。 例如,對范圍進行排序或使用 Goal Seeker 更改單元格不會觸發該事件。 但是使用拼寫檢查器確實如此。
  • 如果你的VBA過程更改單元格的內容,但觸發Change事件。

來自Excel 2013 Power Programming with VBA by John Walkenbach Source

所以基本上,如果有人只是合並或取消合並單元格,則無法通過 VBA 事件檢測到。

我找到了自己的工作方式來使我想要的事情發生。 不確定是否有更有效/更快的方法來做到這一點,但到目前為止它至少可以正常工作而沒有任何錯誤。 它在選擇更改后觸發,這比我想要的要慢,但 VBA 就是這樣。

對於工作表:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call EnforceFormatting(Target)
End Sub

在一個模塊中:

Public oldR As Range
Public newR As Range

Sub EnforceFormatting(ByVal Target As Range)
    Set newR = Target
    If oldR Is Nothing Then
        Set oldR = newR
        Exit Sub
    End If

    If oldR.Column < 3 Then
        Set oldR = newR
        Exit Sub
    End If
    If oldR.Row <> 3 And oldR.Row <> 7 And oldR.Row <> 11 Then
        Set oldR = newR
        Exit Sub
    End If
    If oldR.Rows.Count > 1 Then
        Set oldR = newR
        Exit Sub
    End If
    If oldR.Count > 1 Then
        Application.ScreenUpdating = False
        Dim c As Range
        For Each c In oldR
            c.Value = c.Text
        Next c
        Application.ScreenUpdating = True
    End If

    Set oldR = newR
End Sub

暫無
暫無

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

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