VBScriptを使って写真ファイルの名前を整える

powered by hm solution

お問い合わせ:0120-290-727
受付時間:10:00~18:00(土日祝は除く)

お問い合わせ

VBScriptを使って写真ファイルの名前を整える

写真を整理していると、いつの間にか見るのに夢中になって
なかなか片付かない!!

ファイル名を変換するプログラムを作ってみる

前回から引き続き「VBScript」を使った実践編です。

年末年始は写真を撮る機会も多いですよね。
問題は、よく手元を見てみると今まで撮った写真が整理もされずに・・・。

カメラの規格でファイル名から何の写真かもわからない。
1つ1つ名前をつけるのは大変です。

そこで、一括でファイル名を変換してくれるプログラムを作ってみたいと思います。
こんなことが出来ます。
20131226_02
50ファイルぐらいなら1秒もかからず処理してくれますし、応用すれば写真ファイル以外にも利用出来ますよ。

とりあえずやりたいことをまとめる

どうやって機能を決めるかというと、まずは困っていることや希望を箇条書きにします。

  • カメラの規格でファイル名が、「IMG001」や「DSC001」になっていて、なんの写真かわからない。
  • 写真以外の文章ファイルなどは、そのままにしたい。
  • ファイルの数が多い

これを解決できるものが欲しい機能に該当しますから、それっぽく表現してみます。

  1. 指定したフォルダのファイルは全部処理してほしい。
  2. ファイルの作成日をファイル名+通し番号にする。
  3. 対象となるファイルの種類を指定できる。

こんな感じでしょうか。

テキストエディタを起動して、さっそく作る

1行目はかならずこの呪文でしたね。

Option Explicit
VBScriptはWindowsに致命傷を与えることも出来てしまうので、ソースのダウンロードは見送りました。
代わりに全文の画像をペタリと。

色とか、下線とかつけて分かりやすくなっていますので参考にしてください。
処理の内容もコメントで記載してあります。

  • 下線のある箇所:変数名。お好きな名前に変更していただけます。
  • 背景が灰色の箇所:内容を分かりやすくするためのコメントです。
  • 青字の箇所:関数や定数です。変更するとエラーになります。

20131226_03

変数の宣言

変数にしたい名前の前に「Dim」をつけるだけです。
変数名は出来る限り内容の想像がつくものにした方が後で改修するときに便利です。

Dim strTargetFileType	'対象の拡張子を指定
Dim strTargetFolder	'処理対象のフォルダを指定
Dim lonPrcCounter		'処理ファイル数格納用
個人的な命名規則
VBScriptでは型の指定は必要ないのですが、VBAなどでは型の指定が必要です。
その際に何の型を指定したのか、わかりやすいように私は変数名に型が分かる名前を付けています。
strがつくと文字型[String]
lonがつくと長整数型[Long]
といった感じです。

値の代入

「=」で代入します。
文字を代入する場合は必ず「”」で括ってください。

strTargetFileType = ".png"
lonPrcCounter = 0

条件分岐してみる
条件に合う場合は、この処理をするといったように、条件にあうかどうか判定が出来る機能が用意されています。

If 条件 Then
条件に合う場合の処理
Else
条件に合わない場合の処理
End If

ここでは処理するファイルがあったかどうかで、出すメッセージを変更するように指定しました。

If lonPrcCounter = 1 Then
	MsgBox "処理するファイルはありませんでした。"
Else
	MsgBox "作業が完了しました。"
End If

FileSystemObject が便利

フォルダやファイルの操作には「FileSystemObject」が便利です。
オブジェクトは宣言した後に、Setする必要があります。
長い説明になるので、そういうルールだと今は覚えておいてもらえればいいと思います。
詳しくしりたいかたはこちら

	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

比較する場合の演算子

もしAとBが同じならを表す場合、「A=B」と表現するのは感覚的にわかりやすいと思います。
ではAとBが同じでないならを表す場合は?

「<>」を使用してください。
ノットイコールではないので注意です。

If strCheckDate <> myStrDateFormat(objFile.DateCreated) Then

繰り返し(ループ)の処理をする

繰り返しの処理には大きく2つあります。

  • Do…Loop
  • For…Next

回数が決まっている場合は「For…Next」の方が分かりやすいですが、今回は決まっていないので「Do…Loop」を使用しました。
「Do」の後に条件を記述すると、「その条件に合っている場合は処理を繰り返す」という意味になります。

今回の例では、新しく付けようと思っている名前のファイルが既に存在するかどうかをチェックしています。
もし、同じ名前のファイルがあったら上書きになってしまうので、マズイですね。

新しいファイル名を付け直して、同じ名前のものがなくなるまで繰り返します。
ただし永遠にループされても怖いので、保険のために1000回超えたら処理を中断するようにしました。

do while objFso.FileExists(strNewFilePath) = true
	lonCounter = lonCounter + 1
	strNewFilePath = strTargetFolder & strCheckDate & "_" & myLonFormat(lonCounter,3) & strTargetFileType
	If lonCounter > 1000 Then
		MsgBox "エラーが発生したので、処理を中断します。"
		Wscript.Quit
	End If
Loop

ファイル名を書き換える

ファイル名を変更するのも、代入で出来てしまいます。
不思議なのは比較する場合に使った「=」で出来てしまうんです。
これはそういうルールだと覚えてもらった方が早いです。

objFile.Name = strCheckDate & "_" & myLonFormat(lonCounter,3) & strTargetFileType

オブジェクトは必ず破棄する

VBScriptはプログラム終了時に自動的に解放されますが、無駄がないので必要がなくなった時点で破棄する習慣をつけておくことをおすすめします。

	Set objFile = Nothing
	Set objFolder = Nothing
	Set objFSO = Nothing

ユーザー関数を作る

同じような処理が繰り返し行われる場合は、関数を作ってしまった方が楽です。
下記では「myLongFormat」という、指定した桁数になるように調整してくれる関数を作っています。

例えば、
1を001にしたい場合は、myLonFormat(1,3)
1を00001にしたい場合は、myLonFormat(1,5)
Function myLonFormat(lonInteger,intDigit)
	myLonFormat = Cstr(right(string(intDigit,chr(48)) & lonInteger,intDigit))	
End Function
私は、もともとある組み込み関数と区別しやすいように、関数名に「my」をつけています。
同じような名前が付けられるので、どんな処理をしているか分かりやすくなります。

プログラムの起動方法

出来上がったファイルを保存したら、ダブルクリックするだけです。
それだけでプログラムが実行されます。

強制終了させたい時は
繰り返しの処理に失敗してプログラムが終了しない!なんてことになった場合は、タスクマネージャーを起動してください。
[プロセス]タブにイメージ名が「wscript」ではじまるものがあるので、これを選択して[プロセスの終了]ボタンを押せば止まります。
が、間違ってほかのプロセスを終了させないように注意してください。

自分で作る理由

欲しいと思った機能が全部搭載できるからです。

パワーポイントで100枚の写真を同じ位置で大きさを揃えて貼り付ける。

なんて作業も一瞬で実現してくれます。
慣れないうちはプログラム作る時間の方がかかる場合もありますが。

2013年もあと少し

毎回長い内容にお付き合いくださり、ありがとうございます。

みなさんはどんな1年をお過ごしになられましたか?
2013年が良い年だったと言えるように、最後まで気を抜かずにお過ごしください。

Spero che l’Anno Nuovo ti porti tanta gioia e tanta felicità!

powered by hm solution
お問い合わせ
お問い合わせ
gmt
© hm solution, Ltd.