回答編集履歴

1

コード追記

2021/09/21 15:31

投稿

hatena19
hatena19

スコア33620

test CHANGED
@@ -19,3 +19,109 @@
19
19
 
20
20
 
21
21
  上記で正しく取り込めたら、マクロの起動で、同じ操作をしてVBAに変換して、それをもとに作成したらどうでしょう。
22
+
23
+
24
+
25
+ ---
26
+
27
+ ファイルがCSVの仕様に沿ったものなら、上記の方法でうまくいくはずなんですが、
28
+
29
+ 自前のコードでいくなら、下記のような方針でいくといいでしょう。
30
+
31
+
32
+
33
+ 読み込んだテキスト全文のカンマを別の区切り文字(テキストに含まれていない文字)に置換する。ただし、引用符(")に囲まれている部分のカンマは置換しない。(自作関数)
34
+
35
+
36
+
37
+ その後、引用符(")を削除する(必要ならば)。
38
+
39
+
40
+
41
+ 後は、テキストをレコード区切り文字で分割して配列にする。
42
+
43
+ 今回のものだと行頭に#があるのでそれをレコード区切り文字とする。
44
+
45
+
46
+
47
+ レコード配列をループで順に読み込んで、置換した区切り文字で分割して配列にして、その配列をセル範囲に代入する。
48
+
49
+
50
+
51
+ 上記の方針で作成したコード例
52
+
53
+
54
+
55
+ ```vba
56
+
57
+ Sub csv_import3()
58
+
59
+ ’前略 ファイル読み込み処理
60
+
61
+
62
+
63
+ Dim buf As String
64
+
65
+ buf = .ReadText
66
+
67
+
68
+
69
+ 'カンマをセミコロンに置換
70
+
71
+ buf = ReplaceSeparator(buf, ",", ";")
72
+
73
+ buf = Replace(buf, """", "") '引用符(")を削除
74
+
75
+
76
+
77
+ Dim records, i As Long
78
+
79
+ records = Split(buf, "#") '#で分割して配列に
80
+
81
+ For i = 0 To UBound(records)
82
+
83
+ If i > 0 Then records(i) = "#" & records(i)
84
+
85
+ Dim items
86
+
87
+ items = Split(records(i), ";") ’セミコロンで分割して配列に
88
+
89
+ ’配列をセル範囲に代入
90
+
91
+ Worksheets(1).Cells(i + 1, 1).Resize(, UBound(items) + 1).Value = items
92
+
93
+ Next
94
+
95
+
96
+
97
+ '後略
98
+
99
+ End Sub
100
+
101
+
102
+
103
+ '引用符(")で固まれた部分以外の区切り文字を置換する
104
+
105
+ Function ReplaceSeparator(s As String, Separator1 As String, Separator2 As String) As String
106
+
107
+ Dim ary
108
+
109
+ ary = Split(s, """")
110
+
111
+
112
+
113
+ Dim i As Long
114
+
115
+ For i = 0 To UBound(ary) Step 2
116
+
117
+ ary(i) = Replace(ary(i), Separator1, Separator2)
118
+
119
+ Next
120
+
121
+
122
+
123
+ ReplaceSeparator = Join(ary, """")
124
+
125
+ End Function
126
+
127
+ ```