説明
機能
固定長ファイルをランダムアクセスするサンプルです。
現在、無料のデータベースが利用出来るため、ほとんど使われないサンプルかもしれません。
索引付きファイルのデータ部分や固定長ファイル(相対編成ファイル)として構築する際に使えます。
このサンプルを理解すると自前で単純なデータベースを作ることも出来ます。
補足・注意事項
固定長レコードは、構造体(ユーザー定義型)で表現します。
固定長レコードは、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レコードめのデータの内容が表示されます。
ファイルの内容
2件の固定長ファイルです。
テキストファイルではありませんので改行コードはありません。
メモ
コードのサンプルとしてのわかりやすさを優先しているので、エラー処理を省略したり、ファイルのパスを直接書いたり、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関数
Openステートメント
準備中
Getステートメント
準備中
Putステートメント
準備中
Closeステートメント
準備中
Debug.Print
準備中
用語
イミディエイトウインドウ
準備中
固定長ファイル
準備中
ユーザー定義型
準備中
ファイル番号
準備中
文字コード
準備中
改行コード
準備中
類似機能
ADODB.Streamオブジェクトによるファイル入出力
FileSystemObjectオブジェクトによるファイル入出力
参考サイト
Office VBA 言語リファレンス
https://msdn.microsoft.com/ja-jp/library/office/gg264383.aspx