VBA将模块从一个Excel工作簿复制到另一个工作簿

我正试图从一个Excel工作簿复制模块到另一个使用VBA。

我的代码:

'Copy Macros Dim comp As Object Set comp = ThisWorkbook.VBProject.VBComponents("Module2") Set Target = Workbooks("Food Specials Rolling Depot Memo 46 - 01.xlsm").VBProject.VBComponents.Add(1) 

出于某种原因,这复制模块,但不复制VBA代码里面,为什么?

请有人告诉我我要去哪里错了吗?

谢谢

Sub CopyModule下面,接收3个参数:

1.Source Workbook(作为Workbook )。

2.Module Name to Copy(as String )。

3.目标工作簿(作为Workbook )。

CopyModule代码

 Public Sub CopyModule(SourceWB As Workbook, strModuleName As String, TargetWB As Workbook) ' Description: copies a module from one workbook to another ' example: CopyModule Workbooks(ThisWorkbook), "Module2", ' Workbooks("Food Specials Rolling Depot Memo 46 - 01.xlsm") ' Notes: If Module to be copied already exists, it is removed first, ' and afterwards copied Dim strFolder As String Dim strTempFile As String Dim FName As String If Trim(strModuleName) = vbNullString Then Exit Sub End If If TargetWB Is Nothing Then MsgBox "Error: Target Workbook " & TargetWB.Name & " doesn't exist (or closed)", vbCritical Exit Sub End If strFolder = SourceWB.Path If Len(strFolder) = 0 Then strFolder = CurDir ' create temp file and copy "Module2" into it strFolder = strFolder & "\" strTempFile = strFolder & "~tmpexport.bas" On Error Resume Next FName = Environ("Temp") & "\" & strModuleName & ".bas" If Dir(FName, vbNormal + vbHidden + vbSystem) <> vbNullString Then Err.Clear Kill FName If Err.Number <> 0 Then MsgBox "Error copying module " & strModuleName & " from Workbook " & SourceWB.Name & " to Workbook " & TargetWB.Name, vbInformation Exit Sub End If End If ' remove "Module2" if already exits in destination workbook With TargetWB.VBProject.VBComponents .Remove .Item(strModuleName) End With ' copy "Module2" from temp file to destination workbook SourceWB.VBProject.VBComponents(strModuleName).Export strTempFile TargetWB.VBProject.VBComponents.Import strTempFile Kill strTempFile On Error GoTo 0 End Sub 

主要Sub代码 (用于使用邮政数据运行此代码):

 Option Explicit Public Sub Main() Dim WB1 As Workbook Dim WB2 As Workbook Set WB1 = ThisWorkbook Set WB2 = Workbooks("Food Specials Rolling Depot Memo 46 - 01.xlsm") Call CopyModule(WB1, "Module2", WB2) End Sub 

奇妙的代码克里斯梅尔维尔,感谢吨,只是一些小的补充,我做了,并添加了一些评论。

只要确保在运行这个macros之前完成以下工作。

  • 项目清单

VB编辑器>工具>参考>(检查)Microsoft Visual Basic的应用程序扩展性5.3

  • 项目清单

文件 – >选项 – >信任中心 – >信任中心build立 – >macros设置 – >信任访问VBA项目对象模型。

一旦你做了以上的事情,复制并粘贴以下代码在源文件

 Sub CopyMacrosToExistingWorkbook() 'Copy this VBA Code in SourceMacroModule, & run this macro in Destination workbook by pressing Alt+F8, the whole module gets copied to destination File. Dim SourceVBProject As VBIDE.VBProject, DestinationVBProject As VBIDE.VBProject Set SourceVBProject = ThisWorkbook.VBProject Dim NewWb As Workbook Set NewWb = ActiveWorkbook ' Or whatever workbook object you have for the destination Set DestinationVBProject = NewWb.VBProject ' Dim SourceModule As VBIDE.CodeModule, DestinationModule As VBIDE.CodeModule Set SourceModule = SourceVBProject.VBComponents("Module1").CodeModule ' Change "Module1" to the relevsant source module ' Add a new module to the destination project Set DestinationModule = DestinationVBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule ' With SourceModule DestinationModule.AddFromString .Lines(1, .CountOfLines) End With End Sub 

现在在目标文件中运行“CopyMacrosToExistingWorkbook”macros,你会看到复制到目标文件的源文件macros。

实际上,你根本不需要把任何东西保存到临时文件中。 您可以使用目标模块的.AddFomString方法来添加源的string值。 尝试下面的代码:

 Sub CopyModule() Dim SourceVBProject As VBIDE.VBProject, DestinationVBProject As VBIDE.VBProject Set SourceVBProject = ThisWorkbook.VBProject Dim NewWb As Workbook Set NewWb = Workbooks.Add ' Or whatever workbook object you have for the destination Set DestinationVBProject = NewWb.VBProject ' Dim SourceModule As VBIDE.CodeModule, DestinationModule As VBIDE.CodeModule Set SourceModule = SourceVBProject.VBComponents("Module1").CodeModule ' Change "Module1" to the relevsant source module ' Add a new module to the destination project Set DestinationModule = DestinationVBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule ' With SourceModule DestinationModule.AddFromString .Lines(1, .CountOfLines) End With End Sub 

应该是不言自明的! .AddFomString方法只需要一个stringvariables。 所以为了得到这个,我们使用源模块的.Lines属性。 第一个参数(“1”)是开始行,第二个参数是结束行号。 在这种情况下,我们需要所有的行,所以我们使用.CountOfLines属性。

Shai Rado的导出/导入方法的优点是可以拆分它们,即将源代码工作簿中的模块导出为一个步骤,然后将它们导入到多个目标文件中!