- ベストアンサー
引用符がある、またはないCSVファイルをExcelマクロで開くには?
カンマ区切りの複数の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
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >ダブルクォーテーションで囲まれたフィールドには、カンマ >が含まれている場合があります。従って、ご指摘の方法では難しいです。 そういうことは、最初に言ってほしかったですね。後だしの条件というのは、回答者にとって、一番、やりにくいものです。例えば、このようなテキストだと説明してくだればよかったと思います。 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
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #3 のマクロは、最初が、Quatation マークをつけない、ID でも、可能です。
お礼
試しましたところ、IDの問題もクリアし、またダブルクォーテーションで囲まれたフィールドにカンマがあっても、問題なくデータを取り込めました。 完璧です! ありがとうございます。 ただ、お教えいただいたコードをカスタマイズしようと思いましたが、QueryTableの使い方がよく分かりませんでした。 いろいろな書籍をチェックしましたが、どれにもQueryTableについて詳しくふれられていませんでした。ウェブ上にも情報はないようです。 どうにかしてQueryTableの情報を入手して、 これからカスタマイズしたいと思っております。 このたびは誠にありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 結果がどうなるのか、ご質問では分りませんが、ダブル・クォーテーションがついてもつかなくても、同じようにするなら、以下のようにすればよいのではないでしょうか? まあ、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
お礼
いつもお世話になります。 説明不足でしたが、ダブルクォーテーションで囲まれたフィールドには、カンマが含まれている場合があります。従って、ご指摘の方法では難しいです。 ほかに何かよい方法がありましたら、ご教示下さい。 また、質問なのですが、下記のコードはダブルクォーテーションを外す働きをしているのでしょうか?「"」がひとつ多いので気になりました。 WorksheetFunction.Substitute(TextLine, """", "")
補足
問題が解決しました。 原因は別のところにありました。 SYLKエラーが出て開けなかった、引用符のないCSVファイルの一番最初のフィールドに、ID という文字が 入っていたのがいけなかったようです。 このIDという文字の前後だけにダブルクォーテーションを付けることで、問題なく開くことができました。 引用符のないCSVファイルも分岐処理をすることなく、 Workbooks.OpenText Filename:=myPath & fname, Comma:=True で開けました。 あとは、引用符のないIDという文字を、マクロでダブルクォーテーションを付けてから、開くようにすればよいので、 これで解決とさせていただきます。 みなさん、ありがとうございました。
一旦ファイルを読み込んでおいてvbaのファンクションを一つ作って、クォーテーションをはずすのではだめですか?
お礼
ダブルクオーテーションで囲まれたフィールドには、カンマが含まれている場合がありますので、ご指摘の方法では、難しいです。
お礼
きちんとご説明せずに申し訳ありませんでした。 すでに別の回答の補足で書きましたが、 実は原因は別のところにありました。 これも私がエラー内容をお伝えしなかったために、 余計なお手間を取らせてしまったことになります。 重ね重ね申し訳ありませんでした。 今後質問は正確にするように気をつけたいと思います。 QueryTableを使う方法もあるのですね。 勉強になります。 後ほど試してみたいと思います。