• ベストアンサー

エクセル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」に文字がセットされます。

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

  • ベストアンサー
  • R_Moon
  • ベストアンサー率60% (9/15)
回答No.3

#1です。 あてずっぽで回答しているのは失礼なので これでだめならやめますが、 tempStrを定義した時に、  Dim tempStr as String * 1 とか  tempStr = String(1," ") の様にbyte数を明示的に示してみたらどうでしょうか?

orange777
質問者

補足

ありがとうございます。 どちらの方法でも、うまく行きました。 1Byteの大きさの変数しかダメなんでしょうね。(おそらく)

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

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))に当たる部分が無いようですが、宜しいのでしょうか。

orange777
質問者

補足

ありがとうございます! 確かに、コードがすっきりしますね。 >質問のコードには Chr(16 * Int(n / 10) + (n Mod 10))に当たる部分が無いようですが、宜しいのでしょうか。 ここも自分でコードを組んでいるのですが、STEP数が3倍くらいあります。 なにせ、VAL関数の存在を今知りましたので・・・。 ちなみに、INPUTとGETは、どういう観点で使い分ければ良いのでしょうか?

  • R_Moon
  • ベストアンサー率60% (9/15)
回答No.2

#1で回答した者です。 すみません。今試す環境がないので予測で言ってるのですが、 「tempStrには何も入っていかない」というのは     Str = Str & tempStr の部分での、tempStrでしょうか?   Get #intFileNum, j , tempStr   debug.print j,tempStr ←   If tempStr <> "\" Then これでtempStrへの格納がわかると思いますが ここで何も入っていないとしたら、ごめんなさい。ちょっとわからないですね。

orange777
質問者

補足

度々、ありがとうございます。 そうなんです。 tempStrに何も格納されないのです。(String型の変数なのですが) なぜでしょう・・・?

  • R_Moon
  • ベストアンサー率60% (9/15)
回答No.1

ループの中で、 debug.print j,tempStr の一行を加えて、イミディエイトウインドで 見比べてみたらどうでしょうか? うまくいかなかった理由はすぐわかると思います。

orange777
質問者

補足

ありがとうございます。 最初、ステップインでひとつひとつ確認しても、やはりtempStrには何も入っていかなかったんです。 どこか根本的な構文が間違っているのかと思いまして・・・。

関連するQ&A

専門家に質問してみよう