• ベストアンサー

エクセルのマクロをファイル名で自動実行させたい

毎度お世話になっております。 エクセル2010で不慣れなマクロを作ったのですが、これを特定の名前のファイル名のBookに一括でコピー?、実行させるような方法はないでしょうか? ファイルを開く時に、マクロが動くようにAuto_Openマクロでやっと動くようになったのですが、ファイル名が「製品名(スペース)〇〇〇」の〇〇〇の付いたエクセルBookを開くときに、このマクロが自動で動くようにする方法は無いのでしょうか? ファイル数が結構あるので、これが出来れば非常に助かるのでお知恵をお貸しくださいませ。

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

  • ベストアンサー
回答No.5

No.3、補足・お礼欄への返信です。 > ひえ~、当方の質問が抜けだらけの為にすごいことになっていて恐縮するばかりです。 私としては、2つの共存し得ない方法のうち、 すべての対象ブックに既存のマクロを書き写すことにはネガティブ(理由は後述します)で、 個人用マクロブックの"ひとつの記述"のみで全体を簡素に済ませる事をNo.3では提案した訳ですが、 No.3で提案したものを実装する作業手順自体は、こちらでは数十秒で終るもので、 提案した内容自体は短手数でかなりシンプルなものです。 なんか ヒイチャッテ ます? 不足した情報を補う方向で書こうとすると、どうしても長文になってしまいますが、 それでも、私がここに書くことに要する労力のすべてよりも、 質問者さんが「不慣れなマクロを作った」り、質問したりする労力の方が 大きいのだろうと思いますから、 > 恐らく直ぐには実現できないと思いますが、非常に記載が丁寧なので、勉強もかねて少しずつ試してみたいと思います。 > 中身の理解は無理でも教わった通りやってみようと思います。そのくらいの必要性が有ります。(直ぐでなくても) 変に忖度するでなく、萎縮するでもなく、ご自分のペースでご自身のやりたいように自由にして下さい。 以下、前後しますが、、、。 > 現在ファイル数は500位ですが、頻度の高いファイルは150-250個程度なので > ファイルをxslmに逐一変更して保存し直すこと位は、 > コツコツやる気は有りますのでこの部分は削除して簡単な方が良いです。 「この部分は削除して簡単な方が良いです」とは? すべての対象ブックに既存のマクロを転写する方を選ぶ、という意思表示でしょうか? だとすれば、それはそれで構いませんが、私から返事差し上げることもないのかな?と思ったり。 一応、、、。 > 対象のファイル名は「製品A123 試験結果入力表」で「試験結果入力表」が付いている全てのファイルが対象です。 > 製品名と試験結果入力表の間は半角スペースです。 対象となるブック名を判別するパターンとしては、  " 試験結果入力表.xls"  「...を含む」 という解釈で宜しいですか? No.3の記述のうち   If Wb.Name Like "製品名[  ]*xls*" Then この↑一行を次の↓一行に差し替えることで対処できます。   If Wb.Name Like "* 試験結果入力表.xls*" Then ブック名を頼りに条件分岐をするのですから、 判別するパターンは適切に表現出来ているか慎重に確認してください。 > 1つ確認ですが、途中でxlsmのファイルが増(減)しても問題ないでしょうか? > 単純に新製品が出来れば、ファイルが増えますし どちらの方法を志向してのものかも不明ですし、何の「途中」か解りませんが 個人用マクロブックに纏めるのだとして、 日々運用を重ねる内に処理対象となるブックが新規作成されたり削除されたり、 ということには影響を受けません、 No.3で私が返答した > > 現状のままでしたら、 > > 各ブックにマクロを書いて、*.xlsxの場合は*.xlsmとして保存し直す これは既存のマクロをすべてのブックに転写する場合には、 必要になる、ということを指していて、 個人用マクロブックに纏める場合は、全く必要のない作業です。 、 > 上記のように*.xls,や *.xlsxファイルをxlsmで保存し直した時にも > 対象ファイルが増加することになりますので。 いいえ。 *.xlsmとして保存し直したら、原本の*.xlsや*.xlsxは 別の場所にアーカイブする(許される場合は破棄する)という作業は必須です。 保存し直すことで総数が変わることはあってはなりませぬ。 > ちなみに対象ファイルは全て同じフォルダーに保存されています。 対象ファイルを判別する際の確度を高める為に、 フォルダ名のチェックを追加することは可能です。 必要であれば今回の質問締切後にでも、また別途・別件の質問スレとして訊ねてみて下さい。 > ファイル形式をxslmに統一して保存し直せば、特殊な場合に該当するファイルは無いと思います。 「ファイル形式をxslmに統一」する必要があるとは思っていませんが、こちらとしてはどちらでもいいです。 すべての対象ブックに既存のマクロを転写する方法に対して 私は(条件付きですが)ネガティブだという理由を書きます。 マクロ(VBA)はコンピュータープログラムの一種です。 一般論として、最初に書いたプログラムがそのまま未来永劫、 不満なく使い続けられる可能性は決して高くはありません。 後から不備・不足に気付いたり、Excelのバージョン(仕様)変更に対処する必要が出来たり、 業務上の要求が追加・変更されたり、ブックの構成に変更や項目の追加が求められたり、 後から編集を加えたり必要なメンテを施したりすることを前提として、 それらが容易に速やかに適用できるように備える必要があります。 『同じ記述を多数書かない』ようにすることが肝要とする考え方です。 ファイル数500でも150でも、今はそれでいいのかも知れませんが、 後が大変な(というより管理し切れない)ような、、、。 とはいえ、どんなことでも正解はひとつではないですし、 どの方法を選ぶのが最適か判断出来るのは、現場で実際に運用している人だけですから、 こちらも何一つ断言できるものではありませんけれど。 強いて云えば、折衷案的に、 ' 〓〓〓 すべての対象ブック   〓〓〓 ' 〓〓〓 標準モジュール     〓〓〓 Private Sub Auto_Open()   Application.OnTime Now, "PERSONAL.XLSB!Module1.Macro1" End Sub ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ' 〓〓〓 PERSONAL.XLSB     〓〓〓 ' 〓〓〓 Module1 標準モジュール 〓〓〓 Sub Macro1()   ' お手持ちのマクロの処理内容 End Sub ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 のように実行マクロは個人用マクロブックに書き、 それをコールする記述のみを すべての対象ブック に転写しておく という方法であれば、対象ブック側の記述は固定で済みますから、 アップデートは短手数で済みますので、 これも有力な正解のひとつだとは思います。 どうせなら個人用マクロブックに纏めちゃえば手数は最も少なく済む という風に、この順番に考えてみてNo.3の時点で私の結論を提示しました。 (条件付きですが)というのは、 マクロそのものを書き換えるマクロ【VBIDE】を 使いこなせる人が周りにも居る、ということであれば、 メンテも比較的短手数で済みますから、それならば、 すべての対象ブックに既存のマクロを転写する方法もアリかな、という。 > 対象ファイルは1つのフォルダーに保存されているのですが、そのフォルダーはLAN サーバーの共通フォルダーです。 No.3でも触れましたが、確認するべきは、  複数のPCで開くことがあるか ということです。 編集する権限を持ったPCが一台だけであれば、保存先には依らず、 ほぼ(個人用マクロブックに纏めても)問題ありません。 複数のPCで開く場合は、お手元のマクロの処理内容によっては、 工夫が必要になる、ということです。 ファイルの「共有」というのは、 VBAの中でも前提が引っ繰り返る程の重い一大テーマになってきますし、 私個人は現在「共有」絡みの相談をサポートしていません。 NO.3では、こちらも知らされていなかった訳ですが、 > > 特殊な場合にも正しく機能させたいという場合は、それはそれで > > 別途質問を建て直してください。 もし今回の質問・回答での解決が難しいようでしたら、 今回の質問は一旦締切にでもして、 前提を整えた上で、今回の質問の中で見えてきた要件を整理して、 別件の質問として仕切り直しては如何でしょう、、、 ということを書いたつもりでした。 色々伝わり難かったようですみません。 そちらでの方針が固まって、更に掘り下げるようでしたら、 今回の質問でこちらに出来ることはお手伝いするつもりではいます。 公平を期す意味で添えておきますが、私が提示した方法は、 どうやら、馴染みの薄い、少数意見、ということのようですね。 簡単で易しく解り易く後になっても優しく保守に困ることなく、 トッツキ易いと感じた方法で進めればいいと思います。 少しでも参考になることがあったなら幸甚です。 ではまた。

