Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10420 / 13644 ツリー ←次へ | 前へ→

【21873】バイナリファイルをTXTファイルで書込みをしたい yaya 05/2/2(水) 15:52 質問[未読]
【21880】Re:バイナリファイルをTXTファイルで書込みをし... Jaka 05/2/2(水) 16:33 回答[未読]
【21885】Re:バイナリファイルをTXTファイルで書込みをし... yaya 05/2/2(水) 17:08 お礼[未読]
【21893】Re:バイナリファイルをTXTファイルで書込みをし... ichinose 05/2/2(水) 21:23 発言[未読]
【21903】Re:バイナリファイルをTXTファイルで書込みをし... yaya 05/2/3(木) 10:05 お礼[未読]
【21924】Re:バイナリファイルをTXTファイルで書込みをし... ichinose 05/2/3(木) 21:05 発言[未読]
【21936】Re:バイナリファイルをTXTファイルで書込みをし... yaya 05/2/4(金) 11:10 お礼[未読]

【21873】バイナリファイルをTXTファイルで書込みをし...
質問  yaya E-MAIL  - 05/2/2(水) 15:52 -

引用なし
パスワード
   バイナリファイルからLINE INPUTで読込ができましたが その結果をシートにTXTで書き込みをしたいのですが ご存知の方ぜひ ご教示をお願いいたします

【21880】Re:バイナリファイルをTXTファイルで書込みを...
回答  Jaka  - 05/2/2(水) 16:33 -

引用なし
パスワード
   こんにちは。

半角カタカナは、文字化けの原因になりますから、できれば控えてください。
バイナリで試してないけど、おおむねこんな感じでも良いと思います。

Sub vivi()
  Dim TBst() As String, CNT As Long, OPF As String
  OPF = バイナリファイルフルパス
  Open OPF For Input As #1
  Do Until EOF(1)
    Line Input #1, ReadData
    CNT = CNT + 1
  Loop
  Close #1
  ReDim TBst(1 To CNT, 1 To 1)
  CNT = 0
  Open OPF For Input As #1
  Do Until EOF(1)
    CNT = CNT + 1
    Line Input #1, TBst(CNT, 1)
  Loop
  Close #1
  Range("A1").Resize(UBound(TBst)).Value = TBst
  Erase TBst
End Sub

【21885】Re:バイナリファイルをTXTファイルで書込みを...
お礼  yaya E-MAIL  - 05/2/2(水) 17:08 -

引用なし
パスワード
   回答ありがとうございました
早速トライしてみました
その結果 バイナリデーターがセルに書きこまれ
バイナリデーターの中身(今読もうとしているものは数値です)
を見ることが出来ませんでした
よろしくお願い致します

【21893】Re:バイナリファイルをTXTファイルで書込みを...
発言  ichinose  - 05/2/2(水) 21:23 -

引用なし
パスワード
   ▼yaya さん、Jakaさん、こんばんは。

>早速トライしてみました
>その結果 バイナリデーターがセルに書きこまれ
>バイナリデーターの中身(今読もうとしているものは数値です)
>を見ることが出来ませんでした

バイナリファイルをLine Inputステートメントで読み込むのですか?
う〜ん、これは無理だと思いますが・・・。
例えば、以下のコード実行してみて下さい。
これは、"123"という文字列を書き込むコード
'===================================================
Sub mk_txt()
  flno = FreeFile
  Open "D:\My Documents\test.txt" For Output As #flno
   '   適当なパスに直して下さい
  Print #flno, "123"
  Close #flno
End Sub

次いで以下のコードを実行してみて下さい
これは、作成したtest.txtからデータを読み込むコード
'=====================================================
Sub read_txt()
  flno = FreeFile
  Open "D:\My Documents\test.txt" For Input As #flno
  Line Input #flno, txt$
 
  Cells(1, 1).Value = txt$
  Close #flno

End Sub

セルには、123と表示されていますよね?
実際のtest.Txtには、Hexコード(16進数)で表すと、

31 32 33 0D 0A

という5バイトのデータが格納されています。

Line Inputステートメントは、0D0Aを取得しません。

でも、バイナリファイルの場合、この0D0Aも立派なデータですから、
取得できないと困ってしまいますよね?

>バイナリデーターの中身(今読もうとしているものは数値です)
>を見ることが出来ませんでした

バイナリファイルの中身を仮にLine Inputステートメントで
取得できたとしてもそのまま、セルに放り込んでは殆ど、表示されないと思いますよ。
例えば、データとして(16進数)で
00 01 02

なんてデータは、セル代入しても表示されません。
文字として表示可能なコードではないですから・・・。

で、私がわからないのは、
>読もうとしているものは数値です
とありますが、どういう結果を希望しているのかがわからないんです。

