teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード追記

2021/09/21 15:31

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -8,4 +8,57 @@
8
8
  CSVの仕様にそったファイルなら問題なく取り込めると思います。
9
9
  ダブルクォーテーションで囲まれたカンマや改行は無視してくれます。
10
10
 
11
- 上記で正しく取り込めたら、マクロの起動で、同じ操作をしてVBAに変換して、それをもとに作成したらどうでしょう。
11
+ 上記で正しく取り込めたら、マクロの起動で、同じ操作をしてVBAに変換して、それをもとに作成したらどうでしょう。
12
+
13
+ ---
14
+ ファイルがCSVの仕様に沿ったものなら、上記の方法でうまくいくはずなんですが、
15
+ 自前のコードでいくなら、下記のような方針でいくといいでしょう。
16
+
17
+ 読み込んだテキスト全文のカンマを別の区切り文字(テキストに含まれていない文字)に置換する。ただし、引用符(")に囲まれている部分のカンマは置換しない。(自作関数)
18
+
19
+ その後、引用符(")を削除する(必要ならば)。
20
+
21
+ 後は、テキストをレコード区切り文字で分割して配列にする。
22
+ 今回のものだと行頭に#があるのでそれをレコード区切り文字とする。
23
+
24
+ レコード配列をループで順に読み込んで、置換した区切り文字で分割して配列にして、その配列をセル範囲に代入する。
25
+
26
+ 上記の方針で作成したコード例
27
+
28
+ ```vba
29
+ Sub csv_import3()
30
+ ’前略 ファイル読み込み処理
31
+
32
+ Dim buf As String
33
+ buf = .ReadText
34
+
35
+ 'カンマをセミコロンに置換
36
+ buf = ReplaceSeparator(buf, ",", ";")
37
+ buf = Replace(buf, """", "") '引用符(")を削除
38
+
39
+ Dim records, i As Long
40
+ records = Split(buf, "#") '#で分割して配列に
41
+ For i = 0 To UBound(records)
42
+ If i > 0 Then records(i) = "#" & records(i)
43
+ Dim items
44
+ items = Split(records(i), ";") ’セミコロンで分割して配列に
45
+ ’配列をセル範囲に代入
46
+ Worksheets(1).Cells(i + 1, 1).Resize(, UBound(items) + 1).Value = items
47
+ Next
48
+
49
+ '後略
50
+ End Sub
51
+
52
+ '引用符(")で固まれた部分以外の区切り文字を置換する
53
+ Function ReplaceSeparator(s As String, Separator1 As String, Separator2 As String) As String
54
+ Dim ary
55
+ ary = Split(s, """")
56
+
57
+ Dim i As Long
58
+ For i = 0 To UBound(ary) Step 2
59
+ ary(i) = Replace(ary(i), Separator1, Separator2)
60
+ Next
61
+
62
+ ReplaceSeparator = Join(ary, """")
63
+ End Function
64
+ ```