akira0723
質問者

お礼

度々のご丁寧な解説を含めたご回答ありがとうございます。 >少しでも参考になることがあったなら幸甚です。 本当に大いに参考になりました。 最初にここに質問した時には、「エクセルのVer.を書くよう」に指摘された経験の持ち主ですので。 またの機会にもよろしくお願い致します。

akira0723
質問者

補足

当方のつたない質問に本当にご丁寧な対応にくださり、恐縮です。 PCは5台で当方を含め5人が日々の試験結果を品種別のファイルに入力していますのでもしそれらが使えなくなったら大問題になります。 よって、結論としては皆さんのご指摘の通り、出直したほうが賢明だと思います。 本当にお手数をおかけし申し訳ありませんでした。

その他の回答 (4)

回答No.4

> 出直します とのことですから、深追いはしませんが(笑)。 実に面白い命題なので少しばかり可能性を考えてみました。 結論から行くと辞めといた方が良いね、なんですが(笑)。 個人用マクロブックを使うのは大いに結構だと思います。 が、可能性の問題として、 > ファイル名が「製品名(スペース)〇〇〇」の〇〇〇の付いたエクセルBook これが例えば「製品名じゃない文字列(スペース)〇〇〇」でも動いてしまいます。 それはうまくないのでは?と老婆心ながら考える次第です。 さらに「そのマクロを使うのはご自身だけ?」という問題ですね。 個人用マクロブックはあくまでも個人(パソコン個体)用。 使う可能性があるパソコンすべての個人用マクロブックに仕込む必要があります。 それもまたうまくないのでは?と思ってしまうのです。 他のブックにマクロを書いてしまうマクロも出来なくはないのですが、 社会通念上、それがまかり通ってしまうと問題が出てしまう可能性があるので 私からは提示できません(笑)。 以上から、個人的にはあまりオススメはしませんよ、ということですね。 で、終わるのもなんとなく面白くないので・・・ 出来る可能性があるとしたら、なのですが。 必要なマクロを仕込んだ「真っ白な」ブック(Book_A.xlsm)を用意しましょう。 とりあえず、閉じておきましょうね。 別のブック(適宜)に以下のマクロを仕込みます。 ・Book_A.xlsm を開く ・> ファイル数が結構ある  うちの一つ(Book_B.xlsx)を開く ・Book_B.xlsx の全てのシートを Book_A.xlsm にコピー・貼り付け ・Aを「(xlsm形式で)名前を付けて保存」する  ※名前は「Book_B.xlsm」とでも ・Book_B.xlsm を閉じる これで、必要なマクロを含んだ「Book_B.xlsm」が出来上がります。 以上の処理を「必要な分だけ」繰り返すマクロを作ってやれば良いです。 「フォルダ内のすべてのブックに対して処理」などで検索すると 情報がわらわら引っかかってきますのでお調べくださいませ。

