• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCELのVBAでEOFを誤認識)

EXCELのVBAでEOFの誤認識の解決方法

このQ&Aのポイント
  • EXCELのVBAでファイルからデータを読み込む際に、EOFが誤認識される問題が発生しています。この問題の解決方法を教えてください。
  • 読み込みファイルには見えない文字コードが存在し、それがEOFの誤認識を引き起こしています。コードを削除する方法を教えてください。
  • VBAのプログラムを修正し、EOFの誤認識を解決する方法を教えてください。また、問題の再現には添付されたサンプルプログラムを使用しています。

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

  • ベストアンサー
  • t-aka
  • ベストアンサー率36% (114/314)
回答No.3

815Bは<ー>を示しています。 その次の文字は<&>。これは8195となります。 当方の環境ではこれが表示されます。 実行時エラーの表示、申し訳ありません。 エラー内容から察するに、strRECには5文字しか格納されていないようです。 つまり・・・ 1文字目:" 2文字目:c 3文字目:c 4文字目:c 5文字目:ー 6文字目は存在していないのでエラーとなります。 Line Inputは一行単位で(厳密にはCr、あるいはCrLfまで)読み取ります。 5文字で読み取りが終了していることを考えると、 見えない何かは”Cr”や”CrLf”の可能性があります。 今回の場合、直感ですがCrの可能性があります。 この文字コードが邪魔しているため、正しく読み取れないものと考えます。 この場合、意図と違った結果が得られてしまいます。 検証方法として、以下のソースコードを試してみてください。 Dim fn As Integer fn = FreeFile() Dim testFile As String testFile = ActiveWorkbook.Path & "\loadtest.txt" Open testFile For Binary As #fn Dim sizeOfFile As Long sizeOfFile = LOF(fn) Dim stringBuffer As String stringBuffer = String(sizeOfFile, vbNullChar) Get #fn, , stringBuffer Close #fn Dim lineOfFile() As String lineOfFile() = Split(stringBuffer, vbCr) このとき、LineOfFileの配列数がどうなるか。 期待されるのは 0:"aaa","3" 1:"cccー&","4" 2:"bbb","5" ですが、症状から察すると 0:"aaa","3" 1:"cccー 2: 3:&","4" 4:"bbb","5" 3以降は必ずしもこうなるとは限りませんが・・・。 これに近いもの、と思います。 対応方法 対応1.このファイルを出力しているソフトの担当者に連絡する。 対応2.上記検証用コードを少し書き換える 前) lineOfFile() = Split(stringBuffer, vbCr) 後) lineOfFile() = Split(stringBuffer, vbCrLf) Dim i As Integer For i = 0 To UBound(lineOfFile) lineOfFile(i) = Replace(lineOfFile(i), vbCr, "") Cells(i, 1).Value = lineOfFile(i) Next i これで、希望に近い結果になるのではないでしょうか。

yamakiyo2
質問者

お礼

ありがとうございます!さすがです。頂いたプログラムで一行づつきちんと動きました。 EOFになることはなかったです。 一度読み込んで、改行で分割するんですね。なるほど勉強になりました。 ありがとうございました。 少し書き換えましたので一応、掲載しておきます。 ------------------------------ Option Explicit Sub testLoadFile() Dim fn As Integer fn = FreeFile() Dim testFile As String testFile = ActiveWorkbook.Path & "\loadtest.txt" Open testFile For Binary As #fn Dim sizeOfFile As Long sizeOfFile = LOF(fn) Dim stringBuffer As String stringBuffer = String(sizeOfFile, vbNullChar) Get #fn, , stringBuffer Close #fn Dim lineOfFile() As String lineOfFile() = Split(stringBuffer, vbCr) Dim i As Integer Dim curWS As Worksheet Set curWS = Worksheets("Sheet1") For i = 0 To UBound(lineOfFile) lineOfFile(i) = Replace(lineOfFile(i), vbCr, "") curWS.Cells((i + 1), 1).Value = lineOfFile(i) Next i End Sub

その他の回答 (2)

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

コマンドプロンプト開いて、DEBUGでDUMPしてみるとか。 >debug 「そのファイルテキスト」[Enter] -d [Enter]で16進ダンプを表示できます。 #OSは何だろう?XPだとDEBUGは動きます。

yamakiyo2
質問者

補足

連絡ありがとうございます。 OSはWindows8.1なので、DOSコマンドプロンプトでdebugはダメでした。 VectorでHexダンプが見れるツールをダウンロードしてみたら、問題のコードは"1A"になっていました。 ネットで調べると、 SUB substitute 置き換え ファイルを一行づつ読み込む前にどのように変換するべきか、VBAでどのように記載すべきか ご教授頂けると幸いです。 よろしくお願いします。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

ソースコードの変更の前に現状を確認します。 質問者様とバージョンが異なるかもしれませんが、 Ver2.1.1.1のさくらエディタをダウンロード、セットアップしてみました。 ウィンドウの右下に文字コードが表示されています。 ここで文字コードそのものの判別は可能です。 VBAでは、SJISで読み込もうとします。 例えば、テキストファイルがUTF-8などSJIS以外の場合、 テキストファイルに日本語など2バイト文字が含まれていると エンコードに失敗してしまい、情報の欠落が発生します。 SJISの場合であれば、何かしかの制御コードが含まれている可能性があります。 2行目の内容を読み込んだ時 msgbox Hex(Asc(Mid(strREC, 5, 1))) (ダブルクォーテーションが含まれている場合は5→6) とするとアスキーコードが判明します。 cの場合は、63と表示されます。 Cの場合は、43と表示されます。

yamakiyo2
質問者

補足

早々の提案ありがとうございます。 教えて頂いた方法で実施すると"815B"と表示されました。 5→6にするとエラー(プロシージャの呼び出し又は引数が不正)になりました。 ということは815BがEOFをなっているコードになりますでしょうか? プログラム内の Line Input #intFF, strREC で一行づつ読み込む前に何か手だてはありますでしょうか? すみませんが、ご教授方よろしくお願いします。

関連するQ&A

専門家に質問してみよう