【问题标题】:Copy VBA code from one Worksheet to another using VBA code使用 VBA 代码将 VBA 代码从一个工作表复制到另一个工作表
【发布时间】:2014-07-11 15:38:15
【问题描述】:

好的,这就是我想要完成的:我正在尝试将所有 VBA 代码从“Sheet2”复制到“Sheet 3”代码窗格。我不是指将模块从一个模块复制到另一个模块,而是指 Excel 工作表对象代码。

我已经为 Applications Extensibility 5.3 添加了对 MS VB 的引用

我不知道从哪里开始,但这是我开始的,它不会去任何地方,而且可能全都错了。请帮助 - 只是想以编程方式将工作表 vba 代码复制到另一个工作表 vba 窗格。

Dim CodeCopy As VBIDE.CodePane
Set CodeCopy = ActiveWorkbook.VBProject.VBComponents("Sheet2").VBE
ActiveWorkbook.VBProject.VBComponenets("Sheet3").CodeModule = CodeCopy

【问题讨论】:

  • 这是一个常见的误解,即添加此引用是使用 VBIDE 所必需的。您可以使用Dim CodeCopy As Object

标签: vba excel


【解决方案1】:

使用CodeModule 对象而不是CodePane,然后您可以创建第二个变量来表示目标模块(您将“粘贴”代码)。

Sub test()

Dim CodeCopy As VBIDE.CodeModule
Dim CodePaste As VBIDE.CodeModule
Dim numLines As Integer

Set CodeCopy = ActiveWorkbook.VBProject.VBComponents("Sheet2").CodeModule
Set CodePaste = ActiveWorkbook.VBProject.VBComponents("Sheet3").CodeModule

numLines = CodeCopy.CountOfLines
'Use this line to erase all code that might already be in sheet3:
'If CodePaste.CountOfLines > 1 Then CodePaste.DeleteLines 1, CodePaste.CountOfLines

CodePaste.AddFromString CodeCopy.Lines(1, numLines)
End Sub

除了添加对“Reference to MS VB for Applications Extensibility 5.3”的引用之外

您还需要enable programmatic access 加入 VBA 项目。

在 Excel 2007+ 中,单击主功能区上的开发人员项目,然后 单击代码面板中的宏安全项。在那个对话框中, 选择宏设置并检查对 VBA 项目的信任访问 对象模型。

【讨论】:

  • 谢谢大卫 - 工作完美,现在我知道我的错误在哪里。现在我有另一个问题,但我的问题一开始很笼统。我要复制到的工作表是由 vba 代码创建的,所以我不知道它是什么表。它存储为变量“b”,因此我也将文本添加到新工作表中,我将其称为WorkSheets(b).Cells(4, 3).Value = screenName,但如果我尝试将Set codePaste = ActiveWorkbook.VBProject.VBComponents("Sheet3").CodeModule 中的“Sheets3”替换为b,那么它确实如此不工作...似乎我必须指定工作表#。有什么办法吗??
  • 顺便说一句,我会接受你的回答,因为你原来的回答是完美的。
  • 代替“Sheet3”试试Set CodePaste = ActiveWorkbook.VBProject.VBComponents(WorkSheets(b).Name).CodeModule
  • 目标工作表是同一个(活动)工作簿的一部分吗?如果是这样,请尝试: Set CodePaste = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.WorkSheets(b).CodeName).CodeModule. As long as b` 是代表工作表索引的整数,我认为这会起作用。
  • 只是添加这个以供将来参考,因为我花了几个小时调试这个。确保 numOfLines 属性始终 > 0,否则会出错。
【解决方案2】:

谢谢大家!在测试了上面的多个建议后,其中“b”是工作表名称,您必须使用.CodeName,而不是.Name

Set CodePaste = ActiveWorkbook.VBProject.VBComponents(WorkShe‌ets(b).CodeName).Cod‌​eModule

如果您已将目标工作表设置为对象:

Dim T As Worksheet  
Set T = Worksheets("Test")  

那么你只需要:

Set CodePaste = ActiveWorkbook.VBProject.VBComponents(Worksheets(T.Name).CodeName).Cod‌​eModule

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多