- ベストアンサー
引用符がある、またはない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
- booooob
- お礼率79% (49/62)
- オフィス系ソフト
- 回答数4
- ありがとう数5
- みんなの回答 (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のファンクションを一つ作って、クォーテーションをはずすのではだめですか?
お礼
ダブルクオーテーションで囲まれたフィールドには、カンマが含まれている場合がありますので、ご指摘の方法では、難しいです。
関連するQ&A
- エクセル マクロ セルからファイルを読み込む?
いつもお世話になっています 早速ですが、フォルダー内のCSVファイルをシート2に書き出しているのですが その後、その部分(sheets2のa1から順に)を参照してファイルを開こうとするために Workbooks.Open(Filename:=myFile)を使用した場合カンマ区切りでは開かず羅列となるためWorkbooks.OpenTextをつかおうとしたのですが怒られてしまいます。 順次ファイルを読み込んで処理を自動で行い保存をして次のファイルと自動でフォルダー内を処理したいのですが その部分でつまってしまっています どうかよろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- ExcelのマクロでCSVファイルを開くと遅いのですが
ExcelのマクロでCSVファイルを開くと遅いのですが速く開く方法はありますか? 普通にファイル-開くに比べてかなり遅いです。 下記のVBAで記述してあります。 Workbooks.Open Filename:=fname ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close savechanges:=False
- ベストアンサー
- オフィス系ソフト
- EXCELにテキストファイルを読込むマクロ作成
EXCELにテキストファイルを「カンマ区切り」で読み込みしたいのですが、 下記マクロの内容ではカンマ区切りで正しくインポートされないのですが 作成方法ご伝授お願いいたします。 sub macro1() dim myFile as string myfile = application.getopenfilename(filefilter:="テキストファイル(*.txt),*.txt") if myfile = "False" then exit sub workbooks.opentext _ filename:=myfile, _ datatype:=xldelimited, _ textqualifier:=xltextqualifierdoublequote, _ tab:=true, _ comma:=true, _ space:=true ’予備 activeworkbook.worksheets(1).move before:=thisworkbook.worksheets(1) end sub
- ベストアンサー
- オフィス系ソフト
- VBAでのcsv読み込みについて
VBA初心者です。テキストファイル(ファイルの中はカンマ区切り)を別なEXCELシートではなくて、VBAを実行したEXCEL内のシート(例えばSheet2)に落としたいのですが、うまくいきません。 Workbooks.OpenText Filename:="C:\csv_test.txt", StartRow:=1, DataType:=xlDelimited, Comma:=True~ と記述すれば、別シートには落ちるのですが・・・。 簡単なことかもしれませんが、ご回答よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- Excel VBAでOpenTextのFieldInfoが効かない・・
Excel2000のVBAマクロで、CSVファイルを読み込んで マッチング処理をしたいと考えています。 CSVファイルはコードテーブルで参照のみ。 中身は、「コード,名前,区分」の配列になっております。 コードは"0012345"と"12345"は別物として扱いたいので 文字列として読み込む必要があります。 CSVファイルの中身は以下の感じです。 12345,名前1,区分1 0012345,名前2,区分2 0000022222,名前3,区分1 ... そこで、以下のようなコードを書いて見ました。 Sub OpenCSV() Workbooks.OpenText Filename:="C:\CSV.txt" _ DataType:=xlDelimited, Comma:=True, _ TextQualifier:=xlTextQualifierNone, _ FieldInfo:=Array(Array(1,2),Array(2,2), _ Array(3,2)) End Sub ところが開いたシートではコード部分が文字列として 取り込まれておらず、セルの書式も標準になっています。 FieldInfoの設定方法を変えて、 Sub OpenCSV() Dim tmpInfo(256) As Variant Dim i As Integer For i = 1 to 256 tmpInfo(i) = Array(i,2) Next Workbooks.OpenText Filename:="C:\CSV.txt" _ DataType:=xlDelimited, Comma:=True, _ TextQualifier:=xlTextQualifierNone, _ FieldInfo:=tmpInfo End Sub このようなコードにしたところ、「型が一致しない(エラー13)」というエラーになってしまいます。 結局、FieldInfoが効いてない動きなのですが、 どこが悪いのか皆目見当が付きません。 アドバイスを頂けますと幸甚です。
- 締切済み
- オフィス系ソフト
- ExcelのOpenTextで作ったシートのコピー
Excel2010のVBAでテキストファイルを読み込むと新しいブックに読み込まれるので、新しいブックのシートをVBAのコードがあるブックにコピーしたいのですが CSVファイル読み込み時に使う Workbooks.Open の場合には Dim wb As Workbook Set wb = Workbooks.Open(Filename:="C:\test\test1.csv") wb.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets("Sheet1").Range("A1") wb.Close False のような感じでコピーすることができたのですが テキストファイル読み込み時に使う Workbooks.OpenText の場合には Dim wb As Workbook Set wb = Workbooks.OpenText Filename:= _ "C:\test\test1.txt", _ Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _ , Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), _ Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2), Array(6, 2), Array(7, 2), Array(8, 2), _ Array(9, 2)), TrailingMinusNumbers:=True wb.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets("Sheet1").Range("A1") wb.Close False とすると、OpenTextの箇所で「Workbooks.OpenText Functionまたは変数が必要です」というコンパイルエラーが発生します。Set wb = Workbooks.OpenText (Filename:=・・・・True)のように括弧でくくっても同様のエラーがでてしまいます。 Microsoft Office 14.0 Object Libratyの参照設定はチェックされています。 Workbooks.OpenText Filename:= _・・・=Trueの部分はマクロの記録の機能で生成したコードです。 このような場合、どのように記述すればよいのでしょうか。 よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
- EXCELでテキストファイルを取込むマクロの作成
EXCELにテキストファイルを「カンマ区切り」で読み込みしたいのですが、 下記マクロの内容でデータはインポートされるのですが、 元のデータが悪いのか「読影日」と「検査日」の区切りが項目が別れてしまい 項目が二つほどずれてしまい正しくインポートされないのですが サンプル画面を添付いたします。 作成方法ご伝授お願いいたします。 sub macro1() dim myFile as string myfile = application.getopenfilename(filefilter:="テキストファイル(*.txt),*.txt") if myfile = "False" then exit sub workbooks.opentext _ filename:=myfile, _ datatype:=xldelimited, _ textqualifier:=xltextqualifierdoublequote, _ tab:=true, _ comma:=true, _ space:=true ’予備 activeworkbook.worksheets(1).move before:=thisworkbook.worksheets(1) end sub
- ベストアンサー
- オフィス系ソフト
- エクセルのマクロについて教えてください。
エクセルのマクロについて教えてください。 Dドライブのaaaというフォルダにある、何百個あるXLSファイルを開いて、カンマを取った後、CSVに保存したいです。 保存の名前はそのままで、拡張子だけをcsvに変えたいです。 エクセルは初級者レベルなのでプログラムも判らないのですが、自分で作ってみました。 Sub Macro20() ' ' Macro20 Macro ' マクロ記録日 : 2010/4/29 ユーザー名 : ' ' Keyboard Shortcut: Ctrl+e ' Application.ScreenUpdating = False '画面更新を一時停止 CChDir ("D:/aaa") 'フォルダー名取得 Filename = Dir(ThisWorkbook.Path & "\*.xls") 'フォルダ内のXLSファイルを検索 Do Until fname = Empty '全て検索 Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのファイルを開きwbとする。 n = n + 1 'カウントしnとする Workbooks.Open Filename:= _ "C:\Documents and Settings\Owner\My Documents\aaa\1.xls" Cells.Select Selection.NumberFormatLocal = "G/標準" ActiveWorkbook.SaveAs Filename:= _ "C:\Documents and Settings\Owner\My Documents\aaa\*.csv", FileFormat:=xlCSV, _ CreateBackup:=False fname = Dir 'フォルダ内の次のCSVファイルを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox n & "件を処理しましました。" End Sub ↓ 駄目でした>< アドバイスどうかお願い致します。
- 締切済み
- Visual Basic
- WSHで、EXCELにワークシートをCSVから読み込んで追加したい。
WSHを使って、EXCELを起動して、既存のCSVファイルからデータを読み込みたいのですが、複数のCSVから読み込むなどして、同じワークブックの新しいシートにCSVから読み込んだデータを追加していきたいのですが、どうやればよいのかわかりません。 下のソースのようにしたのですが、そうすると、別のワークブックとして開いてしまうので、わからなくなってしまいました。お願いします。 set Exl=CreateObject("Excel.Application") Exl.Visible=True Exl.workbooks.add Exl.workbooks.OpenText "c:\data.csv"
- ベストアンサー
- オフィス系ソフト
- テキストファイルのインポートが出来ません。
デスクトップの同じフォルダ内に a.txt を作成してファイルのインポートを行おうとしましたができません。なぜでしょうか? Sub TextFileOpen() Workbooks.OpenText Filename:="a.txt", _ DataType:=xlDelimited, _ comma:=True End Sub
- ベストアンサー
- Visual Basic
お礼
きちんとご説明せずに申し訳ありませんでした。 すでに別の回答の補足で書きましたが、 実は原因は別のところにありました。 これも私がエラー内容をお伝えしなかったために、 余計なお手間を取らせてしまったことになります。 重ね重ね申し訳ありませんでした。 今後質問は正確にするように気をつけたいと思います。 QueryTableを使う方法もあるのですね。 勉強になります。 後ほど試してみたいと思います。