検索
連載

ファイル操作に役立つ5つ関数――Dir、FileLen、LoadPicture、Shell、CreateObjectの使い方VBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、ファイル/フォルダー名取得のDir、ファイルの長さを取得するFileLen、画像表示のLoadPicture、プログラム実行のShell、ActiveXオブジェクトへの参照を作成して返すCreateObjectなどの使い方について解説。

Share
Tweet
LINE
Hatena
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回から、関数の使い方を解説する。関数編の第1回目は、「Dir」「FileLen」「LoadPicture」「Shell」「CreateObject」という、ファイル操作に関する5つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。


ファイル/フォルダー名を取得するDir関数

 「Dir」関数は、ファイル/フォルダー、指定したパターンまたはファイル属性に一致するフォルダーの名前、またはドライブのボリュームラベルを表す文字列を返す関数だ。簡単にいうと、引数に指定したファイル名が存在するときは、そのファイル名を返し、存在しない場合は空を返す関数ということだ。

Dir関数の書式

Dir(pathname)


 「pathname」にはファイル名を指定する文字列を指定する。

 図1のように「C:\ExcelVBAData内のテキストファイルを取得」というボタンがあったとする。あらかじめ「C:\ExcelVBAData」というフォルダーを作成し、いくつかのテキストファイルを配置しておく。


図1 「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
リスト1  C:\ExcelVBAData内のテキストファイルを取得するコード

 まず、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だ。


図2 指定したフォルダー内のテキストファイルが表示された

ファイルの長さを取得するFileLen関数

 「FileLen」関数は、ファイルの長さをバイト単位で示す長整数型(Long)の値を返す関数だ。

FileLen関数の書式

FileLen (pathname)


 「pathname」は必須項目で、ファイル名を指定する文字列式だ。「pathname」にはディレクトリ名またはフォルダー名、およびドライブ名も含めて指定することができる。

 図2の画像に図3のように「ファイルの長さをバイト単位で取得」というボタンを配置しておく。


図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 アクティブセルのファイル名と一致するファイルの長さをバイト単位で返すコード

 2行目でLong型の変数「ファイルの長さ」を宣言する。3行目では、アクティブなセルにファイル名が記載されていないとエラーが発生するので、エラー処理を開始している。

 4行目では、変数「ファイルの長さ」に、「FileLen」関数を使ってフォルダー名とアクティブセルの「ファイル名」を連結して指定し、ファイルの長さを取得して、格納する。

 5行目の「Msgbox」関数でファイルの長さを、「Format」関数で、三桁区切りで表示する。その後処理を抜ける。ここで処理を抜けておかないと、MsgBoxでサイズが表示された後、「OK」ボタンをクリックすると「myError:」ラベルが実行されてしまうので、注意が必要だ。

 7行目の「myError:」ラベルはエラーが発生した際に表示される処理だ。警告メッセージを表示して処理を抜ける。Format関数については、またの機会に解説する。

 リスト2のマクロを「ファイルの長さをバイト単位で取得」ボタンに関連付け、実行すると図4のように、アクティブなセルのファイル名のファイルの長さがバイト単位で表示される。


図4 選択したファイル名のファイルの長さが、バイト単位で表示された

 ボタンをクリックする前には、必ず任意のテキストファイル名を選択する必要がある。

指定した画像を表示するLoadPicture関数

 「LoadPicture」関数は、指定した画像を読み込み、表示する関数だ。

LoadPicture関数の書式

LoadPicture(picturename)


 「picturename」には、読み込む画像ファイルを指定する。

 図5のように「画像イメージ」コントロールと「画像読み込み」「消去」ボタンを配置する。


図5 「イメージ」と「コマンドボタン」を2個配置した

ActiveXコントロールの活用

 ここで配置している「イメージ」はExcelメニューの[開発]→[挿入]と選択して「ActiveXコントロール」である「イメージコントロール」を配置している。[開発]タブの中にある「デザインモード」をクリックしてモードを「デザインモード」にして、左にある[挿入]アイコンの「▼」をクリックして表示される「ActiveXコントロール」から、「イメージ」コントロールを配置する(図6)。


図6 [開発]タブの「デザインモード」を「ON」にして、ActiveXコントロールからコントロールを選択する

 配置した「イメージ」を選択して、マウスの右クリックで表示される「プロパティ」から「オブジェクト名」に「画像イメージ」と指定する。「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 画像を読み込むコード

 リスト3は「画像読み込みボタン」がクリックされた時の処理だ。「画像イメージ」のPictureプロパティに、「LoadPicture」関数を使って画像を読み込んでいる。

 次に、「デザインモード」をクリックし「ON」にした状態で「消去」ボタンをダブルクリックすると、「消去」ボタンをクリックした際のコードが表示されるので、その中に画像を消去するコードを書く(リスト4)。

Private Sub 消去ボタン_Click()
  画像イメージ.Picture = LoadPicture("")
End Sub
リスト4 画像を消去するコード

 「LoadPicture」関数に何も指定しなければ、画像が消去される。

 「デザインモード」をもう一度クリックし「OFF」にして、「画像読み込み」ボタンをクリックすると図7のように画像が読み込まれる。


図7 「LoadPicture」関数で画像が読み込まれた

プログラムを非同期的に実行するShell関数

 「Shell」関数は、プログラムを非同期的に実行する関数だ。

Shell関数の書式

 Shell(pathname, windowstyle)


 「pathname」は必須項目で、実行するプログラムをパス付きで指定する。

「windowstyle」は省略可能で、実行するプログラムのウインドウの形式を指定する(表1参照)。

表1 windowstyleに指定する値
定数 説明
vbHide フォーカスを持ち、非表示になるウインドウ
vbNormalFocus フォーカスを持ち、元の大きさと位置で表示されるウインドウ
vbMinimizedFocus フォーカスを持ち、最小化表示されるウインドウ
vbMaximizedFocus フォーカスを持ち、最大化表示されるウインドウ
vbNormalNoFocus 最後のウインドウを閉じた時のサイズと位置に復元されるウインドウ。現在アクティブなウインドウはアクティブなまま
vbMinimizedNoFocus 最小化表示されるフォーカスを持たないウインドウ。現在アクティブなウインドウはアクティブのまま
参考「AppWinStyle 列挙型

 「Shell」という新しいシートを追加し、その中に図8のように、「メモ帳起動」というボタンを用意しておく。


図8 「メモ帳起動」ボタンを配置した

 「Shell」関数を用いて、「メモ帳」を起動するコードはリスト5になる。

Sub Shell関数の使い方()
  Shell "C:\Windows\Notepad.exe", vbNormalFocus
End Sub
リスト5 「メモ帳」を起動するコード

 「フォーカスを持ち、前回起動したサイズと位置に復元されるウインドウ」の「vbNormalFocus」を指定している(表1参照)

 リスト5のコードを「メモ帳起動」ボタンに関連付け、実行した結果が図9だ。


図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
リスト6 テキストファイルを読み込むコード

 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のように表示される。


図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.

ページトップに戻る