akira0723
質問者

お礼

お礼を言うのを忘れていました。 大変参考になりました。 またの機会にも宜しくお願い致します。

akira0723
質問者

補足

tsubu-yuki-さん 丁寧なご回答ありがとうございます。 realbeatinーさんもおっしゃっているように色々な問題が内包?されているようで当方程度の、という程もない知識ではやめておいた方が良い、ということが結論だと思います。 毎日仕事で使用するファイルなので、もし全滅にでもなったら当方には対処のしようがないので。 簡単なマクロでもまずは添付のような新規のBookで動作確認して、実際のファイルを持ち帰って、家のPCでTESTしてみてから、会社で少しずつ試しているので。 やはりもう少し勉強して、何をどうしたいのかがおふた方に説明できる程度になってから、当方にできそうなことを質問させていただきます。 とはいうものの、実際には教えてもらった通りに貼り付けて、後はHETのHELPと試行錯誤でいくつかのマクロが動くようになったレベルですので、本質問の解決までには程遠いのですが。 ただお騒がせしたのですから、お問い合わせの内容にだけは答えさせていただきます。 1.使用するPCはLAN接続の5台で各人が自分のPCでファイルに入力しています。 2.○○○は「・・・試験結果入力表」という文字で、このこの文字列は今回の対象ファイルにしか使用されていません。 お騒がせいたしました。 またの機会にもぜひよろしくお願いいたします。

