- ベストアンサー
エクセルVBAでのファイル入力(GET)
1レコードのとあるテキストファイルがあります。 形式は、‘\’+「文字コード(HEX)」 の羅列です。 \20\20\20\20\20\31\32\33\34\35\36\37\38・・・ 目的としては、このファイルから\を取り除いて、データ項目別に 読み込み、文字に変換することです。 即ち、上記の例だと △△△△△12345678・・・ ←項目1→←項目2→ といった感じになります。(△:スペース) そこで、\を外した文字列をセットする際に、最初のコードでは うまくいかず、その後試してみながら結果的にはうまくいきました。 ですが、最初のコードでうまくいかなかった理由というのが理解 できません。 どこがおかしかったのでしょうか? ≪正常に行かなかったコード≫----------------- 'ファイルオープン Open(パス)For Binary Access Read As #FileNum '1つ分の項目のデータをGET For j = 1 To n Get #intFileNum, j , tempStr If tempStr <> "\" Then Str = Str & tempStr Else End If Next j ※これだと「tempStr」には何もセットされず、結果と して「Str」も空になってしまいます。 ≪正常に行ったコード≫---------------------- 'ファイルオープン&全てGET Open(パス)For Binary Access Read As #FileNum Get #FileNum, , Buff '1つ分の項目のデータを入力 For j = 1 To n tempStr = Mid(Buff, j , 1) If tempStr <> "\" Then retStr = retStr & tempStr Else End If Next j ※これだと正常に「tempStr」に文字がセットされます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 あてずっぽで回答しているのは失礼なので これでだめならやめますが、 tempStrを定義した時に、 Dim tempStr as String * 1 とか tempStr = String(1," ") の様にbyte数を明示的に示してみたらどうでしょうか?
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
GetやBinaryを使わなくても出きる例。 Sub test01() Open "c:\my documents\test03.txt" For Input As #1 Open "c:\my documents\test04.txt" For Output As #2 Line Input #1, a ' MsgBox a s = Split(a, "\") st = "" For i = 1 To UBound(s) n = Val(s(i)) st = st & Chr(16 * Int(n / 10) + (n Mod 10)) Next i MsgBox st Print #2,st Close #1 Close #2 End Sub メモ帳に\20\20\20\20\20\31\32\33\34\35\36\37\38を貼りつけ、test03.txtの名前で保存。 上記を実行。 「 12345678」になりました。 質問の正面からの答えでなくて済みません。質問者の方法は難しい方法になっている気がして。 質問のコードには Chr(16 * Int(n / 10) + (n Mod 10))に当たる部分が無いようですが、宜しいのでしょうか。
補足
ありがとうございます! 確かに、コードがすっきりしますね。 >質問のコードには Chr(16 * Int(n / 10) + (n Mod 10))に当たる部分が無いようですが、宜しいのでしょうか。 ここも自分でコードを組んでいるのですが、STEP数が3倍くらいあります。 なにせ、VAL関数の存在を今知りましたので・・・。 ちなみに、INPUTとGETは、どういう観点で使い分ければ良いのでしょうか?
- R_Moon
- ベストアンサー率60% (9/15)
#1で回答した者です。 すみません。今試す環境がないので予測で言ってるのですが、 「tempStrには何も入っていかない」というのは Str = Str & tempStr の部分での、tempStrでしょうか? Get #intFileNum, j , tempStr debug.print j,tempStr ← If tempStr <> "\" Then これでtempStrへの格納がわかると思いますが ここで何も入っていないとしたら、ごめんなさい。ちょっとわからないですね。
補足
度々、ありがとうございます。 そうなんです。 tempStrに何も格納されないのです。(String型の変数なのですが) なぜでしょう・・・?
- R_Moon
- ベストアンサー率60% (9/15)
ループの中で、 debug.print j,tempStr の一行を加えて、イミディエイトウインドで 見比べてみたらどうでしょうか? うまくいかなかった理由はすぐわかると思います。
補足
ありがとうございます。 最初、ステップインでひとつひとつ確認しても、やはりtempStrには何も入っていかなかったんです。 どこか根本的な構文が間違っているのかと思いまして・・・。
補足
ありがとうございます。 どちらの方法でも、うまく行きました。 1Byteの大きさの変数しかダメなんでしょうね。(おそらく)