プロが教える店舗&オフィスのセキュリティ対策術

カンマ区切りの複数の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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

QueryTableを使う方法もあるのですね。
勉強になります。
後ほど試してみたいと思います。

お礼日時:2005/11/28 12:05

こんにちは。



#3 のマクロは、最初が、Quatation マークをつけない、ID でも、可能です。
    • good
    • 0
この回答へのお礼

試しましたところ、IDの問題もクリアし、またダブルクォーテーションで囲まれたフィールドにカンマがあっても、問題なくデータを取り込めました。
完璧です!
ありがとうございます。

ただ、お教えいただいたコードをカスタマイズしようと思いましたが、QueryTableの使い方がよく分かりませんでした。
いろいろな書籍をチェックしましたが、どれにもQueryTableについて詳しくふれられていませんでした。ウェブ上にも情報はないようです。

どうにかしてQueryTableの情報を入手して、
これからカスタマイズしたいと思っております。

このたびは誠にありがとうございました。

お礼日時:2005/12/06 12:11

こんにちは。


結果がどうなるのか、ご質問では分りませんが、ダブル・クォーテーションがついてもつかなくても、同じようにするなら、以下のようにすればよいのではないでしょうか?
まあ、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という文字を、マクロでダブルクォーテーションを付けてから、開くようにすればよいので、
これで解決とさせていただきます。
みなさん、ありがとうございました。

補足日時:2005/11/28 11:34
    • good
    • 0
この回答へのお礼

いつもお世話になります。

説明不足でしたが、ダブルクォーテーションで囲まれたフィールドには、カンマが含まれている場合があります。従って、ご指摘の方法では難しいです。
ほかに何かよい方法がありましたら、ご教示下さい。

また、質問なのですが、下記のコードはダブルクォーテーションを外す働きをしているのでしょうか?「"」がひとつ多いので気になりました。
WorksheetFunction.Substitute(TextLine, """", "")

お礼日時:2005/11/27 21:51

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/27 21:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!