回答No.3

こんにちは。 個人用マクロブック(PERSONAL.XLSB)の [ThisWorkbookモジュール]と[標準モジュール]に 以下の記述をそれぞれコピペして、一旦、Excelを終了します。  その際、「個人用マクロブックの変更を保存しますか?」  と訊かれるので、[はい]を押します。 次にExcelを開いた時から、「自動実行」が有効になります。 ユーザー操作によって開かれたExcelブック(*.xls, *.xlsx, *xlsm) のブック名をチェックして、  "製品名 "   半角スペース または  "製品名 "   全角スペース で始まる場合に限って、  "Module1"という名前の[標準モジュール]の  "Macro1"という名前の[マクロ] を実行させる例です。 > ファイル名が「製品名(スペース)〇〇〇」の〇〇〇の付いたエクセルBookを開くときに ご説明が抽象的でしたので、こちらの理解が至っていない場合は、補足ください、 > エクセル2010で不慣れなマクロを作ったのですが 中身が解りませんので、仮の処理として、   MsgBox ActiveWorkbook.Name と一行だけ書いてあります。 確認作業として、一旦、  "製品名 "で始まるブック名のExcelブック(無いなら作ってみて)  "製品名 "で始まらないブック名のExcelブック を開いてみて、メッセージボックスが表示される|表示されないことを チェックしてみてください。 確認が済んだら、 実際の処理内容を Module1 の Macro1 に納まるように書換えてください。 ' 〓〓〓 PERSONAL.XLSB     〓〓〓 ' 〓〓〓 ThisWorkbookモジュール 〓〓〓 qa9314028okw Private WithEvents xlApp As Application Private Sub Workbook_Open()   Set xlApp = Application End Sub Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook)   If Wb.Name Like "製品名[  ]*xls*" Then     Application.OnTime Now(), "Module1.Macro1"   End If End Sub ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ' 〓〓〓 PERSONAL.XLSB     〓〓〓 ' 〓〓〓 Module1 標準モジュール 〓〓〓 qa9314028okw Sub Macro1()   MsgBox ActiveWorkbook.Name End Sub ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 必要な解答としては以上です。 上で紹介した個人用マクロブックで処理させる方法でしたらば、 各ブックにマクロを設定する必要はありません、 ブックを開く度に、個人用マクロブックに書かれた内容が実行されるます。 尚、 お手持ちのマクロを実行してエラー発生した時にそのまま[終了]させた場合には 復旧の為に  PERSONAL.XLSB!ThisWorkbookモジュールの  Private Sub Workbook_Open() を直接一度だけ実行する必要があります。 また、 既存のブックに書かれた[Auto_Open]プロシージャ内での処理が 重複/競合しないように配慮してください。 > ...マクロを作ったのですが、これを特定の名前のファイル名のBookに一括でコピー?、 【VBIDE】という技術を使えばVBAによって各ブックにマクロを設定することも 可能ではありますが、 VBAに関する高度な習熟が求められますし、 公開の場でこの方法を伝えることは倫理的に難しいです。 (∵マクロを書き換えるマクロを悪意を持って使う人を助長することになるので) 本来ならば、事前にテンプレートブックを用意しておいて、 そちらにマクロを書いておくのが本筋でしょうね。 > ファイルを開く時に、マクロが動くようにAuto_Openマクロでやっと動くようになったのですが、 No.1様への補足欄 > > また、質問後に、現在のファイルがxlsとxlsxなので、(当方には)無理な内容かもしれないことに気付きました 現状のままでしたら、 各ブックにマクロを書いて、*.xlsxの場合は*.xlsmとして保存し直す 等の対策が必須になりますが、【VBIDE】抜きには現実的ではないでしょう。 > ファイル名が「製品名(スペース)〇〇〇」の〇〇〇の付いたエクセルBookを開くときに、 例えば「(スペース)」とか、「〇〇〇の付いた」ブックとか、 読んだ者の解釈に幅がある表現ですね。 半角スペースなのか全角スペースなのか、スペースが幾つなのか、 具体的に書いていないということは、明確に定まっていないということなのだと思います。 上で紹介した例では、既述の通り、  "製品名 "   半角スペース または  "製品名 "   全角スペース で始まり、  拡張子が".xls" で始まる ブック名を持つExcelブックが開かれた時だけ、 マクロを実行するように書いています。 こちらの想定が違っているようでしたら、もう少し具体的に、 (なるべく具体例を挙げて)ブック名がどのようなパターンだった時に マクロを実行したいのか、融通が利かないPC君に指示出来るように補足してみてください。 疑問への応答は以上です。 個人用マクロブック(PERSONAL.XLSB)の扱いに不慣れな場合も考えて、 (Web上にも多数情報はありますが)一応こちらからも簡単な説明を足しておきます。 解らないことがあったら訊いてください。 ↓Excelシートがアクティブな状態から  [マクロの記録]ボタンを押す ↓表示された[マクロの記録]ダイアログの  [マクロの保存先]に[個人用マクロ ブック]を指定 ↓仮の記録内容(ダミー処理)としてEnterキーを押す  マクロの[記録終了]ボタンを押す  Alt + F11 キーで ↓表示された Visual Basic Editor に対して  Ctrl + R キーで ↓表示/活性化された[プロジェクトエクスプローラー]を参照して  [PERSONAL.XLSB]配下の   [Module1]モジュールのコードペイン記述のすべてを上掲のものに書換え   [ThisWorkbook]モジュールのコードペイン記述のすべてを上掲のものに書換え ↓書換えが済んだらコードペイン2つとも閉じておく  Excelをアプリケーションごと終了 ↓以下、本文冒頭を参考に 最後に、 「ユーザー操作」ではなく「マクロの実行結果」としてブックを開く場合 とか、 「[ブックの共有]を適用したブック」を複数の環境から同時に開く場合 とか、 特殊な場合にも正しく機能させたいという場合は、それはそれで 別途質問を建て直してください。 以上ですが、何か不備・不足がありましたら、具体的な補足をお願いします。

