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

VBA复制模块代码:如何通过工作表名称而非Sheet代号访问Excel Objects?

如何通过工作表名称而非代号访问Excel的VB组件?

你希望在VBA代码中用自定义的工作表显示名称(例如"Akquise2024"和"Akquise2023")代替工作表代号(如"Sheet1"、"Sheet10")来访问对应的VB模块,但直接使用VBComponents("工作表显示名称")无法成功。

问题原因

ThisWorkbook.VBProject.VBComponents接受的参数是工作表的代码名称(即VBA编辑器工程窗口中显示的名称,比如Sheet1),而非Excel界面底部标签显示的自定义名称。

解决方案

先通过工作表显示名称获取对应的工作表对象,再利用工作表的CodeName属性来访问其VB组件。

修改后的代码

Sub CopyCodeBetweenModules()
    Dim sourceSheet As Worksheet
    Dim targetSheet As Worksheet
    Dim sourceModule As Object
    Dim targetModule As Object
    Dim sourceCode As String
    
    ' 通过工作表显示名称获取工作表对象
    Set sourceSheet = ThisWorkbook.Worksheets("Akquise2023")
    Set targetSheet = ThisWorkbook.Worksheets("Akquise2024")
    
    ' 利用工作表的CodeName属性访问对应的VB组件
    Set sourceModule = ThisWorkbook.VBProject.VBComponents(sourceSheet.CodeName)
    Set targetModule = ThisWorkbook.VBProject.VBComponents(targetSheet.CodeName)
    
    ' 获取源模块的全部代码
    sourceCode = sourceModule.CodeModule.Lines(1, sourceModule.CodeModule.CountOfLines)
    
    ' 将代码插入目标模块的末尾
    targetModule.CodeModule.InsertLines targetModule.CodeModule.CountOfLines + 1, sourceCode
    
    MsgBox "代码复制成功!"
End Sub

可选:添加错误处理

如果需要避免因工作表名称错误导致的运行时错误,可以加入错误判断:

Sub CopyCodeBetweenModules()
    Dim sourceSheet As Worksheet
    Dim targetSheet As Worksheet
    Dim sourceModule As Object
    Dim targetModule As Object
    Dim sourceCode As String
    
    ' 检查源工作表是否存在
    On Error Resume Next
    Set sourceSheet = ThisWorkbook.Worksheets("Akquise2023")
    If Err.Number <> 0 Then
        MsgBox "找不到名为「Akquise2023」的工作表"
        Exit Sub
    End If
    
    ' 检查目标工作表是否存在
    Set targetSheet = ThisWorkbook.Worksheets("Akquise2024")
    If Err.Number <> 0 Then
        MsgBox "找不到名为「Akquise2024」的工作表"
        Exit Sub
    End If
    On Error GoTo 0
    
    ' 利用工作表的CodeName属性访问对应的VB组件
    Set sourceModule = ThisWorkbook.VBProject.VBComponents(sourceSheet.CodeName)
    Set targetModule = ThisWorkbook.VBProject.VBComponents(targetSheet.CodeName)
    
    ' 获取源模块的全部代码
    sourceCode = sourceModule.CodeModule.Lines(1, sourceModule.CodeModule.CountOfLines)
    
    ' 将代码插入目标模块的末尾
    targetModule.CodeModule.InsertLines targetModule.CodeModule.CountOfLines + 1, sourceCode
    
    MsgBox "代码复制成功!"
End Sub

内容的提问来源于stack exchange,提问作者Tirdrak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:28:10