ダンプリストのような結果がほしいのでしょうか?
例えば、上記のtest.txtだと

31 32 33 0D 0A

という結果を表示するのならば、私も作った事がありますが・・・。

【21903】Re:バイナリファイルをTXTファイルで書込みを...
お礼  yaya E-MAIL  - 05/2/3(木) 10:05 -

引用なし
パスワード
   ▼ichinose さん:
 ありがとうございます
>で、私がわからないのは、
>>読もうとしているものは数値です
>とありますが、どういう結果を希望しているのかがわからないんです。
>
>ダンプリストのような結果がほしいのでしょうか?


LIne Inputでよみますと以下の結果が得られ
これがセルに書きこまれました
  8ュLス・・ソR&ソ・セソ}Zハソqナソ

上記の結果を下記のような数値に変換して読みたいのですが  
  223.56   332.12     120.25
よろしくお願いします

【21924】Re:バイナリファイルをTXTファイルで書込みを...
発言  ichinose  - 05/2/3(木) 21:05 -

引用なし
パスワード
   ▼yaya さん:
こんばんは。
>LIne Inputでよみますと以下の結果が得られ
>これがセルに書きこまれました
>  8ュLス・・ソR&ソ・セソ}Zハソqナソ
>
>上記の結果を下記のような数値に変換して読みたいのですが  
>  223.56   332.12     120.25

なるほど・・・、
結果から先に申し上げると、
・投稿していただいた情報では数値として認識させる事はできません。
・又、情報を提供して頂いたとしても場合によっては、変換が
 すこぶる困難な場合もあります。


また、例を挙げましょう!!

以下のコードを実行してバイナリファイルのサンプルを作成してみて下さい。

標準モジュールに
'======================================================
Type rec
  dat(1 To 3) As Double
  End Type
'================================================================
Sub put_file()
'倍精度の変数を3つ書き込みました
'ファイルは、8*3=24 バイトのファイルです
'それぞれには、yaya さんが提示された数値を代入しました  
  Dim rec1 As rec
  flno = FreeFile()
  Kill "D:\My Documents\binfile.bin"
  Open "D:\My Documents\binfile.bin" For Random As #flno Len = 24
'     ↑パス名は、適当に変えて下さい
  With rec1
   .dat(1) = 223.5
   .dat(2) = 332.12
   .dat(3) = 120.25
   End With
  Put #flno, 1, rec1
  Close #flno
End Sub

作成したバイナリファイルをLine Inputを使用して読み込んで見ましょう
同じ標準モジュールに

'=======================================================
Sub get_line_input()
  Dim dat As String
  flno = FreeFile()
  Open "D:\My Documents\binfile.bin" For Input As #flno
  Line Input #flno, dat
  Close #flno
  [a1].Value = dat
End Sub

アクティブシートのセルA1には、なにやら変てこな表示がされていると思います。

では、正しく表示させるようにしてみましょう。
同じ標準モジュールに
'===========================================================
Sub get_file()
  Dim rec1 As rec
  flno = FreeFile()
  Open "D:\My Documents\binfile.bin" For Random As #flno Len = 24
  Get #flno, 1, rec1
  Close #flno
  With rec1
   For idx = 1 To 3
     MsgBox .dat(idx)
     Next
   End With
End Sub

以上を順番に実行してみて下さい。
get_fileというプロシジャーで数値を取得できていますよね?

何故なら、私は、binfile.binというバイナリファイルのレコード形式を
知っているからです(倍精度データ(8バイト)が3つ連なっているデータであるということをです、)。ここで私が作ったのですから当たり前なのですが・・・。

これを知らなければ、データを取得する事はできません。

お分かりいただけたでしょうか?

バイナリファイルの中のデータを意味のあるデータとして取得するためには、
ファイルの中の仕様を知っていなければならないのです。

これは、yaya さんが問題にしているバイナリファイルの設計者あるいは、
そのファイルを作成したアプリの作成者に聞かなければなりません。

又、例題では、Doubleという変数を取り上げましたが、
Doubleと言う変数は浮動小数点になっていますが、
この浮動小数点の仕様がVBAの仕様と違う場合だってあります。
この場合は、VBAのDoubleで取得しても値が違ってきてしまいます。


と言う事でまず、
バイナリファイルの仕様を調べることから始めてはいかがでしょうか?

【21936】Re:バイナリファイルをTXTファイルで書込みを...
お礼  yaya E-MAIL  - 05/2/4(金) 11:10 -

引用なし
パスワード
   ありがとうございました
 ご丁寧な回答をいただきとても参考になりました
 早速バイナリファイルの仕様を確認しまして
 トライしてみます
 助かりました、ありがとうございました
 トライの結果を報告させていただきます

10420 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free