|
▼わさび さん、小僧さん、でれすけさん、こんばんは。
>回答をお寄せいただき、ありがとうございます。
>おふたりのお話は私には高度すぎて理解できない部分が多いですのですが、
>なんとなくわかってきたような気もします。
>
>Openステートメントをヘルプで調べたら、
>「filenumber」を「1〜511の範囲で任意のファイル番号を指定する」部分で、
>Byte型が関わってくるんですね。
>そして「1〜511」を範囲として含むので、
>Integer型でも、はたまたLong型でも
>ファイルサイズが偶数もしくは4の倍数なら大丈夫…という考えでよいのでしょうか。
う〜ん、確かにそうなんですが・・・。
これは、「今回の事例は、BianryモードげGetしてそのままPutするわけで、
その意味ではInteger型でも問題はありません。」
という限定であって、実際にバイナリーファイルをInteger型で
読み込む事ということはしませんね!!
なぜなら、
例えば、
以下のコードを実行して下さい。
'==================================================
Sub test1()
Dim fno As Long
Dim wbyte() As Byte
fno = FreeFile()
On Error Resume Next
Kill ThisWorkbook.Path & "\test.bin"
Open ThisWorkbook.Path & "\test.bin" For Binary As #fno
ReDim wbyte(1)
wbyte(0) = &H2
wbyte(1) = &H1
Put fno, , wbyte()
Close #fno
End Sub
これは、ヘキサコードで、0201hという2バイト分のデータをファイルTest.Binに書き込んだコードです。
バイナリエディタ等で確認してみてください。
尚、Thisworkbook.Pathを使っているので一度マクロを含むブックは保存してから
実行してください。
次に
'=======================================================
Sub test2()
Dim fno As Long
Dim wbyte() As Byte
fno = FreeFile()
Open ThisWorkbook.Path & "\test.bin" For Binary As #fno
ReDim wbyte(1)
Get #fno, , wbyte()
Close #fno
MsgBox wbyte(0) & "---" & wbyte(1)
End Sub
これは、確認のために読み込んでみたコードです。
wbyte(0)には、2H Wbyte(1)には、1H
が格納され、正しくファイルが作成された事が確認できます。
では、次に同じファイルを
'============================================================
Sub test3()
Dim fno As Long
fno = FreeFile()
Dim dat As Integer
Dim dat2 As Integer
Open ThisWorkbook.Path & "\test.bin" For Binary As #fno
Get fno, , dat
Close #fno
MsgBox dat
End Sub
Integer型の変数で読み込むと
258なんてどこから来たのかと思うような値が表示されますよね?
ファイル内で0201Hの2バイトは、Integer型の変数に読み込まれると、
Integer型の内部では0102hとして格納されます。
よって、16進数で0102は、10進数の258ですから、そう表示されるのですが・・。
バイナリーファイルというのは、設計によっては、0201Hに意味がある場合も
ありますから、Integer型で読み込むというのは、特殊な場合に限りますよ!!
|
|