6.[PG2]Excelで、ファイル一覧作成し、ファイル名変更してみよう.part2

こちら第6回「プログラマー養成講座」のパート2になります!
目次はこちらからご参照下さい!

ひさき実践

先週はプログラムはほとんどネット上からコピペしただけだったのに、今回は難しいような・・・。

そうですね、前回から少しずつプログラミングの「仕組み」をなんとなく動かして触って実感してもらっていってる感じです。今回も前の2個は比較的すぐできると思いますよ。でも、ちょっとだけ自分で考える必要のあると思います。3個目は、やることがいろいろありますので、頑張って下さい。

師匠

まだ、仕様を確認してていいんですよね?

プログラムを書かないレベルであれば、インターネットで検索しててもいいですよ

師匠

とはいえ、確認も何も、手を動かさないと、ひさきからは質問もでないかも・・・。もうはじめちゃおうかと思います!

では、どうぞ。FileView.vbsからですねー。

師匠

とりあえず、「VBS ファイル一覧」で検索してみます。
・・・
このサイトのソースを実行してみますか

Option Explicit

Dim objFileSys
Dim objFolder
Dim objFile

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'c:\temp フォルダのオブジェクトを取得
Set objFolder = objFileSys.GetFolder("C:\temp")

'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
For Each objFile In objFolder.Files

  '取得したファイルのファイル名を表示
  WScript.Echo objFile.Name

Next

Set objFolder = Nothing
Set objFileSys = Nothing

むむ、駄目っぽいでした。

行:11
文字:1
エラー:パスが見つかりません。
コード:800A004C
ソース:Microsoft VBScript 実行時エラー

WEBから取得したプログラムを、ちゃんと理解せずに実行しちゃ駄目って前に言ったはずですが・・・。おそらく「C:\temp」がないから出力されているエラーですね。これはマイナス10点ですね。

あと、VBにも「コメントアウト」がありまして、Powershellはシャープ「#」でコメントアウトでしたが、VBのコメントアウトはシングルコーテーション「’」になります。慣れるまでは修正前の状態をなるべくコメントアウトして残してから、修正していきましょうか。

師匠

う、ちょっと師匠が怒ってる・・・!?

'Set objFolder = objFileSys.GetFolder("C:\temp")
Set objFolder = objFileSys.GetFolder("C:\work\VB")

これでOKかな。実行してみます!
・・・
これ、1ファイルずつメッセージが表示されちゃいますね。これは1画面で見れるようにするのはプログラムしないと駄目なのかな。他のサンプルプログラムを探してみます。

そうですね、他にサンプルプログラムを探しても良いですし、今のプログラムはシンプルで良い感じなので自分で修正しても良いと思います。

師匠

むむむ、サンプルプログラムは結構ありましたが、ほとんどメッセージボックスで1ファイルずつ表示するか、テキストファイルを作成して書き出すみたいなのしかないです・・・。

どうすればよいと思いますか?

師匠

うーん、テキストファイルに出力していって、全部テキストファイルに出した後に、テキストファイルを読み込んで表示するとかでしょうか?

なるほど、良い考えですね。的は射ています。つまり、どこかに情報を「保存」して貯めてから「出力」したいという考えですよね?

師匠

そうですね。自分が感覚で話しているので、なんとなくで話しましたけど、ちゃんと文字に変えて言われると確かに「情報の保存」「情報の出力」がしたいんですね。

はじめての変数

ほとんどのプログラムには「変数」と呼ばれる機能が存在します。パソコンのメモリ上に「変数」という一時領域を保存して、プログラムに利用します。ひさきさんのいうように「テキストファイルに入力して、まとめて出力」でも機能的には要件を満たして実装することは可能ですが、今回は「変数」にファイル名をどんどん入れていって、最後にメッセージボックスに出力することにしましょう。「変数」は基本機能で楽に使用できるんですよ。

師匠

数学の授業で出る「変数」とは違うんですか? Y=X+1とかのやつ

基本の考えは同じですね。計算処理をした答えを入れるのが数学の変数ですが、プログラムの変数は前もって準備した「変数=メモリ」に特定の処理をした値を入力したり出力したりするものです。
どのプログラム言語にもほぼ100%で「変数」の仕組みがあります。そのうちの9割くらいは「型」というものを設定する必要があります。「型」というのは「数値」「文字」「小数点」「YES/NO」とか、扱う値の種類を限定的にすることで「変数=メモリの確保/節約」を内部的にしたり、計算処理をする際に簡単に処理できたりします。ちなみにVBSには型が1つしかなく、VBAには複数の型があります。

師匠

VBSで変数を使うには
・宣言(必要ない場合もある)
・初期値設定(やったほうがいい)
・計算処理や利用。入力したり、出力したり。
・(必要であれば終了処理)
を実施します。
宣言や、初期設定はエラーにならないプログラム言語もありますが、極力やるようにしましょう。

