• ベストアンサー

引用符がある、またはない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

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

booooob
質問者

お礼

きちんとご説明せずに申し訳ありませんでした。 すでに別の回答の補足で書きましたが、 実は原因は別のところにありました。 これも私がエラー内容をお伝えしなかったために、 余計なお手間を取らせてしまったことになります。 重ね重ね申し訳ありませんでした。 今後質問は正確にするように気をつけたいと思います。 QueryTableを使う方法もあるのですね。 勉強になります。 後ほど試してみたいと思います。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 #3 のマクロは、最初が、Quatation マークをつけない、ID でも、可能です。

booooob
質問者

お礼

試しましたところ、IDの問題もクリアし、またダブルクォーテーションで囲まれたフィールドにカンマがあっても、問題なくデータを取り込めました。 完璧です! ありがとうございます。 ただ、お教えいただいたコードをカスタマイズしようと思いましたが、QueryTableの使い方がよく分かりませんでした。 いろいろな書籍をチェックしましたが、どれにもQueryTableについて詳しくふれられていませんでした。ウェブ上にも情報はないようです。 どうにかしてQueryTableの情報を入手して、 これからカスタマイズしたいと思っております。 このたびは誠にありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

booooob
質問者

お礼

いつもお世話になります。 説明不足でしたが、ダブルクォーテーションで囲まれたフィールドには、カンマが含まれている場合があります。従って、ご指摘の方法では難しいです。 ほかに何かよい方法がありましたら、ご教示下さい。 また、質問なのですが、下記のコードはダブルクォーテーションを外す働きをしているのでしょうか?「"」がひとつ多いので気になりました。 WorksheetFunction.Substitute(TextLine, """", "")

booooob
質問者

補足

問題が解決しました。 原因は別のところにありました。 SYLKエラーが出て開けなかった、引用符のないCSVファイルの一番最初のフィールドに、ID という文字が 入っていたのがいけなかったようです。 このIDという文字の前後だけにダブルクォーテーションを付けることで、問題なく開くことができました。 引用符のないCSVファイルも分岐処理をすることなく、 Workbooks.OpenText Filename:=myPath & fname, Comma:=True で開けました。 あとは、引用符のないIDという文字を、マクロでダブルクォーテーションを付けてから、開くようにすればよいので、 これで解決とさせていただきます。 みなさん、ありがとうございました。

noname#60992
noname#60992
回答No.1

一旦ファイルを読み込んでおいてvbaのファンクションを一つ作って、クォーテーションをはずすのではだめですか?

booooob
質問者

お礼

ダブルクオーテーションで囲まれたフィールドには、カンマが含まれている場合がありますので、ご指摘の方法では、難しいです。

関連するQ&A