カンマ区切りの複数のCSVファイルがあります。
ファイルによって、引用符がダブルクォーテーションであるものと、引用符がないものがあります。
1つのファイルの中では、引用符は統一されています。
この複数のCSVファイルをマクロで1つのExcelファイルにまとめたいと思います。
そこで、CSVファイルを一つ一つExcelで開いて、データをコピー&ペーストしたいのですが、
引用符の違いによって分岐させる処理がうまく動きません。
分岐処理は下記のようにしました。
アドバイスをお願いいたします。
On Error GoTo err1
Workbooks.OpenText Filename:=myPath & fname, Comma:=True
err1:
Workbooks.OpenText Filename:=myPath & fname, textqualifier:=xlTextQualifierNone, Comma:=True
No.3ベストアンサー
- 回答日時:
こんにちは。
>ダブルクォーテーションで囲まれたフィールドには、カンマ
>が含まれている場合があります。従って、ご指摘の方法では難しいです。
そういうことは、最初に言ってほしかったですね。後だしの条件というのは、回答者にとって、一番、やりにくいものです。例えば、このようなテキストだと説明してくだればよかったと思います。
1122,"猿,犬",,,25,"1,000,000","1,000"
内容的には分らないのですが、きめうちで可能な方法としては、QueryTableを使います。たぶん、これでいけるのではないかと思います。QueryTableのフォーマットを残さないので、一般のテキスト・インポートと同じに扱われます。
Sub QueryTableSplit()
Dim FileName As String
FileName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & FileName, Destination:=Range("A1"))
.RefreshOnFileOpen = False
.RefreshStyle = xlOverwriteCells '上書き設定
.AdjustColumnWidth = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileSpaceDelimiter = True
.TextFileConsecutiveDelimiter = True
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileTabDelimiter = True
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
End With
ActiveSheet.UsedRange.QueryTable.Delete
End Sub
きちんとご説明せずに申し訳ありませんでした。
すでに別の回答の補足で書きましたが、
実は原因は別のところにありました。
これも私がエラー内容をお伝えしなかったために、
余計なお手間を取らせてしまったことになります。
重ね重ね申し訳ありませんでした。
今後質問は正確にするように気をつけたいと思います。
QueryTableを使う方法もあるのですね。
勉強になります。
後ほど試してみたいと思います。
No.4
- 回答日時:
こんにちは。
#3 のマクロは、最初が、Quatation マークをつけない、ID でも、可能です。
試しましたところ、IDの問題もクリアし、またダブルクォーテーションで囲まれたフィールドにカンマがあっても、問題なくデータを取り込めました。
完璧です!
ありがとうございます。
ただ、お教えいただいたコードをカスタマイズしようと思いましたが、QueryTableの使い方がよく分かりませんでした。
いろいろな書籍をチェックしましたが、どれにもQueryTableについて詳しくふれられていませんでした。ウェブ上にも情報はないようです。
どうにかしてQueryTableの情報を入手して、
これからカスタマイズしたいと思っております。
このたびは誠にありがとうございました。
No.2
- 回答日時:
こんにちは。
結果がどうなるのか、ご質問では分りませんが、ダブル・クォーテーションがついてもつかなくても、同じようにするなら、以下のようにすればよいのではないでしょうか?
まあ、Excelで扱う範囲なら、WorksheetFunction で処理してしまえばよいでしょうね。そうでなければ、Replace 関数を使ってください。
Sub OpenCSVFile()
Dim myArray() As String
Dim FileName As String
Dim TextLine As String
Dim FileNo As Integer
Dim i As Long
FileName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")
FileNo = FreeFile()
If FileName <> "False" Then
Open FileName For Input As #FileNo
Do While Not EOF(FileNo)
Line Input #FileNo, TextLine
i = i + 1
If Len(TextLine) > 1 Then
TextLine = WorksheetFunction.Substitute(TextLine, """", "")
myArray = Split(TextLine, ",")
Cells(i, 1).Resize(, UBound(myArray) - LBound(myArray) + 1) = myArray
End If
Loop
End If
Close #FileNo
End Sub
この回答への補足
問題が解決しました。
原因は別のところにありました。
SYLKエラーが出て開けなかった、引用符のないCSVファイルの一番最初のフィールドに、ID という文字が
入っていたのがいけなかったようです。
このIDという文字の前後だけにダブルクォーテーションを付けることで、問題なく開くことができました。
引用符のないCSVファイルも分岐処理をすることなく、 Workbooks.OpenText Filename:=myPath & fname, Comma:=True で開けました。
あとは、引用符のないIDという文字を、マクロでダブルクォーテーションを付けてから、開くようにすればよいので、
これで解決とさせていただきます。
みなさん、ありがとうございました。
いつもお世話になります。
説明不足でしたが、ダブルクォーテーションで囲まれたフィールドには、カンマが含まれている場合があります。従って、ご指摘の方法では難しいです。
ほかに何かよい方法がありましたら、ご教示下さい。
また、質問なのですが、下記のコードはダブルクォーテーションを外す働きをしているのでしょうか?「"」がひとつ多いので気になりました。
WorksheetFunction.Substitute(TextLine, """", "")
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/07/01 12:54
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- XML エクセルのマクロについて教えてください。 3 2023/02/06 09:06
- Visual Basic(VBA) エクセルのマクロについて教えてください 物件ごとのフォルダを作成してます そのフォルダ内にサブフォル 2 2023/07/02 17:58
- Excel(エクセル) エクセル2019でPDFファイル名に枝番号をつけたい。 アクティブワークシートを印刷した後の処理とし 4 2023/06/06 21:00
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access インポート
-
アクセスでcsvに出力した際、頭...
-
100万行のCSVを10万行ずつのフ...
-
【CSVファイル】先頭の文字列に...
-
ファイル名が同じ場合自動的に...
-
タブ区切りデータからダブルコ...
-
Access95のエクスポートで教え...
-
CVS形式とは?
-
csvファイルが保存すると数...
-
アクセスがインポートできる容...
-
ThunderbirdのメールをCSVでま...
-
エクセルデータをテキストファ...
-
sqlldrのフィールドの属性について
-
Access2007のエキスポートについて
-
CSVファイルのセルに「01」と入...
-
accessで項目内の文字を自動改...
-
共有フォルダに誰が何にアクセ...
-
Accessのmdbを開こうとしたとき...
-
#1062 - '0' は索引 'PRIMARY' ...
-
【Excel】[Expression.Error] ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【CSVファイル】先頭の文字列に...
-
100万行のCSVを10万行ずつのフ...
-
TXTで作成したファイルをDATフ...
-
アクセスでcsvに出力した際、頭...
-
タブ区切りデータからダブルコ...
-
ThunderbirdのメールをCSVでま...
-
Access インポート
-
csvファイルが保存すると数...
-
Access2007のエキスポートについて
-
カンマがデータとして入ってるC...
-
Excelデータをテキストファイル...
-
アクセスがインポートできる容...
-
accessで項目内の文字を自動改...
-
Accessでdatファイルのインポート
-
Access95のエクスポートで教え...
-
エクセルデータをテキストファ...
-
ファイル名が同じ場合自動的に...
-
TSVのファイルをACCESSにインポ...
-
CSVファイルのセルに「01」と入...
-
sqlldrのフィールドの属性について
おすすめ情報