【问题标题】:Run a Macro every time sheet is changed每次更改工作表时运行宏
【发布时间】:2015-08-26 22:38:54
【问题描述】:

我对宏还是很陌生,我有一些代码需要在每次更新、更改或其他任何事情时在工作表上运行。

这是我需要运行的代码:我该怎么做?

Sub UnMergeFill()

    Dim cell As Range, joinedCells As Range

    For Each cell In ThisWorkbook.ActiveSheet.UsedRange
        If cell.MergeCells Then
            Set joinedCells = cell.MergeArea
            cell.MergeCells = False
            joinedCells.Value = cell.Value
        End If
    Next

End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您可以通过定位要处理的合并单元格来提高宏的效率,而不是遍历Worksheet.UsedRange property 中的每个单元格并检查Range.MergeCells Property

    在工作表的常规Range.Find method 中,有一个选项可以查找格式。在此子对话框的 Alignment 选项卡上,您会找到用于定位 Merged cells 的选项。

            

    这可以使用Range.Find methodApplication object's .FindFormat property 合并到您的VBA 子过程中。

    您使用 FindFormat 的子程序:

    Sub UnMergeFill(Optional ws As Worksheet)
        If ws Is Nothing Then Set ws = ActiveSheet
        Dim fndMrg As Range, joinedCells As Range
        
        Application.FindFormat.MergeCells = True
        With ws
            On Error Resume Next
            Set fndMrg = .Cells.Find(What:=vbNullString, SearchFormat:=True)
            Do While Not fndMrg Is Nothing
                Set joinedCells = fndMrg.MergeArea
                fndMrg.MergeCells = False
                'fndMrg.UnMerge   '???
                joinedCells.Value = fndMrg.Value
                Set fndMrg = .Cells.Find(What:=vbNullString, SearchFormat:=True)
            Loop
        End With
        Application.FindFormat.MergeCells = False
    
    End Sub
    

    稍微修改了Worksheet_Change 事件宏,在处理过程中关闭了更多环境。

    Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo bm_Safe_Exit
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.DisplayAlerts = False
        
        Call UnMergeFill(Target.Parent)
        
    bm_Safe_Exit:
        Application.DisplayAlerts = True
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub
    

    我选择指定要处理的工作表,而不是依赖ActiveSheet property。当 Worksheet_Change 不是活动工作表时,它可能由外部进程启动。

    简而言之,尽可能选择批量操作,并尽可能避免循环。这并不快,但它应该比循环通过细胞快得多。

    【讨论】:

    • 好的,谢谢,我会看看。另一个问题,有没有办法根据 另一个 工作表中是否发生更改来在工作表中运行宏?基本上,一旦用户更新了不同工作表中的单元格,我就会尝试自动更新数据透视表(已经有宏)。如果这没有任何意义,我会尝试创建另一个线程。
    • wadr,这似乎是一个新问题。我会留意的。
    【解决方案2】:

    在该特定工作表的代码模块中,只需添加以下内容:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        UnMergeFill
        Application.EnableEvents = True
    End Sub
    

    【讨论】:

    • 宏现在运行速度慢了很多,不确定是否有任何快速修复。但能完成工作。谢谢
    • @odoc 很奇怪。这应该对执行速度产生零影响。关于 UnMergeFill() 过程,当合并的单元格未合并时,作为合并单元格的一部分的每个单独的单元格都具有合并单元格的值是否至关重要?这会增加很多开销。
    • 不是每个单元格,只是 B、C 和 D 列中的每个单元格都需要取消合并。
    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多