|
▼困り猫 さん:
>データ内に、記号"|"が含まれるCSVファイルをVBAでExcelファイルへ読み込むと、
> ●CSVデータ
> 1,3,8,0,1|5,9
> ↓VBAで読み込み↓
> ●Excelファイル
> 1,3,8,0,1,9
VBAで読み込むといっても 方法はいろいろあると思いますが、
「Input#ステートメントで」読み込むと、
>"|"以降のデータが勝手に削除されてしまいます。
↑ぼくも初めて経験しましたが、Input# はMS-DOSの時代からのファイル
読み込み法なので、読み方に独特の解釈があり、この独自の仕様が
あるときは 制約になります。
(例)
,1st Project,
↓
,1 , "Project" のように "1st" が数値として解釈され、
2項目データに分割される。
(以下同様で) "2nd Floor", "3rd Base", "4TH Statement" なども同様。
スペースが区切り記号になることも Input#ステートメントの特徴ですね。
>削除されずに、ありのままのデータを読み込む方法はございますでしょうか?
すべて文字列として配列に読み込めば、「1|5」が「1」になってしまうことは
避けられますが、全ての数値データも「文字列」データとしてセルに代入され
てしまうので、数値データ、文字列データ混在のときはVariant配列に
読み込んだほうがよくないですか?
Sub Example1()
Dim io As Integer
Dim Buf() As Byte
Dim v, vv, t
Dim i As Long, j As Long
Dim y As Long, x As Long
Dim myFile
myFile = Application.GetOpenFilename("CSVファイル,*.csv;*.txt")
If myFile = False Then Exit Sub
io = FreeFile()
Open myFile For Binary As io
ReDim Buf(1 To LOF(io))
Get #io, , Buf '全Text 読み込み(ShiftJIS)
Close io
v = StrConv(Buf(), vbUnicode) 'Unicodeに変換
v = Split(v, vbCrLf) '行に分割
y = UBound(v) '最終行
x = UBound(Split(v(0), ",")) '最終列
ReDim vv(y, x)
For i = 0 To y - 1
t = Split(v(i), ",")
For j = 0 To x
vv(i, j) = t(j) '列に分割
Next j
Next i
ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1) _
.Resize(y, x + 1).Value2 = vv
End Sub
それか、
拡張子が "*.csv" なら、Excelメニュー[ファイル]-[開く]で
単純に開く操作(のマクロ記録からVBAにする Workbooks.Open) とか、
既存のシートにインポートするなら、
[データ]-[外部データの取り込み]-[テキストファイルのインポート]
メニューを使ってインポートすればよいです。
後者の方法なら 列ごとの「データ型」が指定できますので、
文字列として読み込みたい列のデータ型を「テキスト」とか、
日付として読み込みたい列のデータ型を「YMD」とか、明示的に指定
することができます。(マクロ記録 → QueryTables.Add... )
|
|