如何在VBA复制工作表时同步复制其关联的宏代码?
解决复制工作表时同步复制宏代码的问题
方法一:直接复制模板工作表(推荐)
你原来的代码是先新建空白工作表再复制内容,这种方式带不走工作表模块里的VBA事件宏。直接复制模板工作表的话,包括Worksheet_Activate在内的工作表级宏会自动同步过来,之后再重命名新表即可。
修改后的代码:
Dim Wb As Workbook: Set Wb = ThisWorkbook Dim strNameOfSheetToCreate As String strNameOfSheetToCreate = ' 替换成你获取单元格字符串的代码,比如 Wb.Sheets("Sheet1").Range("A1").Value ' 复制模板工作表到工作簿最后 Wb.Worksheets("Project Template").Copy After:=Wb.Worksheets(Wb.Worksheets.Count) ' 给新工作表重命名 ActiveSheet.Name = strNameOfSheetToCreate
这种方式不用额外设置,就能完整复制模板的格式、公式、条件格式以及工作表模块里的所有宏代码。
方法二:通过VBA项目对象模型复制代码(需额外权限)
如果必须保留“新建空白表再复制内容”的流程,就得手动把模板工作表模块里的代码复制到新表模块中,但前提是要在Excel信任中心开启信任对VBA项目对象模型的访问权限。
代码示例:
Dim Wb As Workbook: Set Wb = ThisWorkbook Dim strNameOfSheetToCreate As String strNameOfSheetToCreate = ' 替换为你的单元格取值代码 ' 新建并命名工作表 Wb.Sheets.Add.Name = strNameOfSheetToCreate Dim SheetSource As Worksheet, SheetTarget As Worksheet Set SheetSource = Wb.Worksheets("Project Template") Set SheetTarget = Wb.Worksheets(strNameOfSheetToCreate) ' 复制格式、公式等内容 SheetSource.Cells.Copy SheetTarget.Cells.PasteSpecial Paste:=xlPasteAllMergingConditionalFormats ' 复制工作表模块中的宏代码 Dim sourceModule As Object, targetModule As Object Set sourceModule = Wb.VBProject.VBComponents(SheetSource.CodeName).CodeModule Set targetModule = Wb.VBProject.VBComponents(SheetTarget.CodeName).CodeModule ' 清空目标模块原有代码,再粘贴源模块代码 targetModule.DeleteLines 1, targetModule.CountOfLines targetModule.AddFromString sourceModule.Lines(1, sourceModule.CountOfLines) Application.CutCopyMode = False
注意:没开启权限的话这段代码会报错,权限设置路径是文件>选项>信任中心>信任中心设置>宏设置>勾选信任对VBA项目对象模型的访问。
内容的提问来源于stack exchange,提问作者Automation Monkey
相关产品推荐
相关产品推荐

