- 締切済み
excel VBA ファイル操作 マクロ について
excel VBA ファイル操作 マクロ についてです。 ファイルAを基本ファイルとし、ファイルBのマクロB1をファイルB上で実行させる方法はあるのでしょうか? (ファイルBのマクロB1をファイルA上で実行する方法はわかるのですが。。。) ファイルBを開いてB1を実行すれば問題ないのですが、ファイルがB~Zなど多数ある場合に、作業効率化したいのです。 その際ファイルBは開いても開かなくてもOKですが、ファイルB上に表示される実行結果は保存したいです。 その結果、エラーが出なければ「正常終了」、エラーが出れば「異常終了」などを、ファイルAに記録するものを作りたいのです。 どなたかご教授お願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
## たぶん、以下の点がわからないのでうまくいかないのだと思うのですが。 "ファイルB"をopenして、 workbooks("ファイルB").Activate してから処理すると ファイルA上のマクロでファイルAのSheet1のセルでなく、"ファイルB"のSheet1のセルとかの処理が できますが。 保存するなら、その後、saveすればいいです。 ただし、"ファイルB"で複数のウィンドウを開いている場合は、"ファイルB"でなく、"ファイルB:1"等になりますのでご注意。
- MARU4812
- ベストアンサー率43% (196/452)
> この時、Excelアプリケーションから > 見ればAもBも同等なので、「A上でXXX」という > 観点はオカシイのです。 私も同じ考えです。 Excelアプリケーション = Excel.EXE ソース上では Excel.Application が1つ だけ起動して、その中でファイルAのマクロも ファイルBのマクロも実行される事になります。 > Bを開いた後にBをActivateすれば済む話だと > 思いますが… 素人向けには私もまず、その説明をしますが、 本来はエクセルオブジェクトをブックから 指定すべきなのかもしれません。 ↓このままじゃコンパイルエラーかもしれないけど、 Excel.Application.Workbooks("Book1").Worksheets("Sheet1").Range("A1") 日本国東京都中央区3丁目みたいな。 これがファイルBになると 日本国大阪府中央区3丁目みたいな。 日本国→Excel.Application 東京都→ファイルA 大阪府→ファイルB 中央区→Sheet1 3丁目→セルA1 みたいな。 マクロの記録とかで出てくるコードは東京都であることを 前提に「中央区3丁目」のみで処理しようとするから、 対象ファイルをActivateにしないといけないんだけど、 もっと根本的に、省略しないで処理するようなプログラム を書いてやればいいだけだと思います。 それぞれを変数に入れる事もできます。 Dim app As Excel.Application Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim r As Excel.Range Set app = Excel.Application Set wb = app.Workbooks("Book1") Set ws = wb.Worksheets("Sheet1") Set r = ws.Range("A1") これをきちんとやっていれば、大阪から「東京都中央区」に 連絡する事も、東京から「大阪府中央区」に連絡する事も 可能です。 日本国の立場から命令するようにしてみてください。
- nda23
- ベストアンサー率54% (777/1415)
>ファイルBのマクロB1をファイルA上で実行する方法はわかる お分かりなら悩む必要は無いと思うんですけど? VBAではシングルスレッドなので、自動で複数 ブックのマクロを実行しようとしたら何がしかの マクロを実行しないとできません。 つまり、AのXXXがBのB1を実行してあげる わけです。この時、Excelアプリケーションから 見ればAもBも同等なので、「A上でXXX」という 観点はオカシイのです。 XXX(たまたまA上にある)を実行していたら、 B1(たまたまB上にある)を呼び出したという だけの話ですよ。 B1マクロに潜在バグである暗黙のオブジェクトを 使う記述(例えばSelectionとか対象物を指定 しないRange("~")など)があるなら、Bを開いた 後にBをActivateすれば済む話だと思いますが… OLEでExcelのプロセスを別途立ち上げて操作 する方法もありますが、やることは同じなので、 全く意味が無い(プロセスが増えるので負荷は 増大する)と分かるはずです。
- nda23
- ベストアンサー率54% (777/1415)
他のワークブックを開く Dim 他のブック As Workbook Set 他のブック = Workbooks.Open("~\B.xls") 他のワークブックを保存する 他のブック.Save 他のブックにあるマクロを実行する Run "B!xxx" ブック名 ! プロシージャ名 のように指定する。 エラーをハンドリングする Dim エラーメッセージ As String On Error Resume Next Run ブック名 & "!" & 関数名 エラーメッセージ = Err.Description On Error GoTo 0 これらの部品を適宜組み合わせ、ファイル名を 変えながらループすれば目的が達成できると 思います。
- kmetu
- ベストアンサー率41% (562/1346)
ファイルを開かずにその結果をそのファイルに保存することはできないでしょう。
補足
早速の回答有難う御座います。 >他のブックにあるマクロを実行する >Run "B!xxx" >ブック名 ! プロシージャ名 のように指定する。 これですと、 (ファイルBのマクロB1をファイルA上で実行する方法はわかるのですが。。。) のように、ファイルA上でマクロxxxが実行されてしまいます。 ファイルA上で操作しながら、ファイルBのマクロxxxを実行できればと思うのです。