VBAでバイナリデータが上手く読めない

このQ&Aのポイント
  • VBAでバイナリデータが上手く読めない理由として、C言語とは異なる取得方法が必要なことが挙げられます。
  • Get文を使用する際に改行コードがある場合、それまでのデータしか取得できないため、改善策を考える必要があります。
  • バイナリデータをVBAで操作する際は、取得方法やデータの処理に注意が必要です。
回答を見る
  • ベストアンサー

VBAでバイナリデータが上手く読めない。

VBAでバイナリデータが上手く読めない。 もともとC言語でバイナリデータを加工していた事をVBAでやる事になったのですが、上手く読めない。 <VBA> Open inputFileName For Binary As #mFileNo のようにオープンして、 <VBA> Dim a(800) As Byte Get #1, , a のように記述すればC言語のように取得出来ると思ったのですが、上手く取得出来ません。 なんとなく分かった事ですが、800バイトの中に改行文字があった場合、そこまでを変数aに入れるようにすると出来そうなので、Getで改行コードがあった場合はそこまでを読み込むみたいな手段はありますでしょうか。inputだとデータがまったく見れませんでしたのでGetにて対応したいと思っています。 宜しくお願い致します。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

>上手く取得出来ません。 できるはずですけど、どう「上手く」できない? >そこまでを読み込む できません。 他にバイナリストリームで読み込む方法もあります。 Dim S Set S = CreateObject("ADODB.Stream") S.Open S.LoadFromFile inputFileName S.Position = 0 '先頭に位置付ける S.Type = 1 'バイナリモードに設定 S.Position = 2 'BOMを避ける ReDim B(0) As Byte '読み込みデータ B = S.Read() '読み込む(全データ) B = S.Read(800) '読み込む(バイト数指定)

r32yokoyok
質問者

お礼

GETで取得した後にStrconvにてUnicodeに変換したら、データの中身が見えたのでもう少し考えてみます。回答ありがとうございます。

r32yokoyok
質問者

補足

回答ありがとうございます。 データ取得が上手く出来ないに付いて記載していなかったので、追記しますと C言語だと800バイトをGetした際に、キャリッジリターン文字を判断しそこまでのデータを格納する機能があるみたいです。しかしながらVBAのGet関数にはそのキャリッジリターンまでのデータを取得するみたいな機能がないので、純粋に800バイトを取得してしまう。 レコードの先頭にある文字を判断して編集しているのですが、レコード長が可変なので800バイト取ってしまうと次のレコード途中までをGetで取得してしまう為、上手くデータが取得出来ないという事になります。レコードの先頭にある文字を判断できれば800バイトで編集が可能です。 あまり時間がなかったので、要点だけまとめようとしたのですが、抜けがありました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

どういう変換をしたか不明ですが、 ADODB.Streamはテキストモードでの読み込み、 文字コードの変換(ファイル全体)もできます。 VBAが正しく文字認識できるのはShift_JISで、 元のファイルの文字コードが分かれば処理可能 だと思います。

r32yokoyok
質問者

お礼

回答ありがとうございます。 変換はStrconv関数でUnicodeにしただけです。 元の文字コードはバイナリなのは分かるのですが、文字が化けてて変換するとそれっぽい文字になったりならなかったり・・・Getで調査中ですが、保留にしてます。 C++の方では解析はばっちりなのですが・・・VBAだと無理なのかなぁ

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

文字とか改行とか言われてますが、それって バイナリではなく、テキストじゃないですか? それなら For Binary ではなく For Input にして、Line Input #1, Text のように読み 込みます。Line Input は復帰改行までの 一行分のテキストファイルを読み込みます。 尚、変数には復帰と改行は含まれません。

r32yokoyok
質問者

お礼

INPUTを使うと、バイナリデータが取得出来ないので、Getを使っています。 Getで取得したデータをUnicodeに変換するとデータの中身が見えるみたいなので、もう少し考えてみます。回答ありがとうございました。

