ファイル操作に役立つ5つ関数――Dir、FileLen、LoadPicture、Shell、CreateObjectの使い方:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、ファイル/フォルダー名取得のDir、ファイルの長さを取得するFileLen、画像表示のLoadPicture、プログラム実行のShell、ActiveXオブジェクトへの参照を作成して返すCreateObjectなどの使い方について解説。
今回から、関数の使い方を解説する。関数編の第1回目は、「Dir」「FileLen」「LoadPicture」「Shell」「CreateObject」という、ファイル操作に関する5つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。
- ファイル/フォルダー名を取得するDir
- ファイルの長さを取得するFileLen
- 指定した画像を表示するLoadPicture
- プログラムを非同期的に実行するShell
- ActiveXオブジェクトへの参照を作成して返すCreateObject
ファイル/フォルダー名を取得するDir関数
「Dir」関数は、ファイル/フォルダー、指定したパターンまたはファイル属性に一致するフォルダーの名前、またはドライブのボリュームラベルを表す文字列を返す関数だ。簡単にいうと、引数に指定したファイル名が存在するときは、そのファイル名を返し、存在しない場合は空を返す関数ということだ。
Dir関数の書式
Dir(pathname)
「pathname」にはファイル名を指定する文字列を指定する。
図1のように「C:\ExcelVBAData内のテキストファイルを取得」というボタンがあったとする。あらかじめ「C:\ExcelVBAData」というフォルダーを作成し、いくつかのテキストファイルを配置しておく。
「C:\ExcelVBAData内のテキストファイルを取得」するコード例はリスト1になる。VBE(Visual Basic Editor)を起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト1のコードを記述する。
Option Explicit Sub Dir関数の使い方() Dim ファイル名 As String Dim i As Integer i = 5 ファイル名 = Dir("C:\ExcelVBAData\*.txt") Do While ファイル名 <> "" Cells(i, 2) = ファイル名 ファイル名 = Dir() i = i + 1 Loop End Sub
まず、3行目で文字列型の変数「ファイル名」を宣言し、4行目でInteger型の変数「i」を宣言する。
5行目で「i」を5で初期化しておく。この「5」は、テキストファイルを表示させる最初の「行番号」に当たる。
6行目では、変数「ファイル名」に「Dir」関数を使って、「C:\ExcelVBAData」フォルダーにある全てのテキストファイルを指定する。なお指定には、アスタリスク(*)が使用できる。
7〜11行目では、変数「ファイル名」が空ではない間、繰り返し処理を行う。「i行目」の「2列目」の「B列」に変数「ファイル名」の値を表示する(8行目)。変数「i」を1ずつ増加させているので、各行にテキストファイル名が表示される(10行目)。
このリスト1のマクロを「C:\ExcelVBAData内のテキストファイルを取得」ボタンに関連付け実行した結果が図2だ。
ファイルの長さを取得するFileLen関数
「FileLen」関数は、ファイルの長さをバイト単位で示す長整数型(Long)の値を返す関数だ。
FileLen関数の書式
FileLen (pathname)
「pathname」は必須項目で、ファイル名を指定する文字列式だ。「pathname」にはディレクトリ名またはフォルダー名、およびドライブ名も含めて指定することができる。
図2の画像に図3のように「ファイルの長さをバイト単位で取得」というボタンを配置しておく。
「アクティブセル」のファイル名と一致するファイルの長さをバイト単位で返すコードはリスト2になる。「アクティブセル」とは、図3で「ファイルの長さをバイト単位で取得」ボタンをクリックする前に、選択されたセル」を指す。ここでは「B列」に表示されたテキストファイル名が入力されたセルを選択しておく。
Sub FileLen関数の使い方() Dim ファイルの長さ As Long On Error GoTo myError ファイルの長さ= FileLen("C:\ExcelVBAData\" & ActiveCell.Value) MsgBox ActiveCell.Value & "のファイルの長さは" & Format(ファイルの長さ, "#,###") & "バイトあります。" Exit Sub myError: MsgBox "ファイル名の表示されているセルが選択されていません。" Exit Sub End Sub
2行目でLong型の変数「ファイルの長さ」を宣言する。3行目では、アクティブなセルにファイル名が記載されていないとエラーが発生するので、エラー処理を開始している。
4行目では、変数「ファイルの長さ」に、「FileLen」関数を使ってフォルダー名とアクティブセルの「ファイル名」を連結して指定し、ファイルの長さを取得して、格納する。
5行目の「Msgbox」関数でファイルの長さを、「Format」関数で、三桁区切りで表示する。その後処理を抜ける。ここで処理を抜けておかないと、MsgBoxでサイズが表示された後、「OK」ボタンをクリックすると「myError:」ラベルが実行されてしまうので、注意が必要だ。
7行目の「myError:」ラベルはエラーが発生した際に表示される処理だ。警告メッセージを表示して処理を抜ける。Format関数については、またの機会に解説する。
リスト2のマクロを「ファイルの長さをバイト単位で取得」ボタンに関連付け、実行すると図4のように、アクティブなセルのファイル名のファイルの長さがバイト単位で表示される。
ボタンをクリックする前には、必ず任意のテキストファイル名を選択する必要がある。
指定した画像を表示するLoadPicture関数
「LoadPicture」関数は、指定した画像を読み込み、表示する関数だ。
LoadPicture関数の書式
LoadPicture(picturename)
「picturename」には、読み込む画像ファイルを指定する。
図5のように「画像イメージ」コントロールと「画像読み込み」「消去」ボタンを配置する。
ActiveXコントロールの活用
ここで配置している「イメージ」はExcelメニューの[開発]→[挿入]と選択して「ActiveXコントロール」である「イメージコントロール」を配置している。[開発]タブの中にある「デザインモード」をクリックしてモードを「デザインモード」にして、左にある[挿入]アイコンの「▼」をクリックして表示される「ActiveXコントロール」から、「イメージ」コントロールを配置する(図6)。
配置した「イメージ」を選択して、マウスの右クリックで表示される「プロパティ」から「オブジェクト名」に「画像イメージ」と指定する。「Width」に「640」、「Height」に「480」と指定する。
また「画像読み込み」ボタンは、同じく「ActiveXコントロール」から「コマンドボタン」を配置している。
「コマンドボタン」を選択して、「デザインモード」にして、マウスの右クリックで表示されるメニューから「プロパティ」を選択し、「オブジェクト名」に「画像読み込みボタン」と指定し、「Caption」プロパティに「画像読み込み」と指定している。また同じように「コマンドボタン」を配置し、プロパティから「オブジェクト名」に「消去ボタン」、「Caption」に「消去」と指定している。
コードを指定して実行
次に、「デザインモード」をクリックし「ON」にした状態で、「画像読み込みボタン」をダブルクリックする。すると、VBEが起動してプロジェクトの「Sheet1(Sheet1)」の中に「画像読み込みボタン」をクリックした際のコードが表示されるので、その中にリスト3の画像を読み込むコードを書く。
このTipsを実行するには、事前に「C:\ExcelVBAImage」というフォルダーを作成して、画像を配置しておく必要がある。このフォルダーが存在しない場合はエラーになるので注意してほしい。また読み込む画像名を変更する場合はリスト3の画像名を変更すればよい。
Option Explicit Private Sub 画像読み込みボタン_Click() 画像イメージ.Picture = LoadPicture("C:\ExcelVBAImage\光.jpg") End Sub
リスト3は「画像読み込みボタン」がクリックされた時の処理だ。「画像イメージ」のPictureプロパティに、「LoadPicture」関数を使って画像を読み込んでいる。
次に、「デザインモード」をクリックし「ON」にした状態で「消去」ボタンをダブルクリックすると、「消去」ボタンをクリックした際のコードが表示されるので、その中に画像を消去するコードを書く(リスト4)。
Private Sub 消去ボタン_Click() 画像イメージ.Picture = LoadPicture("") End Sub
「LoadPicture」関数に何も指定しなければ、画像が消去される。
「デザインモード」をもう一度クリックし「OFF」にして、「画像読み込み」ボタンをクリックすると図7のように画像が読み込まれる。
プログラムを非同期的に実行するShell関数
「Shell」関数は、プログラムを非同期的に実行する関数だ。
Shell関数の書式
Shell(pathname, windowstyle)
「pathname」は必須項目で、実行するプログラムをパス付きで指定する。
「windowstyle」は省略可能で、実行するプログラムのウインドウの形式を指定する(表1参照)。
定数 | 説明 |
---|---|
vbHide | フォーカスを持ち、非表示になるウインドウ |
vbNormalFocus | フォーカスを持ち、元の大きさと位置で表示されるウインドウ |
vbMinimizedFocus | フォーカスを持ち、最小化表示されるウインドウ |
vbMaximizedFocus | フォーカスを持ち、最大化表示されるウインドウ |
vbNormalNoFocus | 最後のウインドウを閉じた時のサイズと位置に復元されるウインドウ。現在アクティブなウインドウはアクティブなまま |
vbMinimizedNoFocus | 最小化表示されるフォーカスを持たないウインドウ。現在アクティブなウインドウはアクティブのまま |
参考「AppWinStyle 列挙型」 |
「Shell」という新しいシートを追加し、その中に図8のように、「メモ帳起動」というボタンを用意しておく。
「Shell」関数を用いて、「メモ帳」を起動するコードはリスト5になる。
Sub Shell関数の使い方() Shell "C:\Windows\Notepad.exe", vbNormalFocus End Sub
「フォーカスを持ち、前回起動したサイズと位置に復元されるウインドウ」の「vbNormalFocus」を指定している(表1参照)
リスト5のコードを「メモ帳起動」ボタンに関連付け、実行した結果が図9だ。
ActiveXオブジェクトへの参照を作成して返すCreateObject関数
「CreateObject」関数は、ActiveXオブジェクトへの参照を作成して返す関数だ。
CreateObject関数の書式
CreateObject(クラス名)
クラス名には、作成するオブジェクトのクラス名を指定する。今回は、「FileSystemObject」を使ってテキストファイルの読み込みを行うため、「クラス名」には「Scripting.FileSystemObject」を使用する。他にAccessの場合は、「Access.Application」、Excelの場合は「Excel.Application」、Wordの場合は「Word.Application」を指定する。
今回の場合、「C:\ExcelVBAData」というフォルダーを作成しておき、その中に「人間失格.txt」というテキストファイルを配置している。このテキストファイルはUnicode形式で保存している。
この「人間失格.txt」を読み込み、「C1」のセルに表示するコードはリスト6だ。「C1」セルにはExcelのメニューから「書式」をあらかじめ設定している。
Sub CreateObject関数の使い方() Dim fso As Object Dim result As String Set fso = CreateObject("Scripting.FileSystemObject") Set fso = fso.OpenTextFile("C:\ExcelVBAData\人間失格.txt", 1, , -1) result = fso.ReadAll fso.Close Range("C1").Value = result End Sub
2行目でObject型の変数「fso」を、3行目で文字列型の変数「result」を宣言する。
4行目で「CreateObject」関数で「FileSystemObject」を作成する。必ず「Scripting.FileSystemObject」と指定し、変数「fso」に代入しておく。
OpenTextFileメソッド
5行目のOpenTextFileメソッドでは「C:\ExcelVBAData\人間失格.txt」を「読み込み専用」、「Unicode」形式で読み込んでいる。
OpenTextFileの書式は下記の通りだ。
FileSystemObject.OpenTextFile(FileName,IOMode,Create,Format)
「FileName」にはパス付ファイルの所在を指定する。
「IOMode」には「読み込み専用(1)」「新規書き込み専用(2)」「追加書き込み専用(8)」の値を指定する。今回は「読みこみ専用」の「1」を指定している。
「Create」にはファイルが存在しない場合に「新しいファイルを作成するかどうか」の値を「True」または「False」で指定する。既定値は「False」で、「新しいファイルを作成しない」となっている。今回は何も指定していないので、「False」となる。
「Format」には「システムデフォルト(-2)」「Unicode(-1)」「ASCII(0)」のいずれかの値を指定する。ここでは、「Unicode」を示す値の「-1」を指定して、テキストファイルを開いている。
ReadAll/Closeメソッド
6行目の「ReadAll」メソッドで開いたテキストファイルを最後まで読み込み、変数「result」に格納する。7行目の「Close」メソッドで「FileSystmeObject」を閉じる。この閉じる処理はテキストファイルの操作において重要なので、忘れないでほしい。
実行結果
8行目でExcelのセル「C1」にテキストファイルの内容を表示する(※セル「C1」にはExcelメニューから「書式」をあらかじめ設定している)。
VBEメニューの[実行]→[Sub/ユーザーフォームの実行]と選択して実行すると図10のように表示される。
次回は、文字列操作の関数について
今回は「Dir」「FileLen」「LoadPicture」「Shell」「CreateObject」の5つの関数についての使い方を解説した。
「LoadPicture」関数は読んで字のごとく、画像を読み込む関数だ。今回はActiveXコントロールの「イメージ」に表示しているが、もちろんユーザーフォームの「イメージ」にも表示は可能だ。読者の皆さんに試していただきたい。
「Shell」関数は、他のプログラムを起動できるので、作業をする画面にボタンを配置しておいて、必要なときに「メモ帳を起動させてメモを取る」といった作業に使えるのではないだろうか。
次回は、文字列操作の関数について解説する予定だ。お楽しみに。
著者紹介
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- スクショをExcelに張り付けるのに役立つ4つのテクニック
システム開発におけるソフトウェアテスト(結合テスト〜システムテスト)において重要視されるエビデンス(作業記録)。前後編の2回にわたって、エビデンスとしてスクリーンショットをキャプチャし、テスト仕様書や納品書に張り付けていく作業を自動化するためのVBA/マクロのテクニックを紹介する。後編は、画像ファイルをシートに張り付け、Excel 2013のメニューからスクショを直に張り付け、画像を縮小し、指定した時間にマクロを実行する方法を解説。 - [Esc]キーによるExcel VBAの実行中断を防止する
ExcelではVBA(Visual Basic for Applications)によってさまざまな処理を自動的に実行できる。しかし、VBAの実行中にユーザーが[Esc]キーあるいは[Ctrl]+[Break]キーを押すと、自動処理が止まってしまう。止めたくない場合は、Application.EnableCancelKeyプロパティの設定を変更する。 - Windows TIPSディレクトリ > プラットフォーム別 > Office > Excel