diary主にVBAネタを扱っているブログです。2017-01-31VBAから手軽にDOSコマンドやPowerShellを実行して結果を取得するモジュールを作成VBAシステムの運用をやっていると、VBAからDOSコマンドとかPowerShellを実行したくなるケースがある。WScript.ShellのExecメソッドなら標準出力が取得できるのだが、一瞬DOS窓が開いてしまうのがちょっと格好悪い。非表示でやりたいと思ったら、Runコマンドでコマンド結果をリダイレクトでファイルに書き込み、それを読み込むという面倒なことをしないといけない。いうことで、楽にそういうことができるようにモジュールで包んで抽象化した。普段なら作り方から説明するんだけれど、今回はコードが長いのでまず使う方のコードを紹介しよう。/allの結果を取得したいとする。Subパイプも、ばっちりOK。Subダブルクォーテーションのエスケープがちょっとめんどい。SubPowerShellコマンドはGetPSCommandResultと書く。Sub※ただしPowerShellの場合はコマンド全体をダブルクォートで囲ってInvoke-Expressionに渡しているので、指定するコマンド内にダブルクォートが使えない。代わりにシングルクォートを使う。その他、結果を1行ごとに分けて配列として返すメソッドとテキストストリームとして返すメソッドを用意している。FileSystemObjectとWScript.ShellはそれぞれSharedFSO、SharedWshShellというプロパティで外部公開しているので、以下のように変数も作らずにいきなり使用することができる。(AriawaseのIOモジュールからアイデアをいただきました。)ただし、以下を参照設定しておかないと入力候補は出ない。追記このモジュールからPowerShellコマンドを使う際に一つ問題が発覚。ひとつめのコマンドにパラメーターをつける場合、パラメーターごとシングルクォートで括る必要があるようだ。Sub詳細はこちらthom.hateblo.jp作り方まず、標準モジュールを作成し、モジュール名を「SystemAccessor」とする。次に以下のコードをコピーして貼り付けるだけ。Trueに書き換える。IfやForの終了構文を自動補完するマクロ※タイトルにつられた皆さん。プロシージャのオーバーロード機能(もどき)を自作する今回のネタは@mmYYmmddさんのつぶやきから生まれた。はてなブログPro弓道と英語が趣味のVBAプログラマーです。大阪でシステム運用の仕事をしています。このブログに掲載しているコードは利用規約の範囲で自由にお使いください。VBAの無料入門教材を配布していますので、VBAを初めてみたい方、ぜひお立ち寄りください。Amazonアソシエイト・プログラムの参加者です。はてなブログをはじめよう!t-homさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。