では少しサンプルを書いてみますから、お待ちください。

師匠

わかりました!

'msgbox "VB"

'宣言
Dim strMsg

'初期値設定
strMsg = ""

'計算処理や利用1
strMsg = "この変数は文字列です"

'計算処理や利用2
strMsg = strMsg & vbLF & "2行目に追加したい"

'計算処理や利用3
msgbox strMsg

では、これをsample.vbsの中身に丸っと変えて保存し、実行してみてください。一見すると、「初期値設定」の意味がよくわからないとは思いますが、長ーいプログラムを書く時には、「初期値設定」と「リセット=もう一回、初期値セットする」はたびたび実施することになると思います。理解したら省略しても良いですが、練習では入れるようにしましょう。

師匠

いま、師匠が書いているときに検索しようと思ったんですけど、検索ワードを考えていたら書き終わっていたようで・・・。実行してみます!
(・・・)
ちゃんと動きました!

変数については、ひさきさんが言っていたように「値の保存」と「保存した値の出力」ができます。また「計算処理や利用2」に書いてあるみたいに書くと追加で書き込みができます。ここらへんは数学の変数とは違っちゃいますよね。「X=X+1」なんて計算は矛盾しちゃいますからね。

ちなみに、ひさきさんが引っ張ってきた例文の「Set ~~~」の行は「初期値設定」と考えて下さい。
その次にある「For Each ~~~~~ Next」は、ループ構文になります。それは「フォルダの中にあるファイルを1つずつ取って、終わるまでループする」という意味ですね。
では、続きをどうぞ進めちゃってください。

師匠

これが、余に言う「無限ループって怖くね?」のループだったのですか・・・。

Option Explicit

'宣言
Dim objFileSys
Dim objFolder
Dim objFile
Dim strMsg

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'c:\temp フォルダのオブジェクトを取得
'Set objFolder = objFileSys.GetFolder("C:\temp")
Set objFolder = objFileSys.GetFolder("C:\work\VB")

'初期値設定
strMsg = ""

'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
For Each objFile In objFolder.Files

  '取得したファイルのファイル名を表示
  'WScript.Echo objFile.Name
  strMsg = objFile.Name

Next

Set objFolder = Nothing
Set objFileSys = Nothing

こんな感じでしょうか。あれ、ダブルクリックしても何も起こらない・・・?なんでだろう?

惜しいですね。これは
・ファイル名を取得して、メッセージ表示

・変数にファイル名を入れる
に変更していることで、「メッセージを表示」する場所がなくなってしまって、ただ変数にファイル名を入れているだけですね。

師匠

あ、そうか。そこも1ファイルごとに実行されているのをとっちゃったのか。あれ、でも、どこに入れればいいんだろう・・・?

まだちょっと難しかったですかね。ループの後ろにいれるのが良いので「Next」の後ろに「変数をメッセージ表示する」のを1行追加すると良いと思います。

師匠

ありがとうございます、じゃぁこんな感じでしょうか!

Option Explicit

'宣言
Dim objFileSys
Dim objFolder
Dim objFile
Dim strMsg

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'c:\temp フォルダのオブジェクトを取得
'Set objFolder = objFileSys.GetFolder("C:\temp")
Set objFolder = objFileSys.GetFolder("C:\work\VB")

'初期値設定
strMsg = ""

'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
For Each objFile In objFolder.Files

  '取得したファイルのファイル名を表示
  'WScript.Echo objFile.Name
  strMsg = objFile.Name

Next

'変数をメッセージ表示
WScript.Echo strMsg 

Set objFolder = Nothing
Set objFileSys = Nothing

あれ、1ファイルしかでない。(・・・・)。
あ、ここかな。「計算処理や利用2」みたいにすればいいのかな。
できたかも!?

  '取得したファイルのファイル名を表示
  'WScript.Echo objFile.Name
  'strMsg =  objFile.Name
  strMsg =  strMsg & vbLF & objFile.Name

修正内容を見るに、ミスした箇所とその理由も把握していると思いますが、一応付け加えますと、変更前は
・変数strMsgにファイル名を常に上書きしている
から
・変数strMsgに前のデータを残して、改行+ファイル名を付け加える
に修正しています。良い感じですね!


師匠

できましたのですが、ちょ、ちょっと休憩させて頂いていいでしょうか。

そうですね。40分かかりましたので、休憩して今日は2個目まで出来たら終了でしょうかね(1コマ1~2時間目安でやってる)。3個目のお題は来週ですね。
特に11周で絶対に終わらせないといけない!というわけではないので、焦らないで行きましょう。むしろ、気になるところとか、ここもう少し解説欲しいとかあれば、ドンドン下さい。

師匠

ありがとうございます。
というわけで、へとへとになったのでpart3に続きます!


この記事が気に入ったらサポートをしてみませんか?