[[20210319134742]] 『[VBA] 改行が一部だけ認識されない』(ガパオライス) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『[VBA] 改行が一部だけ認識されない』(ガパオライス)

はじめまして。

今、見様見真似でVBAの練習をしています。
以下のコードで実行しているのですが、
特定の箇所が改行してあるのに同じセルに取り込まれてしまいます。

 Sub テキスト読み込み()

 Dim txt As String

 txt = Application.GetOpenFilename("text,*.txt")

 If txt = "False" Then
    Exit Sub
 End If
 Close #1

 Range("A:C").ClearContents
 Open txt For Input As #1

 Do Until EOF(1)
    Dim buf     As String
    Dim n       As Long
    Dim bufbuf  As Variant
    Dim i As Long

    Line Input #1, buf
    If buf <> "" Then
        bufbuf = Split(buf, vbTab) '読み込んだ行をタブ区切りで配列変数に格納

        For i = LBound(bufbuf) To UBound(bufbuf)
            Cells(n + 7, i + 1) = bufbuf(i)
        Next
        n = n + 1
    End If
 Loop

 Close #1

 End Sub

該当の事象が発生する箇所をコピペして別のtxtにして保存したら
なぜか改行を認識してくれて、下のセルに取り込めました。

コピペすると事象が発生しなくなるせいで、原因がわからなくなりました。
このような事象に心当たりの方はいらっしゃいませんか?
よろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


 多分そこだけ改行コードが違うのではないでしょうか

 このマクロでは、改行コードが CRLF (&H0D&H0A)か CR でないといけません
 問題のところは、LF だけになっているのだと想像します。

 バイナリで中身を見ることができるエディタがあれば、確認できると思うのですが。
(´・ω・`) 2021/03/19(金) 14:10

(´・ω・`)様
早速のご回答ありがとうございます。

>このマクロでは、改行コードが CRLF (&H0D&H0A)か CR でないといけません
なるほど…検索したらline inputの仕様なのですね。
まさか一部だけ改行コードが違うとは思っていませんでした。

出てきた回避方法を一度自分で読んで理解してみようと思います!
ありがとうございました!
(ガパオライス) 2021/03/19(金) 14:16


どうにかこうにかうまく取得することができるようになりました!
目的は達成できましたが、結構処理に時間がかかってしまうのが悩みです。。。
もしもっといい書き方があるよ、というのがあれば教えてください!勉強します!

 Sub txt読み込み()

 Dim txt As String

 txt = Application.GetOpenFilename("Text,*.txt")

 If txt = "False" Then
     Exit Sub
 End If
 Close #1

 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual

 Range("A:C").ClearContents
 Open txt For Input As #1

 Do Until EOF(1)
     Dim buf     As String
     Dim buf2  As Variant
     Dim i       As Long
     Dim j       As Long
     Dim n       As Long
     Dim buf3    As Variant

     Line Input #1, buf
     If buf <> "" Then

         buf2 = Split(buf, vbLf)

         If buf2(0) = buf Then
             For i = 0 To UBound(buf2)
                 buf3 = Split(buf2(i), vbTab)
             Next
             For i = 0 To UBound(buf3)
                 Cells(n + 7, i + 1) = buf3(i)
             Next
             n = n + 1
         Else
             For j = 0 To UBound(buf2)
                 Cells(n + 7 + j, 1) = buf2(j)
             Next
             n = n + 1 + j
         End If

     End If
 Loop

 Close #1

 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic

 End Sub
(ガパオライス) 2021/03/19(金) 16:17

 エクセルの機能があるなら、なるべくそれを使うのがいいです。
 マクロの記録をしてみるとどんなコードを書けばいいのかなんとなくわかります

 私は、2013で、365使ったことないので、
 テキストファイルウィザード とか、
 データの取得と変換 とか
 PowerQuery とかで検索してみてください。
(´・ω・`) 2021/03/19(金) 16:36

(´・ω・`)様
たびたびありがとうございます!
このコードの発展版(?)で早くする方法があるかと思いましたが
別のアプローチもあるのですね。
どれも聞いたことのない言葉なので、調べてみようと思います!
また壁にあたったら質問することもあるかもしれませんが、よろしくお願いいたします。
(ガパオライス) 2021/03/19(金) 16:43

 そういやFileSystemObjectのTextStreamならLF改行でも1行ずつ読込めたと思います。

(白茶) 2021/03/19(金) 16:51


(白茶)様
気づくのが遅れてしまいました…!
FSOならLFでも大丈夫かもしれないとのことで情報ありがとうございます。
FSOのことは全然知らないので、そちらも勉強してみようと思います。

ps.取得と変換で作業したらとても早くなりました。
オブジェクトの扱いに慣れていないので、PowerQueryの機能でできない部分を
上手く加工するのが大変ですが、少しづつ前に進めたらと思います。
ありがとうございました。
(ガパオライス) 2021/03/22(月) 10:26


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.