Vba 在所有工作表中将宏更新为相同(或使代码更全局?)

Vba 在所有工作表中将宏更新为相同(或使代码更全局?),vba,excel,copy,vbe,Vba,Excel,Copy,Vbe,我有一本有几十张工作表的工作簿,而且还在增长。我可能很快就会得到这本工作簿的副本 每个工作表都基于相同的工作表模板,该模板在其工作表\u Change事件中包含一个宏,用于自动计算。随着我改进工作簿和添加功能,以及添加工作表,将更新的宏复制粘贴到所有工作表所需的时间越来越长 我想知道是否有办法: 制作另一个宏,将该宏的更新版本从模板复制到所有其他工作表,并在此过程中覆盖旧版本 和/或 将代码从工作表_change移动到一个更全局的地方,在那里我只需要更新每个工作簿的一个版本(这很好,比手动更新即

我有一本有几十张工作表的工作簿,而且还在增长。我可能很快就会得到这本工作簿的副本

每个工作表都基于相同的工作表模板,该模板在其
工作表\u Change
事件中包含一个宏,用于自动计算。随着我改进工作簿和添加功能,以及添加工作表,将更新的宏复制粘贴到所有工作表所需的时间越来越长

我想知道是否有办法:

  • 制作另一个宏,将该宏的更新版本从模板复制到所有其他工作表,并在此过程中覆盖旧版本
  • 和/或

  • 将代码从工作表_change移动到一个更全局的地方,在那里我只需要更新每个工作簿的一个版本(这很好,比手动更新即将成为3个工作簿的20多个工作表要好得多…)
  • 解决方案2会更好,因为我觉得更优雅?但我不知道这是否可能。除非如此,我很乐意接受1作为节省时间的理由


    提前感谢。

    如果我们讨论的是一个工作簿和多个工作表,那么一个简单的方法(解决更新问题)是:

  • 添加模块并编写包含原始更改事件代码的过程:

    Option Explicit
    
    Public Sub MyGlobalWorksheet_Change(ByVal Target As Range)
        ' here the code from your orignal Worksheet_Change.
        ' make sure you reference worksheets correctly
        ' the worksheet can eg be addressed like
        ' set ws = Target.Parent
    End Sub
    
  • 因此,在您的工作表中,您只需要添加一个通用调用,如

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        MyGlobalWorksheet_Change Target
    End Sub
    
    调用全局过程。因此,无需更改
    工作表\u Change
    事件,但只需添加一次即可

    每当您需要在代码处更改某些内容时,您只需要更改一个过程,即
    MyGlobalWorksheet\u change
    ,它会一次影响您所需的所有工作表(但只影响您向全局事件添加调用的工作表)

  • 请记住,反复复制同一代码总是一个坏主意,因为它很难维护。相反,请始终使用一个您反复调用的过程



    另一种方法是在
    thiswoolk
    范围内使用
    Workbook\u SheetChange
    事件。但这将影响工作簿中的任何工作表。以前的解决方案只会通过添加调用影响您选择的工作簿。

    当工作簿中的任何工作表发生更改时,有一些方法可以触发事件。这样合适吗?如果是这样,代码只需要存在于工作簿级别。请查找XLAM(Excel加载项)文件的内容和作用。但是,如果希望在单元格内容更改时进行更改,则必须使用“工作表更改”事件。也许如果你发布了一些代码,有人会看到其中是否有可以优化的。按照@JoeyGrant的建议,在工作表模块中,每个工作表都没有更改事件代码,您只需在
    此工作簿模块上放置一个更改事件代码
    ,即可用于工作簿中的所有工作表。当然,您需要从各个工作表模块中删除更改事件代码。您应该能够通过VBA将宏添加到工作簿中,但是这需要对您和同事的Excel Trust Center进行一些更改。因此,更倾向于使用AddIn。对于自动加载项更新,您可能需要使用批处理文件将更高版本复制到用户配置文件中。但是,实际上取决于此主文件和要执行的操作之间的关系,最终可能会将宏拆分为加载项和启用宏的模板。这是需要时间的设计!