VBAを使った一部バイナリデータの読み書き方法

このQ&Aのポイント
  • VBAを使用して、一部のバイナリデータを読み書きする方法について教えてください。
  • あるファイルの30行目までのデータを文字列として抽出し、31行目以降のデータをバイナリとして抽出する方法をお教えください。
  • バイナリデータを読み込むVBAの方法はいくつかありますが、一部だけバイナリとして読み込む方法はわかりません。ご教授いただけますか?
回答を見る
  • ベストアンサー

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 バイナリデータの読み込み方は上記のページに書かれてあるのですが いずれも、ファイルをまるごとバイナリ形式として読み込むもので 一部だけバイナリとして読み込むことはできないようです。 どなたかどうすれば良いか教えてください。

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

  • ベストアンサー
noname#212058
noname#212058
回答No.4

No.2 です。 > 読み込みファイルから、ヘッダ部位を配列a(30)に読み込んで、 > バイナリ部位をb(256)に読み込んだとします。 > どうやって、テキストデータとバイナリデータを合体させれば > 良いですか? すいません、『やりたいこと』を読み違えていました。 ヘッダ部位、バイナリ部位の両方とも同じファイルに出力 したいということですね。 以下の手順で行けると思います。  1. 書込ファイルにテキストでヘッダを出力  2. 書込ファイルをバイナリモードで OPEN  3. 出力位置を末尾に移動 (SEEK を使います)    http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200501/200501_05010100.html  4. バイナリ部位をファイルに出力 # ヘッダ部分をテキスト出力せずに、1文字づつASC関数で # ASCIIコードに変換して全部バイナリ出力するという方法も # 考えられます。

その他の回答 (3)

noname#212058
noname#212058
回答No.3

No.2 です。 バイナリデータの書き込み方法は、質問者さんが 書かれているサイトにサンプルがありますよね。 1. 読込ファイルをオープンして、31行目まで読み飛ばす 2. 書込用のファイルをオープン 3. 読込ファイルから1バイトづつ読み込み、書込ファイル   に1バイトづつ出力する。これを読込ファイルの最後   まで繰り返す 4. 全部終わったら2つのファイルをクローズ で、できると思いますが。 3. の具体的なコードが判らないということでしょうか…。

BUCHURUN
質問者

お礼

ありがとうございます。 分からないのは四番目の、全部終わったら2つのファイルをクローズ というところです。 読み込みファイルから、ヘッダ部位を配列a(30)に読み込んで、 バイナリ部位をb(256)に読み込んだとします。 どうやって、テキストデータとバイナリデータを合体させれば良いですか?

noname#212058
noname#212058
回答No.2

バイナリモードで先頭から読み込んでいって、30個目の 改行コードまで読み飛ばせば良いと思います。 Windowsの改行は CR+LF ですから、先頭から読み込んで いって 30個目の LF (ASCIIコード 10) の次からが31行目 (バイナリデータ)ですよね。

BUCHURUN
質問者

お礼

ありがとうございます。 この方法も良いですね でもファイルを出力する時にはどうしたら良いですか?

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> また、30行目にheader endと書かれています。 ここまでのByte数を数えておけば?

BUCHURUN
質問者

お礼

ありがとうございます。 確かにその通りですね。 でもファイルを出力する時にはどうしたら良いですか? ファイルの途中までがASCII形式で途中からバイナリデータにするにはどうしたら良いですか?

