月刊プログラム!
Visual Basic For Excel

Vol_14
2001.JUL.31

Presented by kouta_y
感想等は掲示板、苦情はメールへ。

にこちゃん
ふと気が付いたけど、右の方に書いてある「Presented」って意味がよく分からなかったりする。
しかも最初の方の月刊プログラムはスペル間違ってたし。
まぁいいか。今度調べてみよう。


バイナリ操作

えーっと、ファイル操作関連は今回で最後でしょう。
気が向いたらまたやるかも。(気まぐれ)

今回はバイナリ書き込みです。
バイナリってのは、要するに人が読めないような内容(?)の事です。
そのアプリケーション固有の情報が詰まったファイル形式という事です。
テキストというのは、人が読めるっていうより、読む為の形式です。

【バイナリ】
エクセルとかで作ったブックを保存して、メモ帳かなんかで開こうとします。
すると、ぐちゃぐちゃぐちゃ〜っと思いっきり文字化けしますよね?
当たり前です。
当たり前なんです。
「あたりめ」ではありません。

原理を説明すると、そういうバイナリなファイルというのは、そのアプケーション固有の「情報」が格納されているんです。
例えば、セルの何番目に何が打ち込まれているかとか、そのセルの書式はどうだとか、この図形は横何ピクセル縦何ピクセルの位置に表示されているかとか・・・。
そんな情報がギッシリ詰まっているんです。

それらは、全て数値です。
「文字」として表示させるようには出来ていないので、当たり前の事ながら、メモ帳なんかでは見る事が出来ないんですね。

はい、話戻して、、、
バイナリでのファイル操作は、テキスト操作に慣れてしまった人には、少し大変かもわかりません。
テキストと違って、いろいろ細かく設定やら何やらする場合があるからです。
でもその分細かく操作が出来ます。

まぁなんのかんの言ってても始まらないので、とりあえず意味はともかく下のコードを打ってください。
例のごとく、エクセルブックはどこか(デスクトップとか)に保存しといてください。別にアブナイ処理する訳ではありません。

Sub BinaryFile()
Dim Path As String
Dim NO   As Integer
Dim Data As Byte 'バイト型

Path = ThisWorkbook.Path & "\Binary.aaa" '関連付けされてなさそうな拡張子

Data = 65
NO = FreeFile
Open Path For Binary As #NO
   Put #NO, , Data
Close #NO

End Sub

実行結果(Binary.aaaの中身)

A

はい。こんな感じになりましたかね?
「はぁ?」と思われた方もいると思います。
「よく意味がわからないよ」
えっと。
このあたりでもちろっと説明しましたが、ほぼ全てのテキストエディタってのは、「文字コード」で判別しています。
「A」の文字コードは「65(16進:41)」になります。
その65を保存したので、「A」と表示されたわけです。

「なんだかよく分からん」って感じですね。
では、次にちょっと違う感じのサンプルです。

'Data構造体
Type Data
    A As Long
    B As Integer
    C As String * 4 'サイズを指定
End Type

Sub
BinaryFile()
Dim dataA As Data
Dim
dataB As Data
Dim
Path As String
Dim
NO As Long, i As Long

Path = ThisWorkbook.Path & "\Binary.aaa" '関連付けされてなさそうな拡張子

'
'Withステートメント : オブジェクトのプロパティなどを設定、又はステートメントを実行出来る
'

With dataA
    .A = 1000
    .B = 100
    .C = "たろちん"
End With

NO = FreeFile
Open Path For Binary As #NO '書き込み
   Put #NO, , dataA
Close #NO


Open Path For Binary As #NO '読み取り
    Get #NO, , dataB
Close #NO

With dataB
    Cells(1, 1).Value = .A
    Cells(2, 1).Value = .B
    Cells(3, 1).Value = .C
End With

End Sub

実行結果(Binary.aaaの中身)

 d  たろちん

実行結果(エクセルシート)



はい。こんな感じです。
ファイルの中身は分けわからんですね。唯一読めるのは「たろちん」でしょうか。
これはどういう事かというと、最初のOpenで変数DataAをファイルに書き込みました。
その時、書き込まれる順序としては、構造体の要素順に書き込まれます。
つまり、A, B, Cの順ですね。
んで次のOpenで、変数DataBにファイルの内容を取得しています。
今度は、ファイルの最初の内容から、構造体の最初の要素のにあてはめられていきます。
つまりファイルの構造としては、

1000
100
たろちん

となっているので、

DataB.A = 1000
DataB.B = 100
DataB.C = たろちん

となる訳です。


あと、最初に説明するのを忘れてただけなんですが、バイナリで書き込み読み込みを行う場合「Put」「Get」ステートメントを使います。
Put #ファイル番号, 位置, データ
ってな感じです。
「位置」ってのは、書き込み又は読み込む先頭位置をバイト単位で指定します。
例:
Dim Data(1 To 10) As Byte
Get #1, 5, Data
とやると、ファイル番号1のファイルの5バイト目からDataの大きさだけ(つまり10バイト分)読み込む事になります。


用途

バイナリファイルの用途ですが、、、
さっき構造体の書き込み、読み込みをやった時、ピーンと来た人もいるかもしれません。
そうです。
自分の思いのままのデータが、保存できちゃうんです。
まぁエクセルでは、あんま使わないカモしれないですが・・・。


えー、自作バイナリファイルが作れる様になれば、自分で作ったアプリケーション独自のファイルが作れる様になったりまします。
でもまぁ、エクセルマクロではそんなにバイナリファイルを扱う事はないと思います。
ちなみに、バイナリファイルで文字列を扱う場合、固定長にした方が良いです。
書き込む時はいいとして、読み込む時に「何バイト読み込めばいいの?」ってなってしまうからです。
(VBAでの文字列変数の初期サイズは0(ゼロ)だからです)