akira0723
質問者

お礼

非常に丁寧なご回答ありがとうございます。 当方の無知を申し訳なく思います。 恐らく重要な条件が1つ抜けていることに「補足」した後に気付きました。 対象ファイルは1つのフォルダーに保存されているのですが、そのフォルダーはLAN サーバーの共通フォルダーです。 これはおそらく重要な条件だと思いますので、お礼の欄で補足させていただきます。

akira0723
質問者

補足

ひえ~、当方の質問が抜けだらけの為にすごいことになっていて恐縮するばかりです。 恐らく直ぐには実現できないと思いますが、非常に記載が丁寧なので、勉強もかねて少しずつ試してみたいと思います。 中身の理解は無理でも教わった通りやってみようと思います。そのくらいの必要性が有ります。(直ぐでなくても) 対象のファイル名は「製品A123 試験結果入力表」で「試験結果入力表」が付いている全てのファイルが対象です。製品名と試験結果入力表の間は半角スペースです。 現在ファイル数は500位ですが、頻度の高いファイルは150-250個程度なのでファイルをxslmに逐一変更して保存し直すこと位は、コツコツやる気は有りますのでこの部分は削除して簡単な方が良いです。 1つ確認ですが、途中でxlsmのファイルが増(減)しても問題ないでしょうか? 単純に新製品が出来れば、ファイルが増えますし、上記のように*.xls,や *.xlsxファイルをxlsmで保存し直した時にも対象ファイルが増加することになりますので。 ちなみに対象ファイルは全て同じフォルダーに保存されています。 当方、苦情の再発防止対策としてマクロを始めたばかりなので、折角のご回答の中身が理解できない状態ですので、内容の抜けはご了承お願い致します。 ファイル形式をxslmに統一して保存し直せば、特殊な場合に該当するファイルは無いと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

