2016-04-22 33 views
1

他の.xlsmブックを作成するために使用するブックを作成しようとしていますが、追加するために必要なモジュールを取得する方法がわかりません。VBA - ブック内のモジュールを取得する

私のコード、そのまま下にある(ここでは与えられた答えから変更:How to add excel 2010 macro programmatically

私は助けを必要とする場所がImportModulesサブであり、コメントによって'LIST MODULES HERE

はどうすれば配列を取得することができます現在のブックに含まれるモジュールの数

Private Sub SVAmaker_Click() 

    Dim file As String 
    file = InputBox("SVA Planner file name", "Name", "Name") 

    Application.DefaultSaveFormat = xlOpenXMLWorkbookMacroEnabled 
    Workbooks.Add 
    ActiveWorkbook.SaveAs filename:=file 

    Dim WB As Workbook 
    WB = ActiveWorkbook 
    Call ImportModules(VBA.CStr(WB)) 

End Sub 

Sub ImportModules(sWorkbookname As String) 

    Dim cmpComponents As VBIDE.VBComponents 
    Dim wbkTarget As Excel.Workbook 

    Set wbkTarget = Workbooks.Open(sWorkbookname) 

    If wbkTarget.VBProject.Protection = 1 Then 
     Debug.Print wbkTarget.Name & " has a protected project, cannot import module" 
    GoTo Cancelline 
    End If 

    Set cmpComponents = wbkTarget.VBProject.VBComponents 

    Dim vModules As Variant 
    'LIST MODULES HERE 

    Dim i As Integer 
    For i = LBound(vModules) To UBound(vModules) 
     cmpComponents.Import vModules(i) 
    Next i 

Cancelline: 

    If wbkTarget.FileFormat = xlOpenXMLWorkbook Then 
     wbkTarget.SaveAs wbkTarget.Name, xlOpenXMLWorkbookMacroEnabled 
     wbkTarget.Close SaveChanges:=False 
    Else 
     wbkTarget.Close SaveChanges:=True 
    End If 

    Set wbkTarget = Nothing 

End Sub 

答えて

0

このようなモジュールを経由することができます。いくつかのコレクションを作成し、VBProjectのVBComponents内のすべてのオブジェクトを反復処理(モジュールのタイプの値が1である):

'declare some collection, which will contain modules 
For Each vbc In ThisWorkbook.VBProject.VBComponents 
    if vbc.Type = 1 then 
     'add to temporary collection ... for example for name, use vbc.name 
    end if 
Next 
+0

を助け、実際には、あなたのコードを見て、あなただけのcmpComponentsを反復してのコンポーネント・タイプを確認し、任意のコレクションを必要としないことを望みますそれは1に等しいなら、それはモジュールであり、あなたはそれをインポートすることができます。 – holmicz

0

あなたは各ループの簡単で、すべてのモジュールをループすることができます。 「Microsoft Visual Basic for Applications Extensibility」への参照が必要です。あなたはモジュール(フォーム、標準モジュール、ClassModuleなど)の種類を確認することができます.TYPEで

Dim vbcomp As VBComponent 

For Each vbcomp In ThisWorkbook.VBProject.VBComponents 

    'if normal Module 
    If vbcomp.Type = vbext_ct_StdModule Then 

     'Do Stuff 
    End If 
Next vbcomp 

0

このコードは役立つはずです。すべてのモジュールをデスクトップにエクスポートし、新しいワークブックを作成し、すべてのモジュールをインポートします。

Public Sub ExportImportAllModules() 

    Dim srcVBA As Variant 
    Dim tgtVBA As Variant 
    Dim srcModule As Variant 
    Dim wrkBk As Workbook 
    Dim sDeskTop As String 

    On Error GoTo ERROR_HANDLER 

    Application.DisplayAlerts = False 

    Set srcVBA = ThisWorkbook.VBProject 
    sDeskTop = CreateObject("WScript.Shell").specialfolders("Desktop") 
    Set wrkBk = Workbooks.Add(xlWBATWorksheet) 'New workbook with 1 sheet. 
    Set tgtVBA = wrkBk.VBProject 

    For Each srcModule In srcVBA.vbComponents 
     'There may be a better way to check it's a module - 
     'I'm making it up as I go along. 
     If srcModule.Type = 1 Then 'vbext_ct_StdModule 
      srcModule.Export sDeskTop & "\" & srcModule.Name 
      tgtVBA.vbComponents.Import sDeskTop & "\" & srcModule.Name 
      Kill sDeskTop & "\" & srcModule.Name 
     End If 
    Next srcModule 

    Application.DisplayAlerts = True 

    On Error GoTo 0 
    Exit Sub 

ERROR_HANDLER: 
    Select Case Err.Number 

     Case Else 
      MsgBox "Error " & Err.Number & vbCr & _ 
       " (" & Err.Description & ") in procedure ExportImportAllModules." 
      Err.Clear 
      Application.EnableEvents = True 
    End Select 

End Sub 
0

なぜ単にあなたがすでにそこにすべてのモジュール(およびシート)で新しいブックを持っているあなたに、ここから

Option Explicit 

Private Sub SVAmaker_Click() 

    Dim fso As New FileSystemObject 
    Dim myFile As file   
    Dim fileName As String 

    fileName = InputBox("SVA Planner file name", "Name", "Name") & ".xlsm" 

    Set myFile = fso.GetFile(ActiveWorkbook.FullName) 
    fso.CopyFile myFile, myFile.ParentFolder & "\" & fileName 

End Sub 

からモジュールをインポートしたい「マスター」ワークブックのコピーを作成していません。

あなたは、あなたがそれを開いて突き出いくつかのワークシートを削除し、FileSytemObjectのAPIを使用するために、「プレーン」VBAエクセルモデルオブジェクトコード

を持って行動する必要があるはずです、あなたは「Microsoftスクリプトランタイム」を参照する必要が

+0

私は仕事中の私の最後の週に私を楽しませ続けるための練習の多くです。しかし、答えをありがとう! – JChristen

1

後期

Dim vbcomp As VBComponent 
    Dim modules as Collection 

    set modules = new Collection 
    For Each vbcomp In ThisWorkbook.VBProject.VBComponents 

     'if normal or class module 
     If ((vbcomp.Type = vbext_ct_StdModule) _ 
      Or _ 
      (VBComp.Type = vbext_ct_ClassModule)) Then 

      modules.add VBcomp.name 

     End If 
    Next vbcomp 

:JChristenはgizlmoの提案に基づいて、私はコレクションを作成したい

それらのモジュールのリストを求めRあなたはこのように、このコレクションを使用することができます上:

Dim module  as Variant 
    for each module in modules 
     ' e.g. importing the module 
     import module 
    next module 

はそれが

関連する問題