ACCESS VBA でのバイナリデータ操作について
いつも参考にさせていただいております。ありがとうございます。
テキストファイルがあるとし、
日本語(UTF-16 BE)で
あいう
というデータとします。
バイナリモードで確認すると、
30 42 30 44 30 46
と表示されます。
この文字コードを使って文字を生成したいのですが、
http://support.microsoft.com/kb/404928/ja
上記を参照し、
ByteData = InputB(6, #1)
ChrB(cint("&H" & Hex(ByteData(1)))) & ChrB(cint("&H" & Hex(ByteData(0))))
という方法で「あ」を生成させることはできたのですが、
全角空白があった場合、ただしくコードを取得させることができません。
たとえば、「あ う」(←[あ]と[う]の間が全角空白です)の場合、
バイナリモードで確認すると、
30 42 30 00 30 46
なのですが、「00」を取得することができず、
hex(ByteData(0)) = 30
hex(ByteData(1)) = 42
hex(ByteData(2)) = 30
hex(ByteData(3)) = 30
hex(ByteData(4)) = 46
となってしまいます。
なぜなのでしょうか?
また、他によい方法はありますでしょうか?
ご指導よろしくお願いいたします。
No.1
- 回答日時:
ByteDataはByte型ですかね?
バイナリはあまり使ったことがありませんが、
>バイナリモードで確認すると、
>30 42 30 00 30 46
これはどの段階でしょう?
テキストファイルを開き、一行を読み込んだ際にでしょうか?
またByteData()配列に、一行分のバイナリデータが全て格納されていますか?
Unicodeではなく、ANSI形式で格納しても同じ結果になるでしょうか?
まずはウォッチウィンドウを使って、「どこまで『00』が格納されているか」等を確認してみてください。
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()配列に入ってきていない、ということになります。
ご指導よろしくお願いいたします。
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
とりあえずこれで試してみてください。
sykt1217様、ご回答ありがとうございます!
お礼が遅くなり、申し訳ありません。
単純にインプットすると・・・
「0B00F」
となります。
というのも、ファイルがUTF-16(BOMなし、ビックエンディアン)で作成されているのですが、
単純にインプットすると、ファイルをSHIFT-JIS とみなして、
30->0
42->B
30->0
00->ない??
30->0
46->F
と変換し、00に対するSHIFT-JISコードがないので取得できないと思われます。
これを回避するために、InputBを使って取り込ませてみたのですが、
InputBでもダメ、ということなのでしょうか。。。
再度、ご指導よろしくお願いいたします!
No.3ベストアンサー
- 回答日時:
今読み返しててふと思ったのですが・・・
>InputB(6, #1)
>↓
>InputB(5, #1)
>に変更し、Hex(ByteData(5))の部分も削除し、再度実行させ、そこで判明したものです。
エディタで確認した際は
「00」が存在して、インプットする時点で落ちる(バイナリを取得していない)ということは、この時点で既に全角スペース(全角空文字)を文字列として解釈してませんよね^^;(確かInputBの第一引数のナンバーって「バイト数を指定」でしたよね。)
っとなると、全角スペースの文字コードはAC-VBAでは「文字コード」として解釈されないのかもしれません。(※AC-VBAで文字コード解釈出来ないバイナリデータを無視することを前提に話しています。)
上は推論で、完全に憶測の域を越えませんが・・・
私にはこれ以上はお手上げです・・・><
お役に立てず申し訳ないです・・。
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
>私にはこれ以上はお手上げです・・・><
>お役に立てず申し訳ないです・・。
とんでもないです、おかげでケタ落ちが見えました!!
結果、再度ご報告いたします!
No.4
- 回答日時:
閉じないでいただけてうれしいです(笑)
>Open strFullPass(1) For Binary Access Read As #inFileNo
ですか^^
っとなると、
Get #inFileNo, , ByteData()
で取得・・・で
Chr(ByteData)
で変換・・・で出来るのかなぁ・・・^^;
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) などとして処理することで、何とかなりそうです。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロ、条件付き書式のfont.color 1 2023/03/28 01:10
- その他(プログラミング・Web制作) I2C接続のLCDディスプレイを使う 2 2023/05/01 17:15
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/04/21 13:46
- Visual Basic(VBA) 【VBA】Excelで罫線を引きたい 3 2022/07/14 12:04
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
ACCESS で質問があります。
その他(データベース)
-
AccessからOLEオブジェクト型のデータをエクスポートしたい。
その他(Microsoft Office)
-
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
-
4
VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの
Visual Basic(VBA)
-
5
VBA バイナリ―から文字列にする方法
Visual Basic(VBA)
-
6
accessで該当するレコードがない場合
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
全角入力
-
英数字のみ全角から半角に変換
-
word差し込み印刷 半角カタカ...
-
VBA 文字に半角が含まれて...
-
全角英数字の必要性が理解できない
-
char型全角数字から、int型半角...
-
空白を全て削除したい
-
エクセルにMicrosoft Barcode C...
-
小説の点々は……と繋がらなくて...
-
全角/半角キーをSendkeys関数で...
-
ACCESS VBA でのバイナリデー...
-
CString Format にて全角空白文...
-
全角数字を半角数字にする方法
-
プログラミングでは、半角括弧...
-
よくアカウント等に使われる 半...
-
掲示板で全角の英字はなぜいけ...
-
VB.net、テキストボックス入力...
-
VBで「全角」文字を「半角」に...
-
[Excel VBA] ODBCによる外部デ...
-
POM
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
エクセルにMicrosoft Barcode C...
-
プログラミングでは、半角括弧...
-
IEからEdgeへの移行に伴うIMEの...
-
全角英数字の必要性が理解できない
-
VBA 文字に半角が含まれて...
-
Accessのテキストボックスの入...
-
word差し込み印刷 半角カタカ...
-
COBOL・全角判定
-
全角入力
-
VB.net、テキストボックス入力...
-
COBOLでの全角文字の判定をした...
-
CString Format にて全角空白文...
-
メモ帳の段落の揃え方
-
ダブルコーテーションの置換
-
正規表現で、全角文字を半角文...
-
VBで、String型のデータが、...
-
よくアカウント等に使われる 半...
-
エクセルでの”々”の扱い
おすすめ情報