VBAでコマンドプロンプトを起動して
たくさんのファイルを操作出来るのかな?
VBAからpingコマンドの結果を取得して
資料に記載したいけど上手くいかないな…
コマンドプロンプトって名前は知ってるけど
よくわからない…なにができるの?
こんにちは!VBAを使った資料作りが好きで、毎日の定例作業時間2時間を1時間以下にしたこともある8年目文系プログラマの佐藤です。
みなさんはコマンドプロンプトを使ったことがありますか?
黒くて白い文字が表示されてるアレです。使ったことがなくても全然支障がないので、触れたこともないという方が多いのかもしれません。
コマンドプロンプトには便利なコマンドがたくさんあります。
例えば、コマンドを使うとこんなことができます。
- 大量のファイルの名前を一気に変える
- フォルダの.txtだけ全部消す
- ファイル名に「不要」とついているものを全部消す
- 外部プログラムを起動する(メモ帳・メールなど)
- ネットワークの状態を確認する…
この便利なコマンドをVBAから使ってみたい、結果をエクセルに表示してみたい…と思うけど思うようにいかない…というお悩み相談をよく受けます。
この記事では、そんな思いをお持ちの方に向けてVBAでコマンドプロンプトを起動し、コマンドを実行する方法を解説していきます。もちろん、コマンド実行の結果を取得する方法も紹介します。
コマンドプロンプトってなにもの?なんか怖いなという方にも、コマンドプロンプトの使い方や便利なコマンドを紹介していきます。今は全然どんなものなのか分からなくても、これから順番に解説していきますので、安心してくださいね。
VBAからコマンドプロンプトを操作する機会は多くないかもしれませんが、出来るようになれば開発の幅をさらに広げることができます。
さっそく、基本から一緒に学習していきましょう!
まずはコマンドプロンプトを知ろう
VBAでコマンドプロンプトを起動する前に、まずはコマンドプロンプトのことを学習していきましょう。コマンドプロンプトでは何ができるのでしょうか?次の項目から詳しく見ていきます。
コマンドを実行することで出来ること
皆さんはコマンドプロンプトを見たことがありますか?この画像がコマンドプロンプトの画面です。
なんだか、見た目は難しくてちょっと怖そうですよね。
起動しただけでは何も起こりませんので、皆さんもここで一回起動してみましょう。
直接起動する方法は2つあります。「ファイル名を指定して実行」で「cmd」と入力してOKを押すかwindowsシステムツールから「コマンドプロンプト」を選びます。
起動した画面で白いカーソルがちかちか光っていますか?
ここに、先ほどから何度も出てきている「コマンド」というものを打ち込んでいきます。
コマンドを打ち込み実行すると、それに対応した動きをコンピューターがしてくれるというわけです。
ではここに「dir」というコマンドを入力して動きを見てみましょう。
dirコマンドは、フォルダの内容・情報を書き出してくれるコマンドです。ではdirと入力してEnterを押します、すると…
ずらっとファイル名などが書き込まれました。
最後のほうに何個ファイルがあって、どれくらいの空きがあるか表示されていますよね。
こんな感じに短いコマンドを入力することで、普段では簡単に見ることが出来ない情報も簡単に見ることが出来ます。また、普段では簡単にできないような操作を一瞬ですることが可能です。
大量のファイル名の末尾に連番を付けたい時、コマンドプロンプトとVBAを使えば手作業でファイル名を変えなくて済みます。これってすごい時間の短縮になりますよね。
フォルダ内で特定のものだけを消すことも可能です。
エクセルに入力されたファイル名のファイルを、コマンドプロンプトとVBAを使って一気に削除…なんていうことも可能です。
ただし、コマンドプロンプトで削除を実行する時には注意が必要です。
コマンドプロンプトで削除をするとごみ箱に移動せず、すぐにパソコン上から消えてしまいます。取り返しのつかないことになってしまいますので、慎重に行いましょう。
コマンドプロンプトで削除を行う方法は次の記事で詳しく解説しています。
削除を行おうと考えている方は、こちらも合わせて確認してみてくださいね。
他にも、便利なコマンドはたくさんあります。
基礎的なコマンドについては、この記事で詳しく解説しています。
他にはどんなコマンドがあるのか気になった方は、こちらもぜひご覧ください。
このように、自分でコマンドを打って、いろいろな操作をしてもらえるのがコマンドプロンプトです。これをVBAで使えたら、いろいろなことが出来ちゃいそうですよね。
実は、VBAでコマンドプロンプトを起動する時の方法は2つあります。
次の項目で、その方法について詳しく解説していきます。
VBAで起動するには2つの方法がある
VBAでコマンドプロンプトを起動するには2つの方法があります。
1つは「exec」というメソッドを使う方法です。
もう一つは「run」メソッドを使う方法があります。
なんで二つ用意されているんだろう…と思いますよね。
実は、どちらもコマンドプロンプトでコマンドを実行するメソッドですが少し違う点があるんです。
「exec」を使ってVBAでコマンドを実行すると、コマンドプロンプトの画面が表示されます。ですが、コマンドプロンプトからの結果(標準出力)を取得することが可能です。
「run」を使う方法だと、コマンドプロンプトの画面は表示されませんが、結果を取得することが出来ません。
それぞれの実行で少しだけ動きが異なりますよね。表にまとめると次のとおりになります。
種類 | コマンドプロンプトの画面 | 結果 |
---|---|---|
exec | 画面が表示される | 結果(標準出力)を取得することが出来る |
run | 画面が表示されない | 結果(標準出力)を取得することが出来ない |
では、どちらを選んで実行するべきなのでしょうか?これはその時々の状況によります。
次の項目で、方法の選び方について確認しましょう。
execとrunどちらを選ぶべき?
さて、どちらの方法を選んでコマンドを実行するべきか迷うところですよね。
例えばコマンドを実行した結果をエクセルに書き出したい時はどうでしょうか?
この時は、コマンドプロンプトの画面が表示されてしまいますが「exec」を使いましょう。「run」を使ってしまうと、結果を取得することが出来ません。
結果は必要ないし、コマンドプロンプトの画面も表示させたくない!そんな時は「run」を選んで実行することをお勧めします。
このように、結果をVBA上やエクセルで使用したい場合は「exec」を、使わない場合は「run」を使ってコマンド実行をします。皆さんの状況によって使い分けてみてくださいね。
それでは、次の章からはVBAでの具体的な書き方について解説していきます。
まずは設定が必要なのでそちらから見ていきましょう。
VBAでコマンドプロンプトを起動する準備をしよう
VBAでコマンドプロンプトを使うときは、参照設定という特別な設定が必要です。
まずは一緒に設定から始めていきましょう。
まずはツールから「参照設定」を選びます。
次の画面で「Windows Script Host Object Model」を探して選択し、OKを押します。
これで準備は完了です!
次の章で紹介する方法で、さっそくコマンドプロンプトを起動してみましょう。
VBAでコマンドプロンプトを起動・コマンド実行しよう
この章では、VBAでコマンドプロンプトを起動・コマンド実行する具体的な方法を解説します。もちろん、先ほど紹介した二つの方法のどちらも解説していきます!まずはexecを使う方法からです。
execを使って実行、結果を取得しよう
execを使ってVBAからコマンド実行をしてみましょう。
その結果をセルに書き込むところまで解説していきます。
今回はdirコマンドを使って、このフォルダ内のファイル名をエクセルに書き込んでみます。
サンプルコードはこちらです。
Sub cmd_test() 'コマンドプロンプトを使うためのオブジェクト Dim wsh As New IWshRuntimeLibrary.WshShell ‘コマンド結果を格納する変数 Dim result As WshExec Dim cmd As String Dim filedata() As String Dim i As Integer '実行したいコマンド cmd = "dir c:vba /B" 'コマンドを実行 Set result = wsh.exec("%ComSpec% /c " & cmd) 'コマンドの実行が終わるまで待機 Do While result.Status = 0 DoEvents Loop '結果を改行区切りで配列へ格納 filedata = Split(result.StdOut.ReadAll, vbCrLf) 'A1から順番に結果を書き込む i = 1 For Each filenm In filedata Cells(i, 1).Value = filenm i = i + 1 Next Set result = Nothing Set wsh = Nothing End Sub
このコードを実行すると次のように書き込まれます。
ファイル名が書き込まれましたね。無事にコマンドが実行されました。
コードを詳しく見ていきましょう。
まずはコマンドプロンプトをVBAで使えるようにするためのオブジェクトと、結果を格納する変数を作ります。
Sub cmd_test() 'コマンドプロンプトを使うためのオブジェクト Dim wsh As New IWshRuntimeLibrary.WshShell ‘コマンド結果を格納する変数 Dim result As WshExec
これを作ることで、execメソッドを使えるようになります。
型が見慣れませんが「WshExec」と書き、コマンドの実行結果が格納出来るようにします。
次にコマンドを書いていきます。
'実行したいコマンド cmd = "dir c:vba /B"
今回はdirコマンドとそのオプションである「/B」を指定しました。/Bを付けると、結果がファイル名だけになります。
そして、いよいよ実行します。
ここでのポイントは、コマンドが終了するまで次の処理に移らず待機しておくというところです。
'コマンドを実行 Set result = wsh.exec("%ComSpec% /c " & cmd) 'コマンドの実行が終わるまで待機 Do While result.Status = 0 DoEvents Loop
先程作ったオブジェクトを使い「exec」メソッドを呼びます。この時、「”%ComSpec% /c ” 」の部分はお約束の言葉なのでいつもそのまま使いましょう。そのあとにさっき作ったコマンドをくっつけます。
そして、結果のステータスという数値が0では無くなるまでループして待機します。DoEventsは処理を中断することが出来る関数なので、これを使ってコマンドが終わったかどうか確かめ続けます。
後は結果を改行で区切って変数にいれます。結果は「result.StdOut.ReadAll」に入っていますよ。
それをSplitという関数を使い、区切っていきましょう。Splitは指定した区切り文字で区切って配列にしてくれるものです。
最後に、それをforeachでセルに書き込んで完成です。
execでコマンドプロンプトを起動・コマンドを実行する方法はこれで完了です。
コマンドプロンプトが表示されてしまうexecでしたが、ほんの一瞬でしたよね。コマンドの結果を使いたい場合はこの方法を使って実行してみましょう。
次は、コマンドの結果が必要ないときに使える「run」でコマンド実行する方法を解説していきます。
runを使って実行しよう
runで実行する方法も、execとさほど変わりありません。
それではさっそく実践してみましょう!
今回は、先程のサンプルファイル3つの名称を一気に変えてみましょう。
まずはこのように、エクセルでファイル名を決めます。元のファイル名も必要なので、残しておきましょう。
全然違う感じになりそうですね。サンプルコードはこちらです。
Sub cmd_test() 'コマンドプロンプトを使うための変数 Dim wsh As New IWshRuntimeLibrary.WshShell Dim result As WshExec Dim cmd As String Dim i As Integer '実行したいコマンド 'ren [パス]元のファイル名 変えるファイル名 cmd = "ren c:vba" 'コマンドを実行(三回) For i = 1 To 3 wsh.Run "%ComSpec% /c " & cmd & Cells(i, 1).Value & " " & Cells(i, 2).Value, 0, True Next Set result = Nothing Set wsh = Nothing End Sub
実行すると、一瞬でファイル名が変更されました。
ここでは、renというコマンドを使ってファイル名を変更しました。
renは「ren [パス]元のファイル名 変えるファイル名」と書きます。今回流れたコマンドを具体的に書くと、「ren c:vba1章_使い方.txt 1章_使い方について.txt」という感じです。
二つ目のファイル名にはパスを付けると動きませんので注意しましょう。
先程とはコマンド実行の部分が少し異なるので、詳しく見てみましょう
'コマンドを実行(三回) For i = 1 To 3 wsh.Run "%ComSpec% /c " & cmd & Cells(i, 1).Value & " " & Cells(i, 2).Value, 0, True Next
「”%ComSpec% /c ” 」は毎回書き込むコマンドなので変わらずここでも書きましょう。
あとはセルに入っているファイル名を記載していきますが、カンマの後に突然0という数字が出てきていますね。
ここは、コマンドプロンプトの画面を表示するかしないかを決められる部分になっています。0だと一切画面が表示されません、表示したくない場合は0を入れましょう。
次のカンマの後にはtrueの文字が入っています。
先ほど処理が終わるまでループして待機していましたが、runではここをtrueにするだけで終わるまで待機させることが出来ます。終わるまで待機しないで次の処理にいっちゃっていいや!というときにはfalseを指定しましょう。
以上で、runを使ってのコマンド実行は完了です。
手作業でのファイル名変更は大変ですが、この方法を使えば一瞬で終わってしまいます。使いこなせるようになれば、いろいろなことに応用できそうですよね。
execとrunを使い分けて、いろいろなコマンドを実行してみてください。
くれぐれも削除には気を付けて実行してくださいね。
最後に、コマンドをたくさん実行したいときはどうしたらいいのかを解説していきます。
複数のコマンドを実行したいときは
複数のコマンド実行したい場合、先ほどのサンプルのように複数回runすれば実行することができます。
ですが、一回で一気に実行したい時があるかもしれません。
そんな時は「&」でつなげると実行できるんです。
例えば次のような感じです。
ren c:vba1章_使い方.txt 1章_使い方について.txt&ren c:vba2章_トラブルシューティング.txt 2章_こんな時はどうする.txt
このようにすれば一気に実行することが可能です。1コマンドが長くなりすぎてしまう場合は、見づらくなってしまうことも多いので出来れば区切って実行するようにしましょう。
これで全ての解説は終了です。
コマンドはたくさんありますが、実行する方法は紹介したものを使えば問題ありません。この2つの方法を使って、いろいろなコマンドを実行してみましょう。
まとめ
VBAでコマンドプロンプトを使う方法について解説しました。
コマンドプロンプトはとても便利な反面、ちょっととっつきにくいですよね。
この記事が、皆さんのコマンドプロンプトに慣れ親しむきっかけになれば筆者も嬉しいです。
それでは、また次の解説で!