• ベストアンサー
  • 困ってます

Excel : OpenTextメソッドが正常に動作しないのはなぜ?

下記のようなマクロを作りました。 Sub sample() FileName = ThisWorkbook.Path & "\test.txt" Workbooks.OpenText FileName:=FileName, Comma:=True ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlCSV ActiveWorkbook.Close End Sub test.txt には次のテキストが書かれています。 "あ"," あ " 上記のマクロを実行すると、テキストの中身は次のようになってしまいます。 """あ"",""",あ,"""" 本来であれば、テキストの内容には変化が全くないはずだと思います。 原因が不明なのですが、マクロの動作確認をしたところ、 OpenTextメソッドでテキストを開いたときにすでに、 カンマの位置で区切られてセル内に入っていませんでした。 どのようにすればOpenTextメソッドは希望する動作をしてくれるのでしょうか?

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数1143
  • ありがとう数2

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

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

>つまり、引数を省いたとしても、Wendy02さんの >コードと同じ動きをするはずなのではないでしょうか? >ただ、実際には省いたことにより問題が生じましたので、 >引数は必ず明記すると認識を改めた方がよいのでしょうか? これは、失敗した人だけが分かることかもしれませんね。 デフォルトで、省略すればよいはずだ、というのは、私も知っております。ヘルプでも省略可能となっていますね。今回は、マクロは、同じブックで行っているのでやむをえないのですが、仮に新規でも、この部分は、誤動作しやすいのです。 Excelのワークシート側のメソッドには、癖の悪いものや、現行のVBAとは違う匂いのするものがいくつかあります。同類のQueryTable も同じです。ものすごく便利なのですが、本来、VBAのネイティブと整合性が悪いのでは、と疑ってしまいます。ここらは、Version によって、オプションが違うことがありますが、それを除いた最低限の部分は、省略できません。 だから、#2の最後に私が触れたのは、OpenTextや、QueryTable は、簡単でものすごく便利なのですが、私は、使うのにためらいがあります。出来るだけ他の方法を考えたりします。本来は、Office VBAのネイティブで済ませるのが、良いと個人的には思っています。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ヘルプに書かれていることは間違いないと思い込んでいたので、問題の原因が全くわからず、ほぼ一日泥沼にはまっておりました。 引数の省略で誤動作しやすいことが分かり、 もやもやしていた頭が一気にクリアになりました。 とても有益な情報をお教えいただき、誠に、誠にありがとうございました!

関連するQ&A

  • 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の部分はマクロの記録の機能で生成したコードです。 このような場合、どのように記述すればよいのでしょうか。 よろしくお願いします。

  • (VBA)書式が変更されてしまいます

    ↓SaveAsで保存すると書式が変更されてしまいます。 ActiveWorkbook.SaveAs FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close False ネットで↓の回避策を見つけたのですがうまくいきません。 **************************************************************** Sub CSV_Save() 'Sheet1をCSV形式で保存します。 With ActiveWorkbook.Sheets(1) 'A1:A10まで日付あるいは通貨設定のデータが入っているとします。 For Each rng In Range("A1:A10") 'テキスト文字列に変更します。 rng.Value = "'" & rng.Text Next rng End With ActiveWorkbook.SaveAs FileName:="C:\test.csv", FileFormat:=xlCSV End Sub **************************************************************** ご指導お願いします。

その他の回答 (2)

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

>本来であれば、テキストの内容には変化が全くないはずだと思います。 >どのようにすればOpenTextメソッドは希望する動作をしてくれるのでしょうか? 何をしようとしているのか、コードだけでは、本来の目的が分かりません。 ただ、コードだけを見ると、もしかしたら、元のコードは、記録マクロで取っていませんか? OpenTextメソッドで TextQualifier の部分を抜いても、本来、デフォルトでは、入るようになっていますが、わざわざ、設定を変えいたりすると、問題のような状態になると思います。 Sub sampleRevised() Dim FileName As String FileName = ThisWorkbook.Path & "\test.txt" Workbooks.OpenText FileName:= _     FileName, _     StartRow:=1, _     DataType:=xlDelimited, _     TextQualifier:=xlDoubleQuote, _     ConsecutiveDelimiter:=False, _     Comma:=True Application.DisplayAlerts = False  ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlCSV Application.DisplayAlerts = True  ActiveWorkbook.Close False      End Sub 本来の目的、"" (Quatation Marks)を取るためでしたら、私は、上記のようなコードは書きませんが、一応、元のコードを直したら、以上のようになるように思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

DataType:=xlDelimited を追加しましたら、 正常に動作するようになりました。 ありがとうございました。 私はコードが見やすいように、 省略可能な引数はすべて省いていました。 省いた場合の設定は、DataType は xlDelimited となると認識しています。 つまり、引数を省いたとしても、Wendy02さんの コードと同じ動きをするはずなのではないでしょうか? ただ、実際には省いたことにより問題が生じましたので、 引数は必ず明記すると認識を改めた方がよいのでしょうか?

  • 回答No.1
  • salf
  • ベストアンサー率42% (27/64)

質問の意味がよくわからないのですが、「,」で区切られたくないのですか? それとも「"」の数が増えているのが問題なのですか? 「,」で区切られたくないというのであれば、[Comma=:True]を[Comma:=Faluse]へ変更すれば区切られなくなります。

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご回答ありがとうございます。 「,」では区切られたいです。 問題となっているのは、下記のようにテキストの内容が変化してしまっていることです。 "あ"," あ "  ↓ """あ"",""",あ,"""" つまり、「"」と「,」の数は増えて欲しくありません。 特に、カンマの数が増えてしまうと、あとでデータベースに取り込む際に、 希望する形でデータが取り込まれません。 質問で提示したマクロは、実際にそのまま使用するものではなく、 問題点を分かりやすくするために簡略化したものです。 実際に使用する際には、OpenTextメソッドでテキストを開いた際に、 列ごとに別々の文字置換処理を施します。

