質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1838閲覧

データにChr(13) CRコードの改行を含むCSVのline inputの取り込み方法

HoneyCase

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/07/12 16:41

はじめに

仕事の効率化のためにたまに勉強しながらvbaでマクロを作ってます。
現状はコードを調べて切り貼りする程度の知識ですが、調べても見つからないため質問しました。

前提

VBAでcsvを読み込んでline inputで配列に入れようとしている段階でエラーがおこっています。

###原因
csv作成段階でwebフォームの入力によってセル内改行がChr(13)になったため
Chr(13)を参照して行を判断するline inputが誤動作してることがわかりました。

###試したこと
そこで、line inputをする前に開いたcsv内の該当フォームの箇所に存在するChr(13)をChr(10)へ書き換えることにしましたが
それにより今度はどうすればline inputが使えるようになるかわからなくなっています。

「Chr(13)やCRコードをデータに含むcsvのline inputの取り込み方法」なども調べましたが下記サイトくらいしか見つかりませんでした。

参考にしたサイト
https://tonari-it.com/vba-csv-camma/

csvの読み込みと配列への格納

VBA

1Sub test1() 2 Dim s_buf As String 3 Dim fname As String 4 Dim buf As String  5 6 7 Call new_file_check(fname) 'ダウンロードフォルダにある当日の日付が入った最新ファイルを参照 8 Open fname For Binary As #1 9 10 ReDim b_buf(1 To LOF(1)) 11 Get #1, 1, b_buf 12 Close #1 13 14 '読み込んだデータをUnicodeに変換 15 s_buf = StrConv(b_buf, vbUnicode) 16 Debug.Print s_buf 17 18 s_buf = replaceColon(s_buf) 19 Debug.Print s_buf 20 21'以下機能しない 22Do Until EOF(1) 23 24 Line Input #1, buf 25 26 Dim aryline As Variant '文字列格納用配列変数 27 aryline = Split(Replace(buf, """", ""), ",") '読み込んだ行を,切りで配列変数に格納 28 29 r = r + 1 30Loop 31 32End Sub

###""で囲まれた範囲内のChr(13)をChr(10)に置換

フォーム入力された箇所は""で囲われているためその範囲内の改行だけ直す

VBA

1Function replaceColon(ByVal str As String) As String 2 3Dim strTemp As String 4Dim quotCount As Long 5 6Dim l As Long 7For l = 1 To Len(str) 'strの長さだけ繰り返す 8 9 strTemp = Mid(str, l, 1) 'strから現在の1文字を切り出す 10 11 If strTemp = """" Then 'strTempがダブルクォーテーションなら 12 13 quotCount = quotCount + 1 'ダブルクォーテーションのカウントを1増やす 14 15 ElseIf strTemp = Chr(13) Then 'strTempがChr(13)なら 16 17 If quotCount Mod 2 <> 0 Then 'quotCountが2の倍数じゃないなら 18 19 str = Left(str, l - 1) & Chr(10) & Right(str, Len(str) - l) '現在の1文字をChr(10)に置き換える 20 21 End If 22 23 End If 24 25Next l 26 27replaceColon = str 28 29End Function 30

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

#1は読み込みを済ませてCloseしているのだから、
そのあとで Line Input #1, buf とされても困るのでは。
なので、上で準備した b_buf を使って処理をすればいいと思います。

VBA

1Dim strLine, aryLine 2For Each strLine In Split(s_buf, Chr(13)) 3 aryLine= Split(Replace(strLine , """", ""), ",") '読み込んだ行を,切りで配列変数に格納 4 'Call outputFunction(aryLine) 5Next

投稿2021/07/12 23:37

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HoneyCase

2021/07/13 01:43 編集

早速回答いただきありがとうございます。 おかげで解決できました。 line input s_buf,buf という書き方でエラーが出て#1などのファイル以外では出来ないのかなというのはなんとなく理解してました。 ですが私のコードですと#1の書き換えではなかったので#1をそこで呼び出しても結局再現元のままでline inputにどうやって繋げようかと考えが狭くなってました。 整理した後に [Chr(13)] で切って、再度 [,] で切れば再現できたのですね。 勉強になりました。ありがとうございます。
guest

0

###修正後の補足

実際に使用した時に私の環境(多分csv側?)では余計に1行多く空の行が作られ
処理の最後にエラーとなっていました。
確認したところ最後にはChr(10)のみの行が出来てたので、下記のように付け加えました。

VBA

1Dim strLine, aryLine 2 3For Each strLine In Split(s_buf, Chr(13)) 4if strLine = Chr(10) then Exit For 'Chr(10)だけならForを抜ける 5 aryLine= Split(Replace(strLine , """", ""), ",") '読み込んだ行を,切りで配列変数に格納 6 7'call hoge(aryline) 'arylineを使ってなんやかんやする 8 9Next 10

投稿2021/07/13 02:49

HoneyCase

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問