2015-10-23 36 views
2

我以前用的是这样的:在多个文件中替换VBA代码的最佳方法?

Dim vbaComponent As Variant 
For Each vbaComponent In inputWorkbook.VBProject.VBComponents 
    vbaComponent.CodeModule.DeleteLines 1, vbaComponent.CodeModule.CountOfLines 
    vbaComponent.CodeModule.AddFromFile importComponentFileName 
Next vbaComponent 

这完美地工作了一段时间,但现在它时,Excel文件会保存崩溃。我猜这些文件太大了或者其他东西。

有没有更好的方法来做到这一点?

编辑:

这个问题似乎是frmcls文件。替换bas文件完美地工作

EDIT2:

在一些机器甚至bas文件不起作用。编辑3(我目前的解决方案): 因此,我现在的解决方案只是简单地做一次,记录所有的鼠标和键盘输入,然后重复播放。

如果没有适当的解决方案,我打算为此创建一个AutoIt脚本。

+0

嗨,我不明白为什么这会是题外话。如果没有VBA方式来做到这一点,但第三方解决方案可以,这将是一个可行的答案。 –

+0

“要求我们推荐或查找书籍,工具,软件库,教程或其他非现场资源的问题与Stack Overflow无关,因为它们倾向于吸引自以为是的答案和垃圾邮件,而是要描述问题以及所发生的一切做到目前为止解决它。“在巡回赛中提到这一点,你似乎没有打算在近3年内作为用户访问。 – pnuts

+1

好吧,我现在看到。无论如何,我希望有一个本土解决方案。 –

回答

1

你将不得不出口/进口部件,因为不是所有的线都暴露在CodeModule,这里是样品

Private Sub exportImportComponent(Project1 As VBIDE.VBProject, Project2 As VBIDE.VBProject) 
    Dim i As Long, sFileName As String 

    With Project1.VBComponents 
     For i = 1 To .Count 
      sFileName = "C:\Temp\" & .Item(i).Name 
      Select Case .Item(i).Type 
       Case vbext_ct_ClassModule 
        .Item(i).Export sFileName & ".cls" 
        Project2.VBComponents.Import sFileName & ".cls" 

       Case vbext_ct_StdModule 
        .Item(i).Export sFileName & ".bas" 
        Project2.VBComponents.Import sFileName & ".bas" 

       Case vbext_ct_MSForm 
        .Item(i).Export sFileName & ".frm" 
        Project2.VBComponents.Import sFileName & ".frm" 

       Case Else 
        Debug.Print "Different Type" 
      End Select 
     Next 
    End With 
End Sub 
+0

我已经有一个导出到.bas,.cls和.frm文件。我的问题是以编程方式导入它们。我曾经使用我的问题中的代码与importComponentFileName是相应的文件。但正如前面所说,由于某种原因不再有效。 –

+0

如果试图导入的名称的组件已存在,则导入将失败,请确保在解决名称冲突之前 – tsolina

+0

检查我在我的问题中编写的代码。我不会将导出的文件导入为新模块。我使用CodeModule.AddFromFile将其内容写入现有模块。 –

相关问题