目標
前回の記事で扱ったプログラムの中身を理解できる。
VBScriptプログラム(再掲載)
VBScriptプログラム
ファイル名:「NewFile.vbs」
Option Explicit
Dim objFSO, FileTitle
Set objFSO = CreateObject( "Scripting.FileSystemObject" )
'-------- 日付を取得--------
FileTitle = Date
FileTitle = mid(FileTitle,1,4) & mid(FileTitle,6,2)
'------- 原本から新規のファイルを作成 --------
If (objFSO.FileExists("..\WORKSPACE\" & FileTitle & ".xlsm") = False) Then
objFSO.CopyFile ".\sample.xlsm" , "..\WORKSPACE\" & FileTitle & ".xlsm"
End If
Set objFSO = Nothing
VBScriptプログラムの内容
Option Explicitとは
Option Explicit はVBAと同じく変数の宣言を強制させるプログラムです。これがあると、プログラム中に宣言していない変数の利用を禁止することが出来ます。バグの発生を減らすために必要な宣言です。基本的に記述必須です。
Dim 変数名
Dimステートメントも使い方はVBAとほぼ同じです。「Dim+変数名」として利用します。但し、VBScriptは動的型付けとして変数を扱うのでVBAのよう「As String」などはつけません。
VBScriptの場合
Dim Something
VBAの場合
Dim Something As String
Set objFSO = CreateObject( “Scripting.FileSystemObject” )
Set objFOS = オブジェクト
VBAと意味は変わりません。オブジェクトを代入する場合はSetステートメントを利用します。変数をDimで宣言してSetで代入すとという二段階の手順が必要です。
CreateObject(“引数”)
引数にセットしたオブジェクトの使用可能オブジェクトを作成します
Scripting.FileSystemObject
引数の「Scripting.FileSystemObject」はCOMオブジェクトのひとつでファイルシステムオブジェクトです。COMオブジェクトは多機能なプログラムのセットです。今回はその中でファイルの作成や削除などを行うことのできるファイルシステムオブジェクトを利用します。このオブジェクトをCreateObject(“引数”)で複製して利用します。
FileTitle = Date
Dateは関数です。
Date関数は現在の日時を「yyyy/mm/dd」の形式で値を返します。
ここでは、変数FileTitleに日時を代入しています。
FileTitle = mid(FileTitle,1,4) & mid(FileTitle,6,2)
midは関数です。
mid関数は「指定文字列」の「X番目」から「Y文字」を取り出します。
使用方法はmid(「指定文字列」もしくは「変数」,「X番目」,「Y文字」)です。
mid(FileTitle,1,4):はFileTitleに入った2022/11/12の1文字目から4つという意味で「2022」を取得します。
mid(FileTitle,6,2):はFileTitleに入った2022/11/12の6文字目から2つという意味で「11」を取得します。
※関数の1文字目は小文字でも大文字「Mid((FileTitle,1,4)」でも構いません。
If (objFSO.FileExists(“..\WORKSPACE\” & FileTitle & “.xlsm”) = False) Then
IfステートメントはVBAと基本的に変わりません。但し、条件部分の記述については「()丸カッコ」が必要になります。
Ifステートメント
VBScriptの場合
If (条件) Then
処理
End if
VBAの場合
If 条件 Then
処理
End if
objFSO.FileExists(“ファイル名”)
FileExists()メソッドは引数で指定したファイル名が存在しているかを確認するメソッドです。
FileExists()メソッドはファイルシステムオブジェクトが持っている機能のひとつです。実は複製したobjFSOの中にはファイルシステムオブジェクトで準備された機能もごっそりと複製され(取り込まれ)てきます。FileExists()メソッドもその中のひとつとなります。
ここではFileExistsメッソドをIfステートメントの条件で利用して、該当ファイルが存在していない時だけ新規ファイルの作成をするようにしています。そうしないと不用意に新規ファイルの生成が行われてしまうことになります。
仮に「202302.xlsm」を月の初めに生成して、2月の間そのファイルを利用して作業したとします。そうすると当然ですが「202302.xlsm」には沢山のデータの入力をしてきたことになります。ここで11月中にもう一度このVBScriptが動くと、「202302.xlsm」のファイルが新しく生成されることになります。VBScriptを利用したファイルの複製では「202302.xlsm」のファイルが新規で作成されると、これまでの「202302.xlsm」が上書きされてしまいます。つまり作業中のファイルがまっさらなファイルに置き換えられてしまうことになります。
なのでまず、ファイルが存在していないかをチェックして「なければ作成」「あれば何もしない」と制御構文を利用して分岐処理をおこなっています。
“..\WORKSPACE\” & FileTitle & “.xlsm”
引数部分ではファイルへのパスを記述します。パスとはファルダ階層を含めたファイルまでの通り道のことになります。下にエクスプローラーのキャプチャにある赤枠部分がパスということになります。
この「C:\Users\appsg\Desktop\WORKSPACE」の意味はCドライブの中にある「Users」フォルダの中の「appsg」フォルダの中の「Desktop」フォルダの中の「WORKSPACE」フォルダとなります。
パスの表現方法は2種類
「絶対パス」と「相対パス」
絶対パス…上の画面キャプチャのように最上位からの全ての通り道を記述する方法を「絶対パス」といいます。
相対パス…アクティブなフォルダ(またはファイルが存在いているフォルダ)から指定する通り道を「相対パス」といいます。今回のプログラムの引数には相対パスを利用しています。
相対パスでは「.\」と「..\」の記述がよく出てきます。それぞれ以下の意味となります。
- 「.\」:同じフォルダ内という表現
- 「..\」:ひとつ上のフォルダという表現
..\はひとつうえのフォルダに戻るという意味なので、「”..\WORKSPACE\” & FileTitle & “.xlsm”」はNewFile.vbsの位置からひとつ上のフォルダに戻って、そこから「WORKSPACE」フォルダへ入った、「FileTitle & “.xlsm”」のファイルという意味になります。
objFSO.CopyFile “.\sample.xlsm” , “..\WORKSPACE\” & FileTitle & “.xlsm”
CopyFile()メソッドは1つ目の引数で指定したファイルを2つ目で指定した位置(ファルダ階層+ファイル名)にコピーするメソッドです。
objFSO.CopyFile “元のファイル” , “コピー先ファイル”
objFSO.CopyFile “.\sample.xlsm” , “..\WORKSPACE\” & FileTitle & “.xlsm”
今回はNewFile.vbsと同じフォルダにある「”.\sample.xlsm”」を「 “..\WORKSPACE\” & FileTitle & “.xlsm”」へ複製するという意味になります。
End If
Ifステートメントの終わりにつけます。
「Set オブジェクト = Nothing」
「Set オブジェクト = Nothing」でオブジェクトを格納したメモリを開放します。これはオブジェクトが利用しているメモリ領域について空にする作業です。
プログラムの稼働を終えた後は、ExcelObjのようなオブジェクトはパソコン上で使用されることはない(邪魔になる)のでメモリを開放します。
今回は以上となります。
VBAのユーザーフォームの記事へはこちらのボタンをご利用ください。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。