Excel2010 VBAでテキストファイル読込

このQ&Aのポイント
  • Excel2010 VBAでテキストファイルを読み込む際、一部のデータが誤変換される問題が発生しています。
  • マクロを使用せずにテキストファイルウィザードを使うと正しく読み込めることが判明しました。
  • 混在する日付の形式に対応するため、特定のデータを固定することができなくなりました。
回答を見る
  • ベストアンサー

Excel2010 VBAでテキストファイル読込

 初めて質問させていただきます。  Excel2010のVBAで下記のようなマクロを組み、テキストファイルを読込したところ、データの一部が誤変換されてしまいます。  誤変換内容  11/12/29 →2029/11/12  マクロを使用せず、Excelから直接テキストファイルウィサードを使って読み込んだ場合には、正しく「2011/12/29」となります。  (お恥ずかしい話ですが、Excelシートのセルに直接「11/12/29」と打ち込むと自動的に「2011/12/29」に変換されることを今回初めて知りました。)  同一項目には「11/12/29」形式と「20111229」形式が混在しており、「11/12/29は2011/12/29」、「20111229はそのまま」セルに格納するよう依頼されています。  従って、Array(1, 2)で文字列やArray(1, 5)でYMD形式の日付へ同一項目のデータを固定することはできなくなっております。  テキストデータは「カンマ区切り」の35項目です。  データはネットワーク内の他のPCドライブに保存されています。  因みに「 Workbooks.OpenText Filename:=」以下は、Excelのマクロ記録で取得したものです。  お忙しいところ恐縮ですが、よろしくお願いいたします。 【作成したマクロ】 Sub 読込() With CreateObject("WScript.Shell") .currentdirectory = "\\コンピューター名\c\フォルダ名\" End With Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "全てのファイル (*.*),*.*" Set xlAPP = Application xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub Workbooks.OpenText Filename:=strFILENAME, Origin:=932, _ StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=True _ , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _ Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), _ Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array( _ 16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), _ Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array( _ 29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1)) _ , TrailingMinusNumbers:=True End Sub

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

Workbooks.OpenText にパラメータ Local:=True を加えてみてください。 多分、これで上手くいと思います。

amiaminet
質問者

お礼

早速回答いただきありがとうございます。 現在帰宅したため、明日会社にて修正してみます。

amiaminet
質問者

補足

 会社にてマクロ修正、無事希望通りの出力ができました。  ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

コードばかり書いて、読者に忙しい中読み解かせて、肝心の何がしたいのかズバリ書いてないのでは。 もっと疑問点を絞り、ヅバリそこだけ聞いて、回答により自分で自分の場合に当てはめてコードを作ってみよ。 ーー 日付列をどうかしたいのか。2種の入力があるということか。それをエクセルの日付シリアル値(これも判らなければWEBッ照会すること)でセルにセットしたいということか。 このテキストファイルはどういう形式か?セパレーターは?CSVやスペース区切りやPRN形式などがあり、項目の 囲いもダブルコーテーションや文字列だけとか、数値も含めて全部とかある。 ーー テキストファイルを読んでエクセルシートにセットするにしてはコードが長すぎると思う。 CSV形式ならSplit関数で分けて列の各セルにセットすれば仕舞い。コードは10行程度と思う。 日付列を細工するのを除いて。 > CreateObject("WScript.Shell") なども、わざわざShellを起動せず、CurDirなど使えないかと思う。

amiaminet
質問者

