[[20190605195134]] 『【VBA】 フォルダ内にファイルをドロップしたとax(かなこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『【VBA】 フォルダ内にファイルをドロップしたときに自動でマクロが動くように・・・』(かなこ)

フォルダ内にファイルをドロップしたときに
自動でマクロが動くような仕組みってできるのでしょうか。

ネットでいろいろと調べてはみたものの、ヒットしないので半ば諦めムード
なのですが...

やりたいことは、

フォルダ内にデータを処理するマクロブック(.xlsm)を予め入れて置き、
取り込みたいデータの入っている(.xlsx)がフォルダにドロップされたら
自動で動くような仕組みができたら嬉しいです。

ちなみにVBAは初心者みたいなものです。
データ処理するマクロはなんとかして作ったのですが、
ここでつまずいております。

< 使用 Excel:Excel2010、使用 OS:unknown >


たぶんですが・・・
>フォルダ内にデータを処理するマクロブック(.xlsm)を予め入れて置き、〜フォルダにドロップされたら
なので、マクロブックが起動していない自体でフォルダを監視できてないから無理です。

>ちなみにVBAは初心者みたいなものです。
>データ処理するマクロはなんとかして作ったのですが、
>ここでつまずいております。
自ブックが保存されているフォルダをチェックして、自ブック以外のExcelファイルがあったら処理する
みたいなマクロを組んでみてはどうでしょうか?

(もこな2) 2019/06/05(水) 20:45


 「フォルダー」へドロップは分からないですが・・ m(__)m

  VBSのファイルを作って、マクロブックと同じフォルダに入れ、
  そのショートカットをデスクトップ画面にでも置いといて、
 「そのショートカット」へデータブックをドロップする、
  なら実現できそうです。(どんなもんでしょうか?)

 ところで、マクロブックのプログラムは、
 名前が特定されてない「データブック」をどうやって特定して
 処理するように作ってあるんですか?

 もしかして、データブックの名前はいつも同じなんですか?

(半平太) 2019/06/06(木) 09:43


 > もしかして、データブックの名前はいつも同じなんですか?

 そんな訳ないですね。2回目以降、既存の同名ファイルとすぐバッティングしますから。

 ※いつも同じ名前じゃないとしても、バッティングの心配はありますよね?
   この同名バッティング問題にはどう対処しているんですか?

(半平太) 2019/06/06(木) 10:11


ReadDirectoryChangesW とか、フォルダ内に変化があった場合、コールバック指定した関数に通知してくれるAPIがあります。 が、もしネットワーク上のフォルダだった場合に使えるかは判りません。 なお、APIは難しいので、このヒントだけでたどり着けないようなら、この方法は諦めてください。(初心者だ、と自覚されているのであれば、この話は聞かなかった事にするのが良いです)

別案として、Excel上でマクロを使い、Application.OnTime で周期的に実行し、フォルダ内のファイル全ての更新日時を調べ、前回と比較する、という方法なら、比較的容易に実現できるでしょう。 ただし、別PCがファイルコピーしている最中にマクロの動作周期がきても正しく判定できるか、しっかりテストしてください。
(???) 2019/06/06(木) 10:53


 >フォルダ内にファイルをドロップしたときに 
 >自動でマクロが動くような仕組みってできるのでしょうか。 

 ひとつ確認しておきたいです。

 ドロップしたとき、エクセルは既に起動しているんですか?

 ※ 起動しているなら、そんな難しい状況設定にしなくても、
  最終的に求める結果になるようなマクロを書いて、
  実行ボタンをワンクリックすれば済んじゃう話と思うのですが。

(半平太) 2019/06/06(木) 17:29


 >フォルダ内にファイルをドロップしたときに

 ではなく、フォルダをVBSファイルにドロップした時

 FolderExistsメソッド, FileExistsメソッドを利用したファイル/フォルダー判別スクリプト
https://win.just4fun.biz/?WSH/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%81%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B

(BJ) 2019/06/06(木) 20:59


 ああ、VBSから起動したエクセルはアドインを読みこまない。
 とかあったような気もする。
(BJ) 2019/06/06(木) 21:05

返答遅くなって申し訳ありません。

みなさん色々な解決方法をありがとうございます。

私の説明不足でやりたい作業のイメージ感が沸かないところもあるかと思い補足です。

フォルダ内のエクセルファイルのデータを開いて、別のエクセルファイルに転記して、
加工を加えたのちに保存し、メールに添付して送るというものです。

一日に何度かデータが送られてくるので、それをフォルダ内にドロップしたら
処理ができるようにしたら、エクセルをわざわざ開かずかなり楽になるなあという
発想のもとお尋ねしました。

「フォルダー」へドロップは分からないですが・・ m(__)m
     →デスクトップにフォルダのショートカットを作成して、
      そのフォルダにデータをドロップした際に処理が始まるようなイメージです。

 ところで、マクロブックのプログラムは、
 名前が特定されてない「データブック」をどうやって特定して
 処理するように作ってあるんですか?
 もしかして、データブックの名前はいつも同じなんですか?

     →拡張子.xlsxを開くように作ってます。

 ※いつも同じ名前じゃないとしても、バッティングの心配はありますよね?
   この同名バッティング問題にはどう対処しているんですか?

     →転記したのち、ファイルを削除してます。

ドロップしたとき、エクセルは既に起動しているんですか?

     →エクセルは起動したいない状態です。

VBSでは、今回私が補足した作業イメージのようなことってできそうですか?

また、いろいろな意見を拝見したところ、添付ファイルをフォルダ内に入れておくときの
時間を決めておけば”Application.OnTime で周期的に実行”というやり方も、できそうな気は
しますがそのような考えで大丈夫なんでしょうか?
(かなこ) 2019/06/12(水) 23:22


フォルダにファイルを置く人が貴方だけなら、フォルダ監視なんて必要なくて、ボタンを押したらフォルダにファイルをコピー後、処理をするマクロを作れば良いのでは?

Application.OnTimeは、Excelを誰かのPCで1つ常駐させてマクロを動かしておいて、ゆっくりペースでフォルダを監視するために必要な命令です。 メールの添付からのアクションなんて、日に何回かあるだけで、1秒間に何度も、なんて事はないでしょうから。

または、フォルダへのコピーを何回かやった後に、まとめて処理しても良いならば、ボタンを押すとフォルダ内にあるファイル全てを処理するマクロを作るだけで済みますよ。 フォルダに置いた後にリネームや削除をする事があるならなおさらです。 正しい名前にする前に置いた事を検出されて処理が始まったらどうするのでしょう? ボタンを押したら動く、であれば、全ての準備ができてから押せば良いだけの話です。

APIを使って監視するのは、置いた瞬間に検出できるので、最速・最適ですが、Windowsの管理するフォルダである必要があるので、例えばWindowsサーバを使っている場合に、サーバに何らかのプログラムを常駐させておくとか、ちょっと大変かと思います。 自PC内のフォルダなら自PC内に常駐させるだけですが、上で書いたように、面倒なAPIを調べてまで開発する程の処理には思えないのですよねぇ。
(???) 2019/06/13(木) 09:30


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.