ランダムファイルのアクセス EXCEL VBAサンプルコード

VBAサンプル

説明

機能

固定長ファイルをランダムアクセスするサンプルです。

現在、無料のデータベースが利用出来るため、ほとんど使われないサンプルかもしれません。
索引付きファイルのデータ部分や固定長ファイル(相対編成ファイル)として構築する際に使えます。
このサンプルを理解すると自前で単純なデータベースを作ることも出来ます。

補足・注意事項

固定長レコードは、構造体(ユーザー定義型)で表現します。
固定長レコードは、1レコード(データ一件分)の長さが固定なので、何件目のデータでも瞬時にアクセス出来る、というのが最大のメリットになります。
例えば、100バイトの固定長レコードの場合、100件めのデータを読みたい(書きたい)場合は、10000バイトめから100バイトのデータにアクセスします。

使用例

固定長ファイルに対してランダムモードで読んだり書いたりする

コード

'ユーザーレコード定義
Type userrec
  username As String * 30
  telno As String * 20
End Type

Sub Ex01()

  Dim fileno As Integer   ' ファイル番号
  Dim datarec As userrec  ' ユーザーレコード変数

  'ファイル番号の取得
  fileno = FreeFile
 
  'ランダムファイルの処理
  Open "c:\vbatest\testuser.dat" For Random As #fileno Len = Len(datarec)

  '書き込み
  datarec.username = "○×太郎"
  datarec.telno = "090-xxxx-xxxx"
  Put #fileno, 1, datarec

  datarec.username = "△■花子"
  datarec.telno = "090-yyyy-yyyy"
  Put #fileno, 2, datarec

  '読み込み
  Get #fileno, 2, datarec
  Debug.Print datarec.username
  Debug.Print datarec.telno

  Close #fileno

End Sub

解説

ユーザー定義型(構造体)の定義

2:ユーザー定義型(ユーザーレコード(userrec))を定義
3:変数定義(ユーザー名(username)を文字列型30バイトで定義)
4:変数定義(電話番号(telno)を文字列型20バイトで定義)
2~5のType~End Type文でuserrec1レコード分(50バイト)の型が定義されました。

変数定義

9:変数定義(ファイル番号を整数型で定義)
10:変数定義(データレコードを2で定義したuserrec型で定義)

アクセスの準備

13:空いているファイル番号の取得して9で定義した変数にセット

ファイルの書き込み

16:書き込むファイルをランダムアクセスモード、2で定義したuserrecの長さ(50バイト)でオープンする

書き込み例1

19:データのユーザー名(username)に値をセットする
20:データの電話番号(telno)に値をセットする
21:19~20で設定したデータレコードを、1件めに書き込む

書き込み例2

23:データのユーザー名(username)に値をセットする
24:データの電話番号(telno)に値をセットする
25:19~20で設定したデータレコードを、2件めに書き込む

読み込み例1

28:2件めのデータレコードを読み込む
29:読み込んだデータレコードのユーザー名(username)を表示する
30:読み込んだデータレコードの電話番号(telno)を表示する

後始末

32:オープンしているファイルをクローズ

実行例

実行するとファイル”testuser.dat”にアクセスします。
既存の”testuser.dat”が存在しない場合は、新規作成されます。

コードの実行

EX01を実行します。
イミディエイトウインドウに29,30で記述した通り、2レコードめのデータの内容が表示されます。
cap_20160814102729_0001

ファイルの内容

2件の固定長ファイルです。
テキストファイルではありませんので改行コードはありません。
cap_20160814102729_0002

メモ

コードのサンプルとしてのわかりやすさを優先しているので、エラー処理を省略したり、ファイルのパスを直接書いたり、GetステートメントやPutステートメントを使って適当な読み書きをしていますが、流用する場合は、シート上にパスを記述出来るようにするなど、適宜修正するとよいと思います。

補足情報

ワンポイントアドバイス

ランダムアクセスにおける読み書き

ランダムアクセスにおける固定長ファイルのアクセスでは、データの何件めでも読み書きすることが出来ます。

読む

Getステートメントを使うと任意の位置(1件めでも100件めでも)のレコードを直接読むことが出来ます。

書く

Putステートメントを使うと任意の位置(1件めでも100件めでも)のレコードを直接書くことが出来ます。

ファイル番号

このページのサンプルのようなOpenステートメントで開くファイルのプログラミングでは、ファイル番号を使います。
ファイル番号は、個々のファイルに付ける番号であり、Openしたときのファイル番号は、Get、Put、Closeなど、ファイルにアクセスするステートメントを記述するときも同様に記述します。複数ファイルを取り扱うプログラミングを行う際には、個々の命令で記述するファイル番号を間違えないようにしましょう。

2つのファイルを取り扱うプログラミングの例

入力ファイルのファイル番号を”inputfileno”、固定長ファイルのファイル番号を”randomfileno”で定義した例です。

  inputfileno = FreeFile
  Open "inputfile" For Input As #inputfileno

  randomfileno = FreeFile
  Open "randomfile" For Output As #randomfileno

  Line Input #inputfileno, buf
  put #randomfileno, 100, datarec

  Close #inputfileno
  Close #randomfileno

VBAリファレンス

サンプルコード内で使用しているステートメントや関数の詳細は、以下のページを参照してください。

FreeFile関数

VBAレファレンス FreeFile関数

Openステートメント

準備中

Getステートメント

準備中

Putステートメント

準備中

Closeステートメント

準備中

Debug.Print

準備中

用語

イミディエイトウインドウ

準備中

固定長ファイル

準備中

ユーザー定義型

準備中

ファイル番号

準備中

文字コード

準備中

改行コード

準備中

類似機能

ADODB.Streamオブジェクトによるファイル入出力
FileSystemObjectオブジェクトによるファイル入出力

参考サイト

Office VBA 言語リファレンス
https://msdn.microsoft.com/ja-jp/library/office/gg264383.aspx

タイトルとURLをコピーしました