You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:47:42