関連するQ&A

  • ExcelのマクロでCSVファイルを開くと遅いのですが

    ExcelのマクロでCSVファイルを開くと遅いのですが速く開く方法はありますか? 普通にファイル-開くに比べてかなり遅いです。 下記のVBAで記述してあります。 Workbooks.Open Filename:=fname ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close savechanges:=False

  • VB:Excelのデータを、区切りなしのtextファイルで出力したい

    Dim AA, BB As String AA = "Sheet1" BB = "C:\test.txt" Sheets(AA).Select ActiveWorkbook.SaveAs Filename:=BB, FileFormat:=xlUnicodeText 「FileFormat:=xlUnicodeText」 ここの指定を変更すればいいように思うのですが、区切り無しのデータにするにはどうしたらいいのでしょうか。 たとえば、    A  B  C  D 1  か  し あ  あ こういうデータを、 「かしああ」のように、区切り無しでファイルに出力したいのです。

  • EXCEL確認メッセージを出さずに保存したい

    恐れ入りますが、ご教示お願い致します。 質問(1) EXCELファイルを (1)特定の名前で (2)CSVファイルにして 保存をしたいと考えています。次のマクロを書いたところ、”CSVへの変更を保存しますか?”確認メッセージがでます。 確認メッセージを出さずに、保存するためには、どのように記述したらよいでしょうか? With ActiveWorkbook .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal, FileFormat:=xlCSV .Close End With (2)改行するためにはどうしたらよいでしょうか? .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal, FileFormat:=xlCSV を、次のように改行させたいのです。 .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal,      FileFormat:=xlCSV _ を使うということを、なんとなく覚えておりますが、うまくいきません。注意点等をご教示頂ければと思います。 以上 よろしくお願い致します。

  • テキストファイルのインポートが出来ません。

    デスクトップの同じフォルダ内に a.txt を作成してファイルのインポートを行おうとしましたができません。なぜでしょうか? Sub TextFileOpen() Workbooks.OpenText Filename:="a.txt", _ DataType:=xlDelimited, _ comma:=True End Sub

  • エクセルと同じファイル名でcsvを作成するマクロ

    エクセルからCSVファイルをYYMMDD付でマクロを使って 作ろうとしていますが拡張子の「.xls」がどうしても残ってしまいます。 例えば、「test.xls」が「test.xls070326.csv」のように。 これを「test070326.csv」とするにはどうしたらよいでしょう。 今のコードはつぎのようにしています。 Sub test1() Dim flname As Variant Dim wb As Workbook flname = ActiveWorkbook.Name + CStr(Format(Date, "yymmdd")) ActiveSheet.Copy ActiveSheet.SaveAs Filename:=flname, _ FileFormat:=xlCSV ActiveWindow.Close savechanges:=False ActiveWorkbook.Close End Sub これでもCSVとしては使えるのですが、気持ちがすっきりしません。 どなたか正解をお願いします。

  • Excel2007 実行時エラー1004

    宜しくお願い致します。 Excel2003環境時に作成したマクロを2007環境で動作させると実行時エラー1004が返ってきます。 対策をお教えいただきたくお願いします。 (1)Excelで表作成 (2)作成した表を所定パスにText形式で保存するマクロを実行  【Excel2003でのソース】 ActiveWorkbook.SaveAs filename:=(ファイルパス) & ".txt" _ , FileFormat:=xlText (3)FileFormatの箇所で実行時エラー1004(SaveAsメソッドは失敗) Excel2007で上記部分に下位互換市内部分が含まれているのだとおもいますが、対策が全く分かりません。 お知恵をお借りしたくお願いします。

  • エクセルのマクロでテキストを生成すると日付の表示書式が変わってしまう

    エクセルのシートをマクロを実行してテキストファイルを生成します。 マクロの記述は以下の通りです。 保存 ChDir "C:\Documents and Settings\All Users\デスクトップ" ActiveWorkbook.SaveAs Filename:= _ "C:\Documents and Settings\All Users\デスクトップ\YA-SWK.txt", FileFormat:= _ xlCSV, CreateBackup:=False '終了 Application.Quit End Sub 元データのエクセルのシートに「2006/9/1」と入力されているセルがあるのですが、マクロを実行して生成されたテキストファイルでは「9/1/2006」と日付の表示順序が変わってしまいました。 この原因は何であるのかつかめません。 よろしくお願いします。

  • エクセルのマクロ

    あるエクセルのブック内のシートをdドライブに自動的にunicodeのタブ区切りテキストで保存するマクロを作成しています。コードは for i = 1 to 10 Sheets(i).Select f_name = "d:\" + Trim(Str(i)) + ".txt" ActiveWorkbook.SaveAs Filename:=f_name,_ FileFormat:=xlUnicodeText, CreateBackup:=False next i こんな感じです。 しかしこれを実行するとイルカが 'aaa.txt'にアクセスできません。ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。または、サーバー上に保存されているドキュメントから応答がありません。 と言うメッセージを出し、そこでキャンセルボタンを押すと 実行時エラー'1004': 'SaveAs'メソッドは失敗しました。'_Workbook'オブジェクト というメッセージが出ます。さらにデバックを押すと、プログラムコードの ActiveWorkbook.......の行で止まります。 環境はwindows2000、excel2000です。 何か足りないコードがあるのでしょうか? よろしくお願いします。

  • 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

  • エクセルファイル(book)のシートの内容をCSVファイルにおとしたい

    こんにちは。 VB初心者です。 実はVBではなく、Excel VBAで行なっているのですが。 ここに質問していいかもよく分かってないのですが。 プログラムの処理としては、あるBookのシートの内容を 別のCSVファイルとして生成したいのです。マクロを組んだのですが、一つ問題があって困っています。 問題: 生成したCSVファイルが一度Window上に表示されて (それはいいのですが、あとで閉じますから) 以下の確認メッセージがでてしまいます。 「outFile.csvはExcel97のファイル形式では、ありません。変更を保存しますか?」 要はプログラムがここで、一旦ユーザアクションを要求してしまうのです。 アクションなしに普通に終了させたいのですが。 マクロではなくVBだったらこんなことはならないのでしょうか? 初心なのでよく分かりません。 もしくはもっとほかの簡単なコードできるのでしょうか。 以下にコードを記述します。 Sub OutFile() Dim myWBpath As String myWBpath = ActiveWorkbook.Path Workbooks.Open FileName:=myWBpath & "\testData1.xls" Sheets("sheet1").Select ActiveWorkbook.SaveAs FileName:="C:\outFile.csv", _ FileFormat:=xlCSV, CreateBackup:=False ActiveWorkbook.Close End Sub