関連するQ&A

  • 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にて対応したいと思っています。 宜しくお願い致します。

  • MIMEとバイナリデータの読み方

    バイナリファイルの中、MIME boundary1の後、ヘッダーの部分のXMLで書かれたテキストファイルあります。そのXMLヘッダー文をパースしたい。 バイナリファイルのほかのところにMIME boundary2の後バイナリ形式のデータあります。 Googleで調べたけど、なにかは見つかったけど、理解できず困っています。 バイナリファイルを一バイトづつ読んで、Integer.toHexString()を使うとASCIIの形でXMLの部分はそのまま (フォーマットなしで)、バイナリデータの分は化けた表示されます。 だいたいのアウトラインでよいです。やり方ご存知の方、教えてください。 (1)boundary1の後書かれたXML式データを読む方法 (2)boundary2の後、決まったキーワードが入っていたら、そこから決まったバイト数までのバイナリデータを読む方法 その決まったキーワードと決まったバイト数はヘッダーのXML内に書かれています。

    • ベストアンサー
    • Java
  • VBAでの構築の質問

    VBAの初心者ですが、データの抽出をしたいと考えています。 フォルダの中に、複数のテキストファイル形式のデータがあり、 その中にあるファイル毎の一部データのみ抽出できないかと考えております。 元データ(1)(テキストファイル形式) 10行目にあるデータ A TOKYO 20行目にあるデータ 100 200 1000 2000 (データの間には、スペースがあります。) 元データ(2)(テキストファイル形式) 10行目にあるデータ B Fukuoka 20行目にあるデータ 300 400 3000 4000 (データの間には、スペースがあります。) 編集後のデータは、それぞれのテキストデータ ・10行目データの2番目の抽出 ・20行目データの2番目の抽出 ・20行目データの4番目の抽出 を抽出できないかと考えています。 編集後データ(エクセルファイル形式に出力)は、下記のような感じできないかと考えてます。     (A列) (B列) (1行目)TOKYO Fukuoka (2行目)200 400 (3行目)2000 4000 皆さんからのご回答、 よろしくお願いいたします。

  • Excel内のデータに直接書き込むってやったことある人いますか?しかもバイナリで!!

    とあるツール(回路シミュレータSPICE)の出力データから1クリックでエクセルファイルに変換するツールを考えています。今のところデータ整理作業としては、 SPICE出力データ(倍精度バイナリデータ)=>Bin to 10進ASCII変換=>必要なデータを抽出=>エクセルファイルにコピペ=>保存(倍精度バイナリデータ) という感じで面倒かつ単調な作業が日々の暮らしになっています。でExcelの中身をバイナリエディタで眺めてみたところデータ管理はどうやらSPICE出力データと同じ倍精度バイナリデータで管理されているようでした。そこで、 SPICE出力データ(倍精度バイナリデータ)=>必要なデータを抽出=>エクセルファイルにコピペ(倍精度バイナリデータ)=>保存 てなことをやれないかと思ったわけです。しかしExcelファイル中身のフォーマットがどうなっているのか(セルの位置とかの管理)よくわからないのですが、何かいい方法とか資料とかはないでしょうか?分かる方いましたらよろしくお願いします。

  • EXCEL VBAで、バイナリデータの書き込み及び読み込みについて

    御世話になります。仕事でいきずまってしまったので助けて下さい。 今Excelvbaで、あるExcelファイルのデータを読み込んで、バイナリファイルとして出力するソフトを作ってるのですが、内部的にデータを構造体に一度格納して、一気にバイナリファイルに書き込む、もしくはその逆(バイナリファイルを読み込んで、一気に構造体に入れる)にはどうすればよいのでしょうか?apiのfailopenやvcを使えば出来るらしいのですがよくわかりません。vbaでは不可能なのでしょうか?どなたかご教授下さい。

  • VBAで複数ファイルからのデータ抽出を行いたい。

    すみません、知恵をお貸しください。 VBA初心者です。 一つの同じフォルダ内にあるエクセルの同じ形式の複数ファイル(*.xls)から、データを抽出し(例.A2:k2)一つのファイルを作成したいのですが、どうにか一行目だけを抽出することができました。 しかし、データ抽出をしたい複数ファイルの中には(A2:k2)だけではなく、複数行に渡りデータが入っているもの(A3:k3まで、やA5:k5までなど)があり、それら全てを抽出したいのです。 何らかの条件付けの上でループをさせればいいのかな?とも考えたのですが、うまくいきません。 どうかご教授お願いします。

  • バイナリーデータの一部データだけ変更する方法

    バイナリーデータの一部のデータを変更したいと考えています。 freadでファイルを読んでいった場合、初めからデータを読んでいくと思います。 途中のデータだけ変更する場合、freadで順に読んでいくしかないのでしょうか? もしくは別の有効な方法があるのでしょうか?

  • 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文字を取り出して・・・書き込む?ような感じなのですが それをプログラムに起こす書き方がわからず困っています。 申し訳ございませんが、ご教授よろしくお願いします。。。

  • バイナリデータの書込みについて

    こんにちは、初めまして。 さっそくなんですが、バイナリデータの操作を行っていて、ちょっと気になることがあり、質問させて頂きます。 現在あるバイナリデータファイルの読出しには成功し、一応思った通りに書込み、 そのデータは壊れず、読み出せたんですが・・・。 そのバイナリデータファイルは当然のように、アスキー型や文字型、ビッグエンディアンのshortやlongがバイト長ごとに入り混じってます。 アスキー型や文字型は問題なく読み書きできるんですが、 ビッグエンディアンのshortやlongを書き込む時、バイト長を指定してやると、データが壊れてしまいます。 例えば、2バイトのビッグエンディアンのshortを読み出して、そのままリスト値に変換をかけ、なにも加工することなく、再びバイナリ構造体に変換しても、データが壊れてしまいます。 例 失敗) INは読み出すファイル、OUTは書き込むファイル read (IN,$dataB,2); $dataA = unpack("n2",$dataB); $dataB2 = pack("n2",$dataA); print OUT $dataB2; 現在、packするときに、データ長をしてせず、*とすることでデータの書込みには成功してる(ちゃんと読めるデータとして)んですが、これから先、こういったデータを加工して書き込む場合、データ長を指定せずに書き込むというのは・・・。ちょっと嫌な感じです。 例 成功) INは読み出すファイル、OUTは書き込むファイル read (IN,$dataB,2); $dataA = unpack("n2",$dataB); $dataB2 = pack("n*",$dataA); print OUT $dataB2; 何が原因なのか、わからず困っています。 なにぶん素人なもので、やってること自体間違っているのかもしれませんが、どなたか御回答頂ければ幸いです。 ここに書いている質問の意図がわからない等、ありましたらその旨お答え頂ければ、私の知る限りお答えしようと思いますので、どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • バイナリーファイル読み書き

    現在あるクラスパスの通っているディレクトリーから バイナリーファイルを読み込み、書き込みを行おうとしております。 指定はフルパス形式ではなく、/sample/data/data.txt の様な形式で行います。 読み込みはFileInputStream、書き込みはFileOutputStreamにて 行います。通常のフルパス指定での読み書きを行える事は既に 確認済なのですが、上記の様な形式を読み込もうとするとエラーになります。 そこで、getResourceにより、ファイルを探索させて、得られたURLオブジェクトを 使用して読み書きを行いたいと思っておりますが、 どうしても、URLからFileOutputStreamあるいはFileInputStreamまでつながりません。 例えば、URLからURIに変換出来れば、その後FileクラスをURIから生成して、 FileOuputStream or FileInputStreamを生成する事が出来るのですが。。。 この例以外の方法でも構いません。よろしくお願いします。

専門家に質問してみよう