2015-10-23 61 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將其內容寫入現有模塊。 –

相關問題