こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

標準モジュール、フォームを別のブックにコピーするには?

いつもお世話になります。
以下のようなVBAを作成しました。

sub test()
Sheets(Array("追加テンプレート", "入庫", "出庫", "在庫")).Select
Sheets("在庫").Activate
Sheets(Array("追加テンプレート", "入庫", "出庫", "在庫")).Copy
Sheets("在庫").Activate

ActiveWorkbook.SaveAs Filename:= _
"D:\" + CStr(Month(Date) + 1) + "月度在庫表",    FileFormat:=xlNormal,Password:="", WriteResPassword:="", ReadOnlyRecommended:=False,CreateBackup:=False
end sub

新しく作成したブックに標準モジュールとフォームが
コピーされません。
ほかにVBAの記述が必要かと思いますが、
本をひっくり返しても見つかりませんでした。

みなさま宜しくお願いいたします。

投稿日時 - 2006-11-15 15:45:01

QNo.2541080

困ってます

質問者が選んだベストアンサー

シートのコピーだけではVBAは保存されません。

ActiveWorkbook.SaveCopyAs
の1行で、開いているブックのコピーを保存出来ます。

投稿日時 - 2006-11-15 15:57:59

お礼

ご回答ありがとうございます。
ブックごとコピーして保存すればいいのですね。
これがいちばん簡単かもしれません。

投稿日時 - 2006-11-16 09:09:26

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

KenKenSPさん、こんばんは。
いつも勉強させていただいています。

>知っておくと何かと VBA モジュールの操作は便利なコードですよ

仰るとおりです。
当方もたまーに遊び程度ですがそれらについては利用しています。
現在使用中のコードへの追加削除とか
コマンドボタンの追加消去に伴うイベントの追加削除等々。

それはそうとして、
今回のはKenKenSPさんの回答がどうのこうの
という意味で回答したわけではありませんので
その辺りのことはご理解いただければと思います。
これからも目から鱗の回答を期待しております。
 

投稿日時 - 2006-11-15 23:26:27

ANo.6

> VBAでモジュールやフォームをコピーしたいのですが、
というご要望のサンプルにはなってると思うので。

