- ベストアンサー
一つのブックで作成したマクロを複数のブックにコピーするには?
OSはXP_SP2、EXECEのバージョンは2003です。 (たとえば) D:\testというフォルダに1.xlsから2000.xlsというシート構成同一のブックが2000個あるとします。 「1.xls」のThisWorkbookにprivate subマクロを作成してテストを行い、 その後、2.xls~2000.xlsまでのブックのそれぞれのThisWorkbookにそのマクロを一気にコピーするとかの方法があるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
下の二番目のマクロにミスがありました Public Sub aaa(target As Workbook) Dim ret As String Dim ret2 As String With target.VBProject.VBComponents("ThisWorkbook").CodeModule ret = .ProcStartLine("Workbook_BeforeClose", 0) ret2 = .ProcCountLines("Workbook_BeforeClose", 0) Call .DeleteLines(ret , ret2) Call .AddFromFile("c:\a.txt") End With End Sub 開始行と削除行数が逆でした、失礼いたしました。
その他の回答 (2)
- mottimk2
- ベストアンサー率75% (3/4)
質問者さんが知りたいのは、プロシージャの追加をマクロ上から行いたいということで宜しいですか? 残念ながらエクセルVBAにはモジュールを差し替える関数はありますが、プロシージャを差し替える関数はありません。 しかし追加だけなら一行で行う方法もあります。 対象とするシートにWorkbook_BeforeCloseプロシージャが無ければ、下の関数を回せばいけます。 コード中にあるa.txtの内容は、モジュールに追加したいプロシージャです。 つまり質問者さんが下で書いてたコードをテキストに保存したものです。 Public Sub aaa(target As Workbook) With target.VBProject.VBComponents("ThisWorkbook").CodeModule Call .AddFromFile("c:\a.txt") End With End Sub すでにWorkbook_BeforeCloseプロシージャが存在する場合(つまり差し替えを行いたい場合)はもう少しコードを追加して Public Sub aaa(target As Workbook) Dim ret As String Dim ret2 As String With target.VBProject.VBComponents("ThisWorkbook").CodeModule ret2 = .ProcStartLine("Workbook_BeforeClose", 0) ret = .ProcCountLines("Workbook_BeforeClose", 0) Call .DeleteLines(ret - 1, ret2 + 1) Call .AddFromFile("c:\a.txt") End With End Sub で行けます、a.txtは上と同じく追加したい内容です。 ただし2番目のコードの方は、該当のプロシージャが存在しないとエラーを吐くので、そこら辺のエラー処理はご自分で。 また一括で変更したいとのことですが、 ファイルシステムオブジェクト辺りを使ってFor文で回して、全ファイルに処理を適用させれば実現は可能でしょう。 失礼を承知で言わせていただければ、拝見させていただいたソースコードを見る限り、質問者さんのVB(A)歴は浅そうだと感じましたので、(主に変数宣言を明示的に行っていない点など)少し付け加えさせていただきます。 モジュールに対する操作は、一昔前にはやったマクロウィルスなどでよく使われていた物なので、 環境によってはアンチウィルスソフト等に文句を言われます。 また、ちょっとしたバグが原因で今まで作ってきたExcel資産を再起不能にすることもあります。 下の方はアドイン化を進めていますが、終了時のイベントを取得したいと言うこともあり、 アドイン化はなかなか困難でしょうが、上記の問題点をよく認識して、一括でやるほうが良いのか、 手間は掛かっても手動で一つ一つ書き換えたほうが良いのか選択してください。 少なくとも、FSOを含めたオブジェクト全般に対するそれなりの知識が無いのであれば、手動でやったほうが無難だとは思います。
- hana-hana3
- ベストアンサー率31% (4940/15541)
マクロで可能ですが、十分な知識が必用になって来ます。 必用なマクロを作成して、アドイン登録して仕舞う方が遙かに簡単かと思います。 http://www.asahi-net.or.jp/~ef2o-inue/haifu/sub06_030.html
お礼
早速のご回答ありがとうございます。 アドインも考えなくはなかったのですが、マクロを外部に依存しない形 で考えていたもので、一つ一つのブックにマクロ記述を行うことができ ないものかと考えての質問でした。 言葉が足らずに申し訳ありませんでした。 マクロで可能であればそれをご教示いただければたすかります。 ThisWorkbookには Private Sub Workbook_BeforeClose(cancel As Boolean) タイトル = "確認" メッセージ = "ファイルを保存して、一覧表を更新しますか?" スタイル = vbYesNo + vbQuestion + vbDefaultButton1 yesno = MsgBox(メッセージ, スタイル, タイトル) If yesno = vbYes Then Workbooks.Open Filename:="管理用マクロ.xls" ThisWorkbook.Activate Application.Run "管理用マクロ.xls!koushin" End If End Sub の記述をいれたいと思っています。
お礼
あわてて、補足のところにお礼を書いちゃいました^^;; 失礼しました。
補足
丁寧な説明とご指摘感謝致します。 確かに知識が豊富とはいえないのですが、教えて頂いた内容を参考にしながらテストファイルを10個ぐらい作ってやってみます。