VBAなどを、始めたばかりの人がやる課題としては、むつかしい(情報を探すのがむつかしい)課題だと思う。本当はベテランに指導を受けて、データ構成(分け方)や、処理プログラムの構成(分け方)を指導を受けて勉強しないと、「したい」気持ちばかりでは実現しない。 「製品名」というから、製品が、たくさんあるのだろうが、商品ごとに下記がどうなっているのか、 (あ)使うデータが違って、別のブックのシートにある(せざるをれない)のか。 (い)処理するプログラムの大枠の型が他の製品と大きく違うのか。 どうなんですか。 製品の単価が違う程度の違いなら、製品単価の表を作って、表引きで済んでしまう課題も 「ある」。 説明の要領として (1)製品を説明の簡単のため、3製品に絞っる。 (2)手作業でエクセルでやる場合を想定して、逐一作業内容を、箇条書き文章に記述してしてみたら。 どこそこ(ブック・シート・セル)のデータを見て、どう判断して、どこのデータを探して とか計算したり、次の段階のデータに使うとか、抜き出して記録するとか作業内容を小分けに記述してみること。 めんどくさいが、読者にはあなたの考えていることは、質問文程度判らないのだから丁寧に 説明すること。 >Auto_Openが見つかったからといって、それを使うことが、適当かどうか、専門家に判断してもらったらどうか。そのためには、もう少しやりたいことを状況を含めて、説明しないとね。素人の思い付いた処理構成そのもののが見当はずれ(普通はそうしないだろう)の場合もこのコーナーでも目にする。 回答者は、あえて(質問者の思い付きに、異を唱えず)その路線で答えてやっているケースを見受けるが。親切なのか、将来の禍になるか。 なるべくデータは別ブックや別シートに分けない方がよい。まして処理プログラムはね。

akira0723
質問者

お礼

ありがとうございます。 仰る通りで、出直します。

  • hawa254
  • ベストアンサー率43% (259/589)
回答No.1
akira0723
質問者

お礼

ありがとうございます。 #2さんの言う通りもう一度考え直します。

akira0723
質問者

補足

早々のご回答ありがとうございます。 実は当方もここでAuto_Openを見つけて、やっとエクセル立ち上げ時にマクロが動くように出来た初心者です。 ここを見ても当方には、マクロの実行をファイル名で判定するような方法が分かりません。 また、質問後に、現在のファイルがxlsとxlsxなので、(当方には)無理な内容かもしれないことに気付きました。 とはいうものの、もし解決できる方法があればお願いしたいです。 対象ファイルが300-500程度あるので、出来るだけ簡便に何とかできれば非常に助かるのですが。

関連するQ&A