dポイントプレゼントキャンペーン実施中!

VBAのモジュールについて教えて下さい。

ブック1のコードを全てブック2のコードへ上書きをしたいです。
シートモジュール、ユーザーフォーム、標準モジュール全てです。

なぜかと言うと、ブック1はマスタとしてマクロの作り込みのみ行います。
ブック2というのは実際に業務で使うブックで同様のブックがいくつもあります。
マクロの修正があった時に、全てのブックを1つ1つ修正するのは大変なので、ブック1というマスタのコードを一括で他のブックへ上書きしたいのです。

ただ、ブック1とブック2はシートの数も名前も違います。
標準モジュールやユーザーフォームはある程度できたのですが、シートモジュールがクラスモジュールとしてインポートされる為、シートモジュールへ入れる事が出来ません。

どなたか御教授下さい。

A 回答 (3件)

自ブックのコードを読むところから説明しないといけないかな。


#2は、全部でないけど
自ブックのDocument モジュールの読込は、下記を参考にしてください。
配列に入れるなどして読み込んだ方が書き込み時、処理速度としてよいかと思います。
また、#2などでモジュールに書き込む際は、VBAの弱点、一つずつの書き込みを行うので
ブックの数、モジュール数、コードの量でスタックする恐れがありますので
メイン処理をサブに出すなどして、少しでもメモリ確保(解放)した方が良いと思います。

Sub MyCode_Substitution()
Dim Target As Workbook, i As Long, strCo
Dim oVBC As VBComponent
Set Target = ThisWorkbook
   For Each oVBC In Target.VBProject.VBComponents
    If oVBC.Type = 100 Then
      With Target.VBProject.VBComponents(oVBC.Name).CodeModule
       For i = 1 To .CountOfLines
        strCo = .Lines(i, 1)

         Debug.Print strCo ’試してください。

       Next i
     End With
    End If
   Next oVBC
End Sub

読込の順番は、ThisWorkbook sheet1,,,,,です。
入力されているすべて、(空行を含む)が一行ずつ出力されます。#2と組み合わせ
他ブックのDocumentモジュールを書き換えて下さい。

ズバリ、実行するだけのコードが良いのであれば、リクエストを

しかし、>シートの数も名前も違います。

どこに書き込むか、指定しないで良いのでしょうか?
全ブックの共通モジュールは、ThisWorkbookだけですが、、、
後からこうしたい話は、無しですよ。
    • good
    • 0

>ブック1というマスタのコードを一括で他のブックへ上書きしたいのです


読み飛ばしていました。
モジュールごとだと、
Workbooks("Book1.xlsm").VBProject.VBComponents("Module1").Export Book_path&Module.bas(対象モジュール)
Workbooks("Book2.xlsm").VBProject.VBComponents.Import Book_path&Module.bas
のような感じでしょうか?
しかしながら、Exportには、Typeが、1、2、3しかないようで、、まあ、Document モジュールは、
Book本体のモジュールなので当たり前かもしれません。(シートモジュールを追加する場合は、シートを作成するので)

従って、Document モジュールは一行ずつ書き替える などをする必要があります。
参考コード(一部) 別サイトに掲示したものを掲載、変数は読んでください。

ReDim Pch_Arr(0)
Pch_Arr(0) = PATH_
n = n + 1
Set fso = New FileSystemObject
On Error GoTo ErrHndl
listSubFolders fso.GetFolder(PATH_), n
If Sgn(Pch_Arr) <> 0 Then
 For j = 0 To UBound(Pch_Arr)
   File_Name = Dir(Pch_Arr(j) & "*" & extension)
   On Error Resume Next
   Do While File_Name <> ""
    Set Target = Workbooks.Open(Pch_Arr(j) & File_Name)
    If Target.VBProject.Protection <> 0 Then GoTo skp
    For Each oVBC In Target.VBProject.VBComponents
     If oVBC.Type = 100 Then
       With Target.VBProject.VBComponents(oVBC.Name).CodeModule
        For i = 1 To .CountOfLines
         strCo = .Lines(i, 1)
          
          書き込みコードを書く場所

        End If
       Next i
     End With
    End If
   Next oVBC
skp:
   Target.Save
   Target.Close
   File_Name = Dir()
  Loop
Next j
End If
    • good
    • 0

>標準モジュールやユーザーフォームはある程度できた.



のであれば、VBComponents.Nameを指定して
VBComponentsのTypeを指定するのはどうでしょう。
Document モジュール .Type = 100
クラスモジュール .Type = 2

>インポートされる為
ブック2側で実行するのではないですよね。

書き込みは、モジュールレベル?コードレベル?
取敢えず、検証しておりませんが、、、
もう少し、具体的なものを頂けると。。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!