- ベストアンサー
エクセルのマクロ
エクセルで"123"と"234"というファイルがあるとします。 123を開いていない状態の時に、何かエクセルのファイルを名前を付けて保存→"234"に上書きすると、"123"の"A"というマクロが実行される様にできますか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
マクロのファイルは234とは別のファイルにしています。(これは私の好み) Updatecheck で123と234 の最終更新日(DateLastModified)を比較して更新するかどうかを決めています。 FileSystemObjectを利用しています。(FileSystemObjectについてはVBAの資料よりVBSの資料のほうが詳しいようです。 ほとんどそのまま利用できますのでVBSの資料を参考にしたほうが早く理解できると思います) このコードをworkbook のコードのPrivate Sub Workbook_Open()から呼びます。 でこのBookをタスクスケジューラーに登録します。(「アクセサリー」「システムツール」にあります。 対象ファイルが複数あるようなのでその辺はシートにファイル名一覧を入れてfor nextを使うなど自分で工夫してね。 Sub Updatecheck() Dim FSysObj As Object Dim inppath As String Dim outpath As String Dim inpfile As Object Dim outfile As Object inppath = "D:\ddd\123.xls" outpath = "D:\ddd\234.xls" Set FSysObj = CreateObject("Scripting.FileSystemObject") Set inpfile = FSysObj.GetFile(inppath) Set outfile = FSysObj.GetFile(outpath) If inpfile.DateLastModified < outfile.DateLastModified Then DOupdate_proc End If Application.DisplayAlerts = False Application.Quit End Sub Sub DOupdate_proc() Dim inppath As String Dim outpath As String inppath = "D:\ddd\123.xls" outpath = "D:\ddd\234.xls" Workbooks.Open inppath Workbooks.Open outpath 更新処理 End Sub
その他の回答 (6)
- rivoisu
- ベストアンサー率36% (97/264)
Private Sub Workbook_Open() Updatecheck End Sub だけでいいと思います。 DOupdate_procはUpdatecheckから必要な時に呼ばれるSubですから。 なぜ application.run とするのでしょうか? マクロは全部サンプルに入っているのですから不要です。 うまくいかないときはどこがうまくいかないか(結果がおかしい(どういう風に)、エラーになる(どこがどんなエラー)、を書いていただくと回答しやすいです。 私も環境作ってdebugしているわけではありませんので。
お礼
Private Sub Workbook_Open() Updatecheck End Sub うまく行きました。ありがとうございます。助かりました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんぱんは。 >私はただ、"234"に保存さえすれば、自動的に"123"にデータが蓄積できたら良いなと思っただけです。できるだけ操作を減らし、ミスの元を断ちたかっただけです。 具体的なコードがあれば、それに加えることも可能です。似たようなコードのサンプルを書いています。以下は、一旦、インスタンスを設けて、それを操作します。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=5280581 #3
- Wendy02
- ベストアンサー率57% (3570/6232)
#2の回答者です。 >123を開いていない状態の時に、何かエクセルのファイルを名前を付けて保存→"234"に上書きすると、"123"の"A"というマクロが実行される様にできますか? #1さんへの補足と同じことを書かれても、こちらとしては、答えようがありません。私は、#1さんと同質の回答をしているわけではありません。私の投げかけた回答にどうしたらよいか、少しでも考えてみるべきです。 >"234"にマクロを登録しても"234"はマクロが登録されていないファイルに上書きされてしまいます。 常識的にあるわけありません。どうやって、そんなことが出来るのですか?何か勘違いしているのでしょうけれども、シートコピーでもするのですか?コピーされたくなければ、標準モジュールに書くか、シートのセル・コピーをすればよいのです。 最初に、私が、アドイン化するか、個人用マクロブックに、マクロを登録すると書いたことに理解できないなら、あきらめたほうがよいです。今使っているマクロでも提示するならともかく、いつまで経っても解決できませんよ。 一度、具体的なコードと合わせて、質問しなおしてみたら、どうですか?今のままでは、回答者側が勝手な想像と回答を繰り返すだけです。
補足
個人用マクロブックにマクロを登録し、システムからエクセルにデータを転送し、そのファイルを名前を付けて"234"に保存(上書き)し、マクロを実行させる方法は理解しました。 私はただ、"234"に保存さえすれば、自動的に"123"にデータが蓄積できたら良いなと思っただけです。できるだけ操作を減らし、ミスの元を断ちたかっただけです。ありがとうございました。
- rivoisu
- ベストアンサー率36% (97/264)
状況はなんとなくわかりました。 234はデータのみが毎日吐き出されていくファイルでマクロをそのファイルに入れてはいけない。 234のデータの一部(または全部、集計などのデータ)を123に追加する。 234が毎日のデータ123がその累積または累計みたいな関係と考えます。 毎日のデータの保存(234)が終わったら123に追加する処理を自動化したい。 しかし234の保存を知らせる方法は234にマクロが入れられない以上ありませんね。 通常はその >あるシステムから毎日データをエクセルに転送させます。 この処理に123を開く処理を追加するのが普通ですがその部分はいじれないのでしょうか。 であれば 累積処理(123にデータを追加する処理)が全自動(途中で人の手が介入しない)でできるのであればタスクスケジュールに入れるのが良いと思います。 時間を決めて起動し今日の処理が終わったかどうかをチェック(234の更新日時) し累積処理(234を開いてデータを取り込む)をする。 いかがでしょうか?
補足
時間を決めて起動し、今日の処理を終わったかどうかチェックし、データを取り込むという事ができるのですか? この様な事ができれば、私の理想がかないます。 タスクスケジュールに入れるとありますが、どの様に行ったらいいですか?ぜひ教えて下さい。よろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 マクロだけを抜き出して、Personal.xls(個人用マクロブック)やアドインに登録しておいたほうがよいと思いますが、 そうでなければ、 Sub MacroRunTest() Application.Run "123.xls!Test" '←マクロ名 End Sub ただし、目的のブックは開いてしまいます。
補足
"234"というファイルを上書きした時点で、"123"というファイルが開くのは問題ありません。但し、"234"にマクロを登録しても"234"はマクロが登録されていないファイルに上書きされてしまいます。 ですので、"234"にマクロを登録しないで、この様な事ができれば、どの様な方法でも構いません。 すいませんが、方法があれば教えて下さい。よろしくお願いします。
- rivoisu
- ベストアンサー率36% (97/264)
>123を開いていない状態の時 >123"の"A"というマクロが実行 開いてないファイルのマクロは実行できません。 "234"に上書き保存すると”123”が開いて自動的にマクロが起動するということでしょうか? それでもいいでしょうが、何のためにするのかを書いていただくと別の解決があるかもしれませんね。
補足
あるシステムから毎日データをエクセルに転送させます。 しかし、このエクセルのファイルにはマクロを組んだり、関数を使ったりできません。ファイルにデータを転送した後にマクロや関数を使う事はできるのですが、毎日なので非常に手間がかかります。 その為、このデータ転送をしたエクセルのファイルを毎日"234"というファイルに上書きし、(この"234"は、ある決まったフォルダに保存します。)"123"を開き、マクロを実行させ、"234"のデータを"123"のデータが入っている最後の行の次の行に追加させています。(システムから転送したデータを蓄積させているのが"123"です。システムからは1日分のデータしかデータを転送できません。) この毎日"234"に上書きし、"123"を開いてマクロを実行をやめる事ができれば、かなりの時間短縮になり、又この様な作業をいくつかファイルで行っています。さらにパートの方にしてもらっているので、保存はしたがマクロ実行は忘れていたなどもあります。 このような問題を解決する方法はありませんか? もしあれば教えて頂けませんか。よろしくお願いします。
補足
度々すいません。 別のファイルを"サンプル"として VBAの This Workbookに Private Sub Workbook_Open() Application.Run "サンプル.xls!Updatecheck" Application.Run "サンプル.xls!DOupdate_proc" End Sub とし、標準モジュールに Sub Updatecheck() Dim FSysObj As Object Dim inppath As String Dim outpath As String Dim inpfile As Object Dim outfile As Object inppath = "D:\ddd\123.xls" outpath = "D:\ddd\234.xls" Set FSysObj = CreateObject("Scripting.FileSystemObject") Set inpfile = FSysObj.GetFile(inppath) Set outfile = FSysObj.GetFile(outpath) If inpfile.DateLastModified < outfile.DateLastModified Then DOupdate_proc End If Application.DisplayAlerts = False Application.Quit End Sub Sub DOupdate_proc() Dim inppath As String Dim outpath As String inppath = "D:\ddd\123.xls" outpath = "D:\ddd\234.xls" Workbooks.Open inppath Workbooks.Open outpath Application.Run "サンプル.xls!ここに実行したいマクロ名" End Sub とし、ワークブックを開くと、マクロ"Updatecheck"と"DOupdate_proc" が実行される様にしたのですが、これではうまくいきませんでした。 私の理解が間違っていた様です。 又、本題とそれてしまいますが、アクセスで同じ様な事(決まった時間に、エクセルのファイルからデータをインポートし、現在あるテーブルの最後のレコードの下に追加をする)はできませんか?教えて頂だけると非常に助かります。 よろしくお願いします。