お礼

 お忙しい中、早速の回答ありがとうございます。  マクロの作成では、VBA解説サイト等からのコピーとマクロ記録を利用しているため、コードが長くなってしまったと思われます。(所謂継ぎ接ぎです)  形式については、知識不足で申し訳ありませんが、拡張子が「.txt」、カンマ区切り、ということしかお伝えできません。(メモ帳で開いた結果ですが、囲いは何もなく、数値を含め全部あります。ただし、数値は固定長のようです)  肝心の"何をしたいか"についてですが、今まで  1.外部から提供されたデータをコンバーターソフト(業者作成)でテキストファイルに変換  2.Excelでテキストファイルを読み込み、加工して利用  の2.を手作業で行っていたものを、マクロ化しようと考えました。  私的には、「11/12/29」でも「2011/12/29」でも特に大きな問題はないと思っているのですが、担当者は「今まで通り2011/12/29でないと困る」と言われたたことが本件の始まりです。 > CreateObject("WScript.Shell")についてですが、ChDirやChDriveで試してみましたが、上手くいかず、サイト検索で解説サイトからコピーさせていただいた結果です。  実際、Excelから直接テキストファイルを読み込むと、元データが「11/12/29」でも「2011/12/29」に変換されるのに、マクロで読み込むと「2029/11/12」になってしまい、半日デバックに費やしてしまい、今回質問させていただいた次第です。  長文になり申し訳ありませんでした。  取りあえず、mt2008さんの回答を明日試してみたいと思います。  引き続きよろしくお願いいたします。

