Excel技术问询:如何通过代码复制含VBA代码的工作表至同一工作簿
解决方案:复制工作表同时携带VBA代码
一、先启用VBA项目对象模型访问权限
默认情况下Excel会限制对VBA项目的访问,需先开启该权限:
- 打开Excel,点击「文件」→「选项」→「信任中心」→「信任中心设置」→「宏设置」
- 勾选「信任对VBA项目对象模型的访问」
- 点击确定,重启Excel生效
二、修改复制工作表的VBA代码
原代码仅复制工作表内容,需添加代码模块复制逻辑。替换原CopySheet代码为以下内容:
Sub CopySheet() Dim originalSheet As Worksheet Dim newSheet As Worksheet Dim originalModule As CodeModule Dim newModule As CodeModule Dim lineCount As Integer Set originalSheet = ActiveSheet ' 匹配以NEW开头的工作表(修正原代码的通配符写法) If originalSheet.Name Like "NEW*" Then ' 将工作表复制到工作簿末尾 originalSheet.Copy After:=Sheets(Sheets.Count) Set newSheet = ActiveSheet ' 获取原工作表和新工作表的代码模块 Set originalModule = ThisWorkbook.VBProject.VBComponents(originalSheet.CodeName).CodeModule Set newModule = ThisWorkbook.VBProject.VBComponents(newSheet.CodeName).CodeModule ' 清空新工作表代码模块的原有内容(新表默认为空,此步骤为冗余保障) If newModule.CountOfLines > 0 Then newModule.DeleteLines 1, newModule.CountOfLines End If ' 复制原工作表的所有VBA代码到新表 lineCount = originalModule.CountOfLines If lineCount > 0 Then newModule.AddFromString originalModule.Lines(1, lineCount) End If End If End Sub
三、代码说明
- 修正了原代码中通配符的错误:
Like "NEW*"才是匹配以NEW开头的名称(原NEW**写法冗余) - 复制工作表后,通过
VBProject.VBComponents获取工作表对应的代码模块 - 先清空新表的代码模块(避免残留),再将原表的代码完整复制过去
- 确保新工作表完全继承原表的
Worksheet_Change事件逻辑
内容的提问来源于stack exchange,提问作者bosman20
相关产品推荐
相关产品推荐