関連するQ&A

  • VBA(Access)でバイナリデータから日付を取得したい。日付は生年

    VBA(Access)でバイナリデータから日付を取得したい。日付は生年月日なのですが、VC++で行っていた作業を今度はVBA(Access)でやる事になり困っています。 <C++> int n,fd; char str[805],birthday[20],*p; fd = open(path, O_RDONLY); n = read(fd, str, 0x800); p=&buf[5*16+5+(16*21+6)]; sprintf(birth,"%08d",*((unsigned int*)(p-4))); 上記だと西暦がちゃんと取れます。 例>1990年4月5日だと⇒19900405のように取れます。 <VBA> VBA(Access)の場合どのように作成すれば良いでしょうか。 Dim b As String * 800 Dim str As String * 20 Open "Path.dat" For Binary As FreeFile Get # FreeFile, , b *適当に書いてしまいました。 str = mid$(b,55,8)   '←分からない部分 C++だと分かるのですが、VBAではどのように記述するのでしょうか。 とても雑で見にくいプログラムになっていますが、ご了承ください。 どのようにデータを取得しても化け文字で表示されてしまいます。 宜しくお願いします。

  • バイナリデーター内の文字を検索

    現在、以下のようなプログラムでバイナリファイルを読込んでいるのですが、そのデーターの中にある文字列の位置を検索したいのですが何かよい方法は無いでしょうか、for ~ next で廻すと一応はできますが、もう少し簡単な方法を探しています。 -------- Dim xBIN() As Byte Dim lngFileLenB As Long lngFileLenB = FileLen("バイナリ.BIN") Open "バイナリ.BIN" For Binary As #1 Get #1, , xBIN ' For i = 0 To lngFileLenB If IJP_DAT1(i) = CLng("&H" & "20") Then stop end if next i ---------- よろしくお願いします。

  • VBAでバイナリエディタを作ろうとしています

    テキストファイルを内部でバイナリとして開いて 16進数のダンプファイルとして新たなテキストに保存することはできたのですが 逆がどうしてもできません。 やり方としては、 03 E3 BD 71 80… のようなテキストデータをバイナリにして16進数にして保存したテキストファイルをダイアログから呼び出してもう一度元のテキスト文章に戻すという作業です。 とりあえず、まずは以下のコードでエクセル内で16進数を元の文章データに変換しようとしています。 Sub binaryToText() Dim fname As String Dim str() As Byte Dim row As Integer row = 1 fname = "Test.txt" '16進数ファイル Open fname For Binary As #1 Do Until EOF(1) ReDim Preserve str(row) Get #1, , str(row) row = row + 1 Loop Close #1 End Sub hex関数やchr関数を使う必要があるのでしょうか? VBAは始めたばかりで根本的なところで間違っているかもしれませんがよろしくお願いします。

  • VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの

    VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいのですが、 例えば、"A"が一文字のみのShift-JIS もしくはunicodeのテキストファイルを作るため、 (下記の確認はShift-jis で行っています。) Dim ByteData As Byte ByteData = AscW("A") Open "C:\A.txt" For Binary Access Write As #1 Put #1, 1, ByteData Close #1 としました。 できあがったファイルをバイナリエディタで確認すると、  41 となっています。 (Unicode は 41 00 2バイト文字でリトルエンディアンのため) この41は、"A" の文字コード(Shift-JIS)「65」の16進表記です。 この「41」という値を使ってバイナリモードでテキストファイルを作成したいのですが、 どのようにすればよいでしょうか? 上記 Put #1, 1, ByteData の部分を、 1.Put #1, 1, 41 としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「29 00 20 20」でした。 文字コード00 に該当する文字がないためだと思います。 2.Put #1, 1, "41" としたところ、「41 」(バイナリモードで 「34 31 20 20」) (41の後ろは半角空白) で×でした。 3.Put #1, 1, CLng("&H" & 41) としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「41 00 00 00」でした。 4.ByteData = CLng("&H" & 41) Put #1, 1, ByteData これでやっとできました。 この他にも方法があるのか?と思い、質問させていただきました。 ご指導よろしくお願いいたします。

  • バイナリデータのファイル入出力について

    ○No.1 Open filename For Binary Access Read As #1 Get #1, , 変数 Close #1 ○No.2 Open filename For Input As #1 Line Input #1, 変数 Close #1 No.1とNo.2のプログラムでは読み込み方にどのような違いがあるのでしょうか?たとえば、No.2のLine Inputでは改行文字は読み飛ばされますが、No.1は改行文字も読み込みますよね。また、No.1ではDim 変数 As String * 1と最後の* 1など文字の読み込み数を定義しておく必要がありますが、Line Inputに対応するものがないからでしょうか? また、バイナリデータを読み書きするときに他に良いコードというかこうするのが定石みたいなのがあったら教えてください。

  • バイナリ読み込みについて

    お世話になります。バイナリファイルの読み込みについて質問させてください。 バイナリファイルはC#で出力したものでushort型(符号無し16bit)で書き込んでいます。 //C#でushort型データのバイナリ書き込み例 private static void WriteBinary(){  ushort data=5000;   BinaryWriter bw = new BinaryWriter(new FileStream(@"C:\Binary.txt", FileMode.Create, FileAccess.Write)); bw.Write(data); bw.Close(); } これをJavaで読んで、書き込んだ値5000を取得したいのですが、 C#のushortは符号無しの2Byteなんので、Javaでそれに相当するように readUnsignedShortで読み込んだのですがうまくいきません。どなたかご教授ください。 //Javaでushort型データのバイナリ読み込み private static void ReadBinary(){  DataInputStream dis = new DataInputStream(new FileInputStream("C:\\Binary.txt"));  int data = dis.readUnsignedShort();  System.out.println(data);  } すると「34835」と表示されます。その他、readShort()→-30701 read(byte[2])として byteに格納してbyte[0]と[1]を足しても-101になり取得できませんでした。 保存されたデータは符号なしの16ビットなのでreadUnsignedShort()で取得できると 思ったのですが、何か根本的に考え方が違うのでしょうか?? ※もちろんC#でReadInt16で読み取ると正常に5000を取得できした。

    • ベストアンサー
    • Java
  • バイナリデータの中からMidのように指定範囲を取得したい

    教えて下さい。 VB6です。 テキストファイルをバイナリモードで開き、Midのように特定の位置から、 必要な分を取得し、ファイルを分割させたいです。 調べてたら、 Open 読込ファイル For Binary As #1 Open 書込ファイル For Binary As #2 ReDim bytData(1 To LOF(1)) Get #1, , bytData() Put #2, , bytData() close #1 close #2 というのを見つけました。これだとそのままコピーします。 ここから、指定された、バイト数目から指定されたバイト数までの データを取得し別のファイルを作りたいのですが、 うまくできません。どうしたら、望むことができるでしょうか? お助け下さい。

  • VBAを使って、一部バイナリデータを読み書き

    VBAを使って、一部バイナリデータを読み書きする方法 を教えてください。 あるファイルが1行目から30行目までが普通のASCII形式でデータが書き込まれており、 31行目以降はバイナリデータとなっています。 また、30行目にheader endと書かれています。 このデータを30行目までは文字列データとして抽出し、 31行目以降はバイナリデータとして抽出して、 少し内容を書き換えてから、最初と同様に 30行目までをASCII、31行目以降をバイナリデータとして出力したいのですが どのようにすれば良いですか? http://homepage2.nifty.com/kasayan/vba/binary.htm http://hanatyan.sakura.ne.jp/vbhlp/Binary.htm バイナリデータの読み込み方は上記のページに書かれてあるのですが いずれも、ファイルをまるごとバイナリ形式として読み込むもので 一部だけバイナリとして読み込むことはできないようです。 どなたかどうすれば良いか教えてください。

  • VBAのバイナリ出力について

    この度はお世話になります。 VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。 エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが 思った出力が出ないでいます。 エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。 そこで、まずはtxtで書き出せるかやってみまして・・・ Sub test() fnsave = "1.txt" Worksheets("Sheet1").Activate numff = FreeFile Open fnsave For Output As #numff temp = Range("C3") Print #numff, temp Close #numff End Sub (Sheet1のセルのC3に512文字入っています。) これをOutputをBinaryにして・・・Putで書く? 多分2文字を取り出して・・・書き込む?ような感じなのですが それをプログラムに起こす書き方がわからず困っています。 申し訳ございませんが、ご教授よろしくお願いします。。。

  • VBA バイナリ―から文字列にする方法

    この度はお世話になります。 現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。 バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。 そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。 Sub 電文解析プログラム() Dim Deciphering_file As Variant '読み込みファイル Dim buf As Byte '1バイト格納 Dim fLen As Long 'ファイルサイズ Dim TEMP(1) As String ' Dim S_JIS As String '文字コード(2バイト) Dim str As String '文字列データ Dim i As Long Deciphering_file = Application.GetOpenFilename("BINファイル(*.bin),*.bin") fLen = FileLen(Deciphering_file) Open Deciphering_file For Binary As #1 For i = 1 To fLen Get #1, i, buf S_JIS = Hex(buf) If buf = 0 Then S_JIS = "00" End If TEMP(0) = Mid(S_JIS, 1, 1) TEMP(1) = Mid(S_JIS, 2, 1) str = myChr & TEMP(0) & TEMP(1) Next i End Sub ホントは3行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

専門家に質問してみよう