関連するQ&A

  • VBAでCSVを文字列として取り込む方法

    VBAでCSVを文字列として取り込む方法を教えてください。 下記のようにCSVファイルを取り込んでいます。 Array関数を使用していますが、どうしても文字列として認識してくれません。 Sub CSV取り込み() Dim xlAPP As Application ' Applicationオブジェクト Dim strFILENAME As String ' OPENするファイル名(フルパス) 'Applicationオブジェクト取得 Set xlAPP = Application '「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) 'キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub Workbooks.OpenText Filename:=strFILENAME, _ DataType:=xlDelimited, comma:=True, _ fieldinfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), _ Array(4, 2), Array(6, 2)) Workbooks.Open Filename:=strFILENAME ActiveWorkbook.Sheets(1).Cells.Copy _ Destination:=ThisWorkbook.Worksheets("sheet1").Range("A1") End Sub この書式ではCSVを文字列として取り込めないのでしょうか? どなた様かご教示ください。 よろしくお願いいたします。

  • VBAでのテキストデータ追記

    VBAを使ってデータをテキストファイルに追記したいのですが、 A列だけじゃなく A列からF列までのデータを追記させたいと 考えているのですが、 どうやるのか理解できません。 教えていただけますでしょうか? -------------------------------------------------------------- Option Explicit ' テキストファイル書き出すサンプル Sub WRITE_TextFile() Const cnsTitle = "テキストファイル出力処理" Const cnsFilter = "テキストファイル (*.txt;*.dat),*.txt;*.dat" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「名前を付けて保存」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "出力するファイル名を指定して下さい。" ' (1) vntFileName = xlAPP.GetSaveAsFilename(InitialFilename:="SAMPLE.txt", _ FileFilter:=cnsFilter, _ Title:=cnsTitle) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す) With ActiveSheet If .FilterMode Then .ShowAllData ' オートフィルタ解除 End With GYOMAX = Cells(65536, 1).End(xlUp).Row ' (2) If GYOMAX < 2 Then xlAPP.StatusBar = False MsgBox "テキストをA列2行目から入力してから起動して下さい。", , cnsTitle Exit Sub End If ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open strFileName For Output As #intFF ' (3) ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' (4) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)" ' レコードを出力 Print #intFF, strREC ' (5) ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル出力が完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTitle End Sub -----------------------------------------------------------------------------

  • VBAでタブ区切りファイルを列区切りにしたい

    VBAで秀丸のテキストファイルをエクセルに読み込むとき、タブ区切りがエクセルでは連続した文字列になってしまいます。 これを列に区切って読み込みたいのですがどうしたらいいですか? 読み込むプログラムは、「Excelでお仕事!」のサンプルを使ったもので、ファイルを開く画面から選択する形です。コードは下記です。 ' Applicationオブジェクト取得 Set xlAPP = Application ' (1) ' 「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) ' (2) ' キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub ' (3) ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' (4) ' 指定ファイルをOPEN(入力モード) Open strFILENAME For Input As #intFF ' (5)

  • エクセルのCSV読み込みについて

    現在,以下の記述でエクセル上にマクロ実行ボタンを作成しました。 任意のCSVファイルをエクセルに取り込み利用する目的です。 実行ボタンを押すと,「実行時エラー ファイルにこれ以上データがありません。」として,記述中の 「Input #intFF, X(1), X(2), X(3), X(4), X(5), X(6), X(7) ' (2)」 部分が黄色になって止まってしまいます。 エクセル画面上には,希望通りのデータが出力されているようなので,このエラーが表示されなければデータの取り込みとしては問題ないのですが・・・。 どのようにこのエラーを回避し処理すればよいかかが分かりません。 どなたかご教示いただければ幸いです。 どうかよろしくお願いいたします。 Sub Macro4() ' CSV形式テキストファイル(7カラム)読み込みサンプル Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "CSV形式ファイル (*.csv),*.csv,全てのファイル(*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim X(1 To 7) As Variant ' 読み込んだレコード内容 ' (1) Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' レコードを読み込む(このサンプルは7項目のCSV) Input #intFF, X(1), X(2), X(3), X(4), X(5), X(6), X(7) ' (2) ' 行を加算しA~G列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 Range(Cells(GYO, 1), Cells(GYO, 7)).Value = X ' 配列渡し ' (3) Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • loopでファイル名を取得したい

    loopでファイル名を取得して、テキストファイルをエクセルに保存していきたいのですが、 ↓ここ(StrFileName)でエラーになるのですが、どうしたらいいですか? Workbooks.OpenText FileName:=StrFileName, Origin:=932, StartRow:= _ ---------------------------------------- Private Sub コマンド23_Click() Dim StrFileName As String Const EXTENSION As String = ".txt" StrFileName = Dir$(Me!FilePathName & "\*" & EXTENSION) '任意のフォルダを指定 Do Until Len(StrFileName) = 0 'ファイルが無くなったら終了 MsgBox StrFileName Workbooks.OpenText FileName:=StrFileName, Origin:=932, StartRow:= _ 1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=True _ , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _ Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 2), _ Array(10, 1), Array(11, 1), Array(12, 2), Array(13, 1), Array(14, 1), Array(15, 1), Array( _ 16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), _ Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array( _ 29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), _ Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 2), Array(40, 1), Array(41, 2), Array( _ 42, 1), Array(43, 1), Array(44, 1)), TrailingMinusNumbers:=True ActiveWorkbook.SaveAs FileName:=FolderName & ActiveSheet.Name, _ FileFormat:=xlNormal, CreateBackup:=False ActiveWorkbook.Close False StrFileName = Dir$ '次のファイル名を取得 Loop End Sub

  • Excel VBA読み込みで文字化けが

    Excel VBAにてメールデータを読み込むプログラムを組んでいます。 データの作り方は、 (1)Mozilla Thunderbirdでメールデータをtext形式で保存 (2)VBAにてtextデータを開く。 しかし読み込みを行うと、文字化けしたデータが表示されてしまいます。 どのように解決したらよいのでしょうか? 文字コード変換を行ってもダメでした。 Sub Read_mail_data() Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受け取り用 Dim strREC As String ' 読み込んだレコード名 Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のダイアログでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行わない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' 改行までをレコードとして読み込む Line Input #intFF, strREC ' 行を加算しA列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 ' 文字コードを変換する 'StrConv(strREC, vbFromUnicode) = a Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) ' セルにデータを書き込む 'Cells(GYO, 1).Value = strREC Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。 " & vbCr & "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • エクセル2007VBAの質問です。

    エクセル2007VBAで下記の事をしたいのですがうまくいきません。 ・エクセルシートの数式を消して値を残したものを別名で保存する。 ※保存時は「名前をつけて保存」ダイアログを出したいです。 現在は、下記内容で記述してみましたが、保存されません。 初心者がネットで調べて書いたので、めちゃくちゃな所があると思いますが宜しくお願いします。 ------------------------------------------------------------- Sub シートコピー() ' ' シートを別のブックにコピーする。 ' ' Const cnsTITLE = "エクセル作成" Const cnsFILTER = "エクセルファイル (*.xls),*.xls" Const xlsfile = "C:\temp\ファイル名を入力して下さい。" ' Columns("A:R").Select Selection.Copy Workbooks.Add Columns("A:A").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Set xlsApp = Application xlsApp.StatusBar = "出力ファイル名を指定して下さい。" strFILENAME = xlsApp.GetSaveAsFilename(InitialFileName:=xlsfile, _ FileFilter:=cnsFILTER, title:=cnsTITLE) End Sub -------------------------------------------------------------

  • エクセルVBAでテキスト保存

    エクセルのファイルをメモ帳で保存する場合に下記のコードが書いてあります。 strFILENAME = xlAPP.GetSaveAsFilename(InitialFileName:="データxxx_yyy_zzz.txt",FileFilter:=cnsFILTER, Title:=cnsTITLE) このうち、ファイル名の"データxxx_yyy_zzz.txt"、xxx, yyy,zzzをそれぞれ、特定のセルから取得したい場合、どのように直せばいいのでしょうか? xxx=A1セル yyy=A2セル zzz=A3セル といった感じです。 よろしくお願いします。

  • Excel VBAでテキストを開く際の表示形式

    恐れ入りますが、ご存知の方、ご教授願います。 Excel VBAにてテキストファイルを開く際に、表示形式を"標準"ではなく"文字列"で取り込もうと思います。 "文字列"にするにはVBAで下記のように記述します。 ------------------------------------------------------------------ Workbooks.OpenText Filename:= _ sFileName _ , Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _ Comma:=False, Space:=False, Other:=False, FieldInfo:=Array( Array(1, 2), Array(2, 2), Array(3, 2)) , TrailingMinusNumbers:=True ------------------------------------------------------------------ FieldInfo:=部分に列数だけArray(x, 2)を指定しますが、一括で"文字列"指定することは可能でしょうか。 恐れ入ります。ご教授願います。

  • VBA テキストclose

    初めまして。VBAでマクロを作成しています。 今、sheet上のあるボタンを押したら、テキストファイルのデータをカンマ刻みで読み出し、シートに表示しています。 記憶マクロで作成したのですが、以下のコードはtextファイルをopenにしたままなので、closeしたいのです。(外部からテキストファイルに書き込みたいため、openのままであると書き込みができない)。 以下のコードを修正してテキストファイルをクローズさせる方法を 教えていただけないでしょうか?  宜しくお願い致します。 Sub ボタン1_Click() ' ' ボタン1_Click Macro ' マクロ記録日 : 2008/8/10 ユーザー名 : Matsumura ' ' ChDir "C:\Documents and Settings\Owner\デスクトップ\List" Workbooks.OpenText Filename:= _ "C:\Documents and Settings\Owner\デスクトップ\List\DBへ登録.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, 1), Array(2, 1), _ Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1)), TrailingMinusNumbers:=True Columns("A:A").ColumnWidth = 14.38 Application.CommandBars("Forms").Visible = False Columns("B:B").ColumnWidth = 14.38 Columns("C:C").ColumnWidth = 14.38 Columns("D:D").ColumnWidth = 14.38 Columns("E:E").ColumnWidth = 14.5 Range("E1").Select Columns("E:E").ColumnWidth = 14.38 Columns("F:F").ColumnWidth = 14.38 Columns("E:E").ColumnWidth = 16.25 Columns("A:F").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Range("B3").Select Rows("1:1").RowHeight = 26.25 Range("A1:F1").Select With Selection.Font .Name = "MS Pゴシック" .Size = 18 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.Font.ColorIndex = 3 Selection.AutoFilter End Sub

専門家に質問してみよう