• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS VBA でのバイナリデータ操作について)

ACCESS VBAでのバイナリデータ操作について

このQ&Aのポイント
  • ACCESS VBAでバイナリデータを操作する際、全角空白がある場合に正しくコードを取得できない問題が発生します。
  • バイナリモードでの確認では、全角空白の文字コード「00」を取得できず、代わりに他の文字コードが取得されます。
  • バイナリデータの正確な操作を行いたい場合は、他の方法を見つける必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.3

今読み返しててふと思ったのですが・・・ >InputB(6, #1) >↓ >InputB(5, #1) >に変更し、Hex(ByteData(5))の部分も削除し、再度実行させ、そこで判明したものです。 エディタで確認した際は 「00」が存在して、インプットする時点で落ちる(バイナリを取得していない)ということは、この時点で既に全角スペース(全角空文字)を文字列として解釈してませんよね^^;(確かInputBの第一引数のナンバーって「バイト数を指定」でしたよね。) っとなると、全角スペースの文字コードはAC-VBAでは「文字コード」として解釈されないのかもしれません。(※AC-VBAで文字コード解釈出来ないバイナリデータを無視することを前提に話しています。) 上は推論で、完全に憶測の域を越えませんが・・・ 私にはこれ以上はお手上げです・・・>< お役に立てず申し訳ないです・・。

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます! Dim ByteData() As Byte Open "テキストファイル名" For Input As #1 Do While Not EOF(1)  ByteData = InputB(6, #1)  Debug.Print "確認(コード)" & Hex(ByteData(0)) & ":" & Hex(ByteData(1)) & ":" & Hex(ByteData(2)) _  & ":" & Hex(ByteData(3)) & ":" & Hex(ByteData(4)) & ":" & Hex(ByteData(5)) ・・・ 前回sykt1217様がご回答くださった「単純にInput」を試してみて、 その際にもバイト落ちしているのを見て、 もしかしたら上記InputBの段階で、ファイルをSHIFT-JIS扱いしてしまうのかなぁ?と 思いました。 http://support.microsoft.com/kb/404928/ja に、 「InputB 関数は、データをバイナリデータとしてみなして、Unicode への変換をおこないません。」 と記載があったので、読み込む際にバイナリデータとみなしてくれている(SHIFT-JISであろうがなんだろうが大丈夫!)と思ったのですが・・・ ふに落ちません。。 ですが、そうであれば、 シーケンシャル読みをせず、バイナリ読みをしてみよう!ということで、 ただいま検証中です。  Open strFullPass(1) For Binary Access Read As #inFileNo >私にはこれ以上はお手上げです・・・>< >お役に立てず申し訳ないです・・。 とんでもないです、おかげでケタ落ちが見えました!! 結果、再度ご報告いたします!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.4

閉じないでいただけてうれしいです(笑) >Open strFullPass(1) For Binary Access Read As #inFileNo ですか^^ っとなると、 Get #inFileNo, , ByteData() で取得・・・で Chr(ByteData) で変換・・・で出来るのかなぁ・・・^^;

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます! お礼が大変遅くなり、申し訳ありません。 >Get #inFileNo, , ByteData() >で取得・・・で >Chr(ByteData) はい、その通りでした! Open strFullPass(1) For Binary Access Read As #inFileNo ReDim ByteData(FileLen(strFullPass(1)) - 1) Get #inFileNo, 1, ByteData() Close #inFileNo とし、ByteData(0) などとして処理することで、何とかなりそうです。 本当にありがとうございました!

すると、全ての回答が全文表示されます。
  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.2

お礼ありがとうございます。 バイナリデータとしてでなく、単純にインプットしてみたらどうなるでしょう? Dim intFile As Integer Dim strName As String Dim strTxtName As String intFileNum = FreeFile Open strTxtName For Input Access Read As #intFile Do Until EOF(intFile)   ' 行を変数に読み込みます。   Input #intFile, strName   Debug.Print strName Loop Close #intFile とりあえずこれで試してみてください。

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます! お礼が遅くなり、申し訳ありません。 単純にインプットすると・・・ 「0B00F」 となります。 というのも、ファイルがUTF-16(BOMなし、ビックエンディアン)で作成されているのですが、 単純にインプットすると、ファイルをSHIFT-JIS とみなして、 30->0 42->B 30->0 00->ない?? 30->0 46->F と変換し、00に対するSHIFT-JISコードがないので取得できないと思われます。 これを回避するために、InputBを使って取り込ませてみたのですが、 InputBでもダメ、ということなのでしょうか。。。 再度、ご指導よろしくお願いいたします!

すると、全ての回答が全文表示されます。
  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.1

ByteDataはByte型ですかね? バイナリはあまり使ったことがありませんが、 >バイナリモードで確認すると、 >30 42 30 00 30 46 これはどの段階でしょう? テキストファイルを開き、一行を読み込んだ際にでしょうか? またByteData()配列に、一行分のバイナリデータが全て格納されていますか? Unicodeではなく、ANSI形式で格納しても同じ結果になるでしょうか? まずはウォッチウィンドウを使って、「どこまで『00』が格納されているか」等を確認してみてください。

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます。 >ByteDataはByte型ですかね はい、その通りです。 >>バイナリモードで確認すると、 >>30 42 30 00 30 46 >これはどの段階でしょう? これはプログラムを通す前の、テキストファイルをエディタ(バイナリモード)で確認した際です。 テキストデータが正しいことを確認したものです。 はじめは、 Dim ByteData() As Byte Open "テキストファイル名" For Input As #1 Do While Not EOF(1) ByteData = InputB(6, #1) Debug.Print "確認(コード)" & Hex(ByteData(0)) & ":" & Hex(ByteData(1)) & ":" & Hex(ByteData(2)) _ & ":" & Hex(ByteData(3)) & ":" & Hex(ByteData(4)) & ":" & Hex(ByteData(5)) ・・・ と記載していたのですが、、 InputB(6, #1)の部分でエラーとなり、エラー内容が 「ファイルにこれ以上データがありません」 でしたので、なぜかな?と思い、 InputB(6, #1) ↓ InputB(5, #1) に変更し、Hex(ByteData(5))の部分も削除し、再度実行させ、そこで判明したものです。 ですので、ByteData()配列に入ってきていない、ということになります。 ご指導よろしくお願いいたします。

すると、全ての回答が全文表示されます。