Excel VBAの「Loc 関数」について解説します。
Loc 関数とは
Excel VBA の Loc 関数は、開いているファイルのポインタ「現在の読み取り位置または書き込み位置」を示す Long を返します。
ファイル操作を行う際に現在のファイルポインタの位置を確認する必要がある場合に使う関数です。ファイルのアクセスモードに応じた現在の位置を示す値を返すことから、ファイル操作の進行状況を確認したり、特定の位置からデータを読み取るなどの際に利用されます。
Loc 関数の構文や引数の設定と実際の使い方について具体的に解説していきたいと思います。
Loc 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
Loc(filenumber)
引数
引数 | 説明 |
---|---|
filenumber | 【必須】対象ファイルのファイル番号を指定します |
※ Open ステートメントでファイルを開いた際に割り当てられた番号です。
戻り値
戻り値 | 説明 |
---|---|
位置を示す値 (Long) | 対象ファイルの、現在のポインタを示す値を返します (ポインタ=読み取り位置または書き込み位置) |
※ ファイルを開いたモードにより下表のとおり返り値に違いがあります。
ファイルモードによる戻り値の違い
ファイルモード | 戻り値 |
---|---|
ランダムアクセス (Random) | 最後に読み取りまたは書き込みを行ったレコードの番号 |
シーケンシャル入力 (Input) | ファイル内の現在のバイト位置を128で割った値 |
バイナリ (Binary) | 最後に読み取りまたは書き込みを行ったバイト位置 |
※ シーケンシャル入力モードの戻り値は、小数点以下を切り上げた整数値で返されます。これは、128バイトまでは「1」が返るということですので、位置情報として使用することはできません。
解説(使用例)
Loc 関数の基本的な使い方について、サンプルを使って解説します。
Loc 関数サンプル
Loc 関数を使用してファイル内の現在位置を取得する例です。
バイナリモードで開いたファイルを読み込む例
Loc 関数を使用して、バイナリモードで開いたファイルから1文字づつ読み込む例です。
'■Loc関数サンプル1(ファイル内の現在位置を取得する例)
Sub Loc_BinarySample01()
Dim fileNum As Integer
Dim curLoc As Long
Dim str As String
' ファイルをバイナリモードで開く
fileNum = FreeFile ' 空きファイル番号取得
Open "c:\VBA_Sample\test.txt" For Binary As #fileNum
' ファイルの終端までループ
Do While curLoc < LOF(fileNum)
str = str & Input(1, #fileNum) ' 1文字ずつ読み込む
curLoc = Loc(fileNum) ' 現在位置を取得
Debug.Print str; " Loc値:"; curLoc ' イミディエイトに表示
Loop
' ファイルを閉じる
Close #fileNum
End Sub
このコードは、ファイル内のデータを1文字ずつ読み取りながら、現在の位置をイミディエイトウィンドウに表示します。
・8行目:ファイル番号は FreeFile 関数を使って取得して変数に代入しています。
・9行目:Openステートメントのバイナリモードでファイル番号を割り当ててファイルを開きます。
・12行目:LOF 関数でファイルの長さを取得し、読み取り位置が長さに達するまでループ処理します。
・13行目:Input 関数で1文字づつ読み込んで、先に読み込んだ文字列に連結していきます。
・14行目:Loc 関数で現在の読み取り位置を取得します。
・15行目:Degug.Print で読み込んだ文字列と現在の読み取り位置を表示します。
・19行目:処理完了後に開いていたファイルを閉じます。
イミディエイトに表示された処理状況が下の画像です。

全角文字が2バイトになっているのがわかりますね。
ファイル操作の進行状況を表示する例
Loc 関数を使ってファイル操作の進行状況を表示する例です。
'■Loc関数サンプル2(ファイル操作の進行状況を表示する例)
Sub Loc_BinarySample02()
Dim fileNum As Integer
Dim curLoc As Long
Dim fileLength As Long
Dim str As String
' ファイルをバイナリモードで開く
fileNum = FreeFile ' 空きファイル番号取得
Open "c:\VBA_Sample\test.txt" For Binary As #fileNum
' ファイルの長さを取得
fileLength = LOF(fileNum)
' ファイルの終端までループ
Do While curLoc < fileLength
str = str & Input(1, #fileNum) ' 1文字ずつ読み込む
curLoc = Loc(fileNum) ' 現在位置を取得
' 進捗状況をイミディエイトに表示
Debug.Print "Progress: " & _
Format((curLoc / fileLength) * 100, "0.00") & "%"
Loop
' ファイルを閉じる
Close #fileNum
MsgBox "ファイル操作が完了しました!"
End Sub
・13行目:LOF 関数でファイルの長さを取得して変数に格納します。
・20行目:Degug.Print で現在位置をファイルの長さで割り、進捗率を計算して進捗状況を表示します。
イミディエイトの画像がこちらです。

このコードでは進捗状況をイミディエイトに表示しただけですが、ユーザーフォームやステータスバーなどに表示するようにカスタマイズして実用化します。
【注意点】
・エラー処理をしていないので、ファイルが存在しない場合 Open ステートメントでエラーが発生します。
おわりに
VBAの関数一覧はこちらからご参照ください。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA の Loc 関数は、開いているファイル内の現在の読み取り位置または書き込み位置を取得するために使用されます。
現在の読み取り位置や書き込み位置を取得することで、進捗管理や特定位置からのデータ操作などを効率化することが可能になります。Loc 関数を活用してファイル操作をさらに便利にしてください。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;