> これだけで十分目的は達せられると思うのですが・・・(^^;;;
その通りです...ね(^^; まあ、知っておくと何かと VBA モジュールの
操作は便利なコードですよ。

投稿日時 - 2006-11-15 22:42:25

ANo.5

sub test()

 ActiveWorkbook.SaveAs Filename:= "D:\" + CStr(Month(Date) + 1) + "月度在庫表"

End Sub

これだけで十分目的は達せられると思うのですが・・・(^^;;;
 

投稿日時 - 2006-11-15 22:10:43

お礼

おっしゃるとおりです・・・

肝心なところが頭の中から抜けていて、
みなさまのお時間を取ってしまいました。

ご回答ありがとうございました。

投稿日時 - 2006-11-16 09:14:45

ANo.4

こんばんは。KenKen_SP です。

下記サンプルは、VBA プロジェクトが保護されていると失敗します。また、
Excel2002 以上の場合は、
  [ツール]-[マクロ]-[セキュリティー]-[信頼のおける発行元]
において、
  [Visual Basic プロジェクトへのアクセスを信頼する]
にチェックを入れておく必要があります。

 # Wendy02 さんのアドイン化したらどうか...というのは私も同感です。

Sub Sample()

  Dim vShNames  As Variant
  Dim Wb     As Workbook
  Dim sMsg    As String
  Dim lRet    As Long
 
  vShNames = Array("追加テンプレート", "入庫", "出庫", "在庫")
  
  On Error Resume Next
  ThisWorkbook.Sheets(vShNames).Copy
 
  Set Wb = ActiveWorkbook
  Wb.Sheets("在庫").Activate
  lRet = CopyVBAModule(ThisWorkbook, Wb)
  If lRet = 0 Then
    MsgBox "モジュールのコピー中にエラーが発生しました" & vbLf _
       & "全てまたは一部のモジュールがコピーされてません", vbCritical
  End If
  Wb.SaveAs Filename:="D:\" & CStr(Month(Date) + 1) & "月度在庫表.xls"
  Set Wb = Nothing

End Sub

' // VBA モジュール(シートモジュール除く)を他ブックへコピーします
Private Function CopyVBAModule( _
  ByVal WbSrc As Workbook, _
  ByVal WbDst As Workbook _
) As Long
 
  ' 引 数:WbSrc コピー元ワークブック オブジェクト
  ' 引 数:WbDst コピー先ワークブック オブジェクト
  ' 戻り値:成功 コピーしたモジュールの数 失敗 0

  Dim sPath  As String
  Dim sFile  As String
  Dim sCode  As String
  Dim VBC   As Object ' VBComponent
  Dim lCount As Long

INIT:
  sPath = WbSrc.Path
  If sPath = "" Then sPath = Environ("tmp")
MAIN:
  On Error GoTo ERROR_COPYMODULE
  For Each VBC In WbSrc.VBProject.VBComponents
    Select Case VBC.Type
      Case 1 To 3: ' 1:Module 2:Class 3:Form -----------------------------
        sFile = sPath & "\" & VBC.Name
        ' Export Module
        VBC.Export Filename:=sFile
        ' Import Module
        WbDst.VBProject.VBComponents.Import Filename:=sFile
        ' Delete Exported Module File
        Kill VBC.Name
        If VBC.Type = 3 Then
          Kill VBC.Name & ".frx"
        End If
        lCount = lCount + 1
      Case 100: ' 100:Sheet or ThisWorkbook ------------------------------
        If VBC.Name = "ThisWorkbook" Then
          With WbSrc.VBProject.VBComponents("ThisWorkbook").CodeModule
            sCode = .Lines(1, .CountOfLines)
          End With
          With WbDst.VBProject.VBComponents("ThisWorkbook").CodeModule
            .DeleteLines 1, .CountOfLines
            .InsertLines 1, sCode
          End With
          lCount = lCount + 1
        End If
    End Select
  Next
TERMINATE:
  On Error GoTo 0
  CopyVBAModule = lCount
  Exit Function
ERROR_COPYMODULE:
  CopyVBAModule = 0
End Function

投稿日時 - 2006-11-15 20:38:53

お礼

>VBA プロジェクトが保護されていると失敗します。
ネットで巡回していても
VBAプロジェクトを使用するコードがあったのですが、
ことごとく、失敗してしまっていました。

原因がわかったと同時に
すばらしいコードをありがとうございます。

今回はシンプルにブックごとコピーして
目的を達成したいと思います。

ありがとうございました。

投稿日時 - 2006-11-16 09:13:17

ANo.3

こんばんは。

VBAで、Module も UserFomr もコピーは出来ますが、
ただ、ざっと見たかんじ、次の月に使うという内容のようです。

>"D:\" + CStr(Month(Date) + 1) + "月度在庫表"

もし必要なら、そのマクロを、別のブックに移して、そのブックをアドイン形式にすればよいのではありませんか?同じマクロをコピーして、次の月に使う必要性はないと思います。ただ、アドインは、ThisWorkbook ではありませんから、ActiveWorkbook などとして書き換えなくてはなりません。

投稿日時 - 2006-11-15 17:36:55

ANo.1

表示されているなら左上に一覧(プロジェクトエクスプローラ)があると思いますが
ここでフォームやモジュールを選択して右クリックで
エクスポートを選択して保存してください。

新しいブックでは「挿入」「モジュール」、「挿入」「フォーム」でインポートしてください。

各シート固有のVBAはコピーして貼り付けですね。

面倒なら不要なデータを削除したブックを、名前を付けて保存でテンプレートとして保存してください。
「ファイル」「新規作成」のダイアログで選択できます。

投稿日時 - 2006-11-15 15:53:03

お礼

ご回答ありがとうございます。

VBAでモジュールやフォームをコピーしたいのですが、
難しいのでしょうか?

投稿日時 - 2006-11-15 16:21:31

あなたにオススメの質問