• 締切済み

テキストデータをエクセルVBAで読み込む方法

皆さん、始めまして。 関連[QNo.7692303] 上記にて関数を使って整形する方法をご回答いただきました。 今回は当時よりも便利性をあげ、エクセルのVBAを使ったものを作成したく質問させて頂きます。 テキストファイル(サンプルは下記参照)を読み込み、使いやすいようにエクセルへはめ込むのが目標です。 VBAは初心者なので、お忙しい中恐縮では御座いますが、ご教授いただければと存じます。 少ないデータで作成できたら、本番データへ拡張していきながらさらに理解を深められればと考えております。 [環境] Windows7 / Excel2007 [テキストデータサンプル] 下記に貼り付けたように条件によって出力方法が違うデータがあります。 ・処理番号内でレコードが1つのものは項目がたてに並んでいる。 ・処理番号内でレコードが2つ以上になると項目が横にならぶ。 ・記録、日時、年齢、地域の値はすべて可変 ・本来のデータは10項目以上あるが、サンプルデータとして4つ抜粋して下記に表記しています。 処理番号 : 001-H20120910001 処理記録 ---------------------- 記録 日時    年齢   地域 0 20120712 63 東京 1 20120912 63 東京 (結果数 = 2) --- END 処理番号 : 001-H20120919999 処理記録 ---------------------- 記録 = 0 日時 = 20120909 年齢 = 19 地域 = 神奈川 (結果数 = 1) --- END 処理番号 : 001-H20110910009 処理記録なし --- END 処理番号 : 001-H20109190022 処理記録 ---------------------- 記録 = 3 日時 = 20101109 年齢 = 26 地域 = 茨城 (結果数 = 1) --- END 処理番号 : 001-H20120910022 処理記録 ---------------------- 記録 日時    年齢   地域 0 20120712 63 東京 1 20120912 63 栃木 5 20120917 63 和歌山 (結果数 = 3) --- END [実行後に得たい情報] 処理番号で検索し、その中のデータを下記ならびでエクセルデータに変換したいと考えています。 A列      B列 C列    D列 E列 001-H20120910001 0   20120712 63   東京 001-H20120910001 1   20120912 63   東京 001-H20120919999 0   20120909 19   神奈川 001-H20110910009 001-H20109190022 3   20101109 26  茨城 001-H20120910022 0  20120712 63 東京 001-H20120910022 1  20120912 63 栃木 001-H20120910022 5 20120917 63 和歌山 エクセルのマクロは勉強をし始めたばかりで初心者程度の知識ですが、 もしよろしければご回答、ご助言いただければと存じます。 よろしくお願いいたします。

みんなの回答

回答No.4

1行ずつは考えていなく、テキストデータをすべてExcelにインポートしてからの作業を考えていました どのように編集されたかわかりませんが、いずれにせよ当方VBA不得意なので数式に頼っています。 言い忘れましたが、文字列としてインポートするには、先に、セルの書式を文字列にしておく必要があります。インポートの方法によりますが、インポート時に文字列に設定してあげます。 表示をさせなくすることで、計算速度を上げられます Sub Macro1() Application.ScreenUpdating = False ' 内容 Application.ScreenUpdating = True End Sub VBAに関しての詳しいことは、よくわかりませんので調べてくださいm(_ _)m

回答No.3

#1です A列にテキストデータを文字列として取り込んだあと Sub ほとんど数式です() Dim n As Long n = Range("A" & Rows.Count).End(xlUp).Row Range("B2:B" & n).Formula = "=IF(A2=""--- END"",""""," & _ "IF(LEFT(A2,4)=""処理番号"",RIGHT(A2,16)," & _ "IF(ISNUMBER(LEFT(A2,1)*1),LEFT(B1,16)&"" ""&A2," & _ "B1&REPT(SUBSTITUTE(A2,""記録 ="","""",1),LEFT(A2,4)=""記録 ="")&" & _ "REPT(RIGHT(A2,9),LEFT(A2,4)=""日時 ="")&" & _ "REPT(SUBSTITUTE(A2,""年齢 ="","""",1),LEFT(A2,4)=""年齢 ="")&" & _ "REPT(SUBSTITUTE(A2,""地域 ="","""",1),LEFT(A2,4)=""地域 =""))))" Range("C3:C" & n).Formula = "=IF(B3=B2,"""",IF(ISNUMBER(LEFT(A3,1)*1),B3," & _ "IF(AND(A3=""--- END"",B2<>INDEX(C:C,ROW()-4)),B2,"""")))" Range("C3:C" & n).AutoFilter Field:=1, Criteria1:="<>" Range(Range("C3").Offset(1), Range("C3").End(xlDown)).Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _ :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)), _ TrailingMinusNumbers:=True Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _ :=Array(1, 1), TrailingMinusNumbers:=True Rows("1:1").Insert Columns("A:E").EntireColumn.AutoFit End Sub REPT関数はIF関数に置き換えたほうが分かりよいかも http://okwave.jp/qa/q7692303.html

Kakurenbo555
質問者

お礼

お忙しい中ご回答ありがとうございます! 以前の回答からマクロの登録で実施し中身を確認すると フィルター部分など使いにくい感じだったので早速明日試してみます。 また余談ですが、読み込み時に"--- END"が"=--- END"となり、Cellにformulが入ったようになって IF文などの引っかからない事があったので、形式を指定して読み込む方法も勉強してみようと思います。

Kakurenbo555
質問者

補足

ご回答頂いてから、ファイルの読み込み、WorkBook/Sheetの追加、ActiveCellの選択など勉強し、マクロを完成させる事ができました。 これで基本的な動きが勉強できました。 ファイルcheckをファイル名からおこなったり、読み込んだファイルによって処理をかえるコードの書き方などを追加で勉強していこうと思います。 実際のデータが65万行あったのでつくったマクロでは4時間くらい待っても処理が終わりませんでした。。 テキストファイル自体は1行ずつ読み込む形にしたので、 全部読み込まず1行ごとに処理をいれたら関数の計算部分の負荷がさがって 処理がおわるようになるでしょうか。 そもそもデータ大きすぎるのでアクセスの勉強をすべきなのか・・・・ まだまだ初心者ですが、色々試してみようと思います!

回答No.2

URLを晴れ、そこのAが見たい!!

Kakurenbo555
質問者

補足

http://oshiete.goo.ne.jp/qa/7692303.html 最初の質問の事でしょうか。

回答No.1

たたき台って言ったのに。。。 1. A列に文字列として、テキストデータを取り込む 2. 1行目を挿入 3. B2セルに =IF(A2="--- END","", IF(LEFT(A2,4)="処理番号",RIGHT(A2,16), IF(ISNUMBER(LEFT(A2,1)*1),LEFT(B1,16)&" "&A2, B1&REPT(SUBSTITUTE(A2,"記録 =","",1),LEFT(A2,4)="記録 =")& REPT(RIGHT(A2,9),LEFT(A2,4)="日時 =")& REPT(SUBSTITUTE(A2,"年齢 =","",1),LEFT(A2,4)="年齢 =")& REPT(SUBSTITUTE(A2,"地域 =","",1),LEFT(A2,4)="地域 =")))) 下へオートフィル 4. C3セルに =IF(B3=B2,"",IF(ISNUMBER(LEFT(A3,1)*1),B3, IF(AND(A3="--- END",B2<>INDEX(C:C,ROW()-4)),B2,""))) 下へオートフィル 5. オートフィルタ (空白以外のセル) 6. コピーして別シートに貼り付け 7. データ 区切り位置 [レ]スペース マクロの自動記録の助けになればよいかな。 #なんでこのようなデータがテキストデータとして出力されるのか不思議

Kakurenbo555
質問者

お礼

大変失礼いたしました。 たたき台と記載してくださったのにすみません。 マクロの記録で実際にご教授頂いたものを登録して VBAの内容を確認してみました。 ファイルの読み込み関してはファイル選択できるように下記のように作って付け足して実施しました。 Sub FileOpen() Dim OpenFile As String Dim buf As String ChDir "C:\Users\s00718319\Documents\新しいフォルダー" OpenFile = Application.GetOpenFilename("*,*.*") Open OpenFile For Input As #1 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop Close #1 End Sub すでにご回答いただいている様なので#3の方へも御礼させて頂きます。

関連するQ&A

  • テキストファイルからデータ読み込みに関して。

    皆さん、始めまして。 テキストファイルのデータからエクセルへ読み込むエクセルマクロを構築したく質問させて頂きました。 テキストデータでリストの一覧をExportできるのですが、その整理が非常に手間なので自動化したく マクロを作成する事を検討しております。 環境はデータ内容を下記に記載させて頂きます。 [環境] Windows7 / Excel2007 [テキストデータサンプル] 下記に貼り付けたように条件によって出力方法が違うデータがあります。 ・レコードが1つのものは項目がたてに並んでいる。 ・レコードが2つ以上になると項目が横にならぶ。 処理番号 : 001-H20120910001 処理記録 ---------------------- 記録 日時    年齢   地域 0 20120712 63 東京 1 20120912 63 東京 (結果数 = 2) --- END 処理番号 : 001-H20120919999 処理記録 ---------------------- 記録 = 0 日時 = 20120909 年齢 = 19 地域 = 神奈川 (結果数 = 1) --- END [実行後に得たい情報] 処理番号で検索し、その中のデータを下記ならびでエクセルデータに変換したいと考えています。 001-H20120910001 0 20120712 63 東京 001-H20120910001 1 20120912 63 東京 001-H20120919999 1 20120909 19 神奈川 エクセルのマクロは勉強をし始めたばかりで初心者程度の知識ですが、 もしよろしければご回答、ご助言いただければと存じます。 よろしくお願いいたします。

  • エクセルのデータから日付を抜き出す方法について

    エクセルで日時を含む値のセルから2ヶ月以内の日付があれば気づけるような仕組みを作ろうとしています。 データの内容は以下のような形です。 aaaaa bbbbb end : 12:59:59 25 Feb japan 2019 ccccc ddddd end : 18:33:42 31 Mar japan 2019 ・ ・ ・ 上記のように一つの列にデータが複数あり、3行目、5行目のような形式で日時が記載されたセルがあります。 aaaaa、bbbbbは日時とは全く関係のないデータです。 LEFTやMID関数で日時を抜き出し、現在の日時より62日以内の数値だけわかるように表示させる。 というようなことを考えましたが、抜き出したデータが日付として認識されなかったりとうまくいきません。 やり方は問いませんので、どなたか知恵をお貸しいただけると幸いです。

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • excelでデータの集計をしたいのですが

    エクセル上の表に地域別のデータを集計しています。 地域には番号をつけてあり、下記のようにまとめています。 地域番号   反響内容  1      ○○○○○  4      ○○・・・  2      ・・・・・ これを地域別に何個ずつデータがとれたかを集計する方法を知りたいのです。 地域番号 1 について 反響データ  ○○件   のような形にです。 エクセル上の方法を教えてください。

  • 【エクセルVBA】データの振り分けについて。

    エクセルVBAでのデータの振り分けについて教えて下さい。 シート(1)のA列には他のファイルから抽出したデータがあります。 各行のデータの中に、H20年度が含まれている場合はシート(2)のA列に移動させ、H21年度が含まれている場合にはシート(2)のC列に移動させたいと思っています。 以前に sheets(1).Range("H40").Value Like "*○○*" Then sheets(2).Range("H40").Value = 0 sheets(1).Range("G" & myRow).End(xlUp).Offset(1, 0).Value = _ sheets(2).Range("H40").Value こういうものを使ったことがある為これを応用するといいのかなとも思ったのですが、わからなくなってしまい質問させていただきました。 勉強不足ですいません。 教えて頂けないでしょうか。よろしくおねがいします。

  • エクセル データーの抽出

    エクセル2000を使用しております。 4000件ほどのデーターが縦に並んでおり 1個のデーターには12個の項目(L列)が入っております。 文字数は不規則なA列のデーターの 末尾 Hがある データー(A-L列全部)のみ抽出して別のシートに コピー処理を行いたいです。 VBAを使用してもいいのですが何か良い方法は ありますでしょうか?

  • Excelの2つのBOOKのデータ統合のVBA

    Excelの2つのBOOKの項目が同じリストのデータを統合できるVBAを教えてください。項目は、処理結果、金額、年月日、番号、品名の5項目がA列~E列まででデータは複数行あります。VBAは初心者です。どうぞよろしくお願いいたします。

  • エクセルのデータをVB2008でグラフ化する方法

    はじめまして。VB初心者です。 エクセルからデータを取り出し、VB2008のMSChartコントロールを使って、マーカー無しの平滑線の散布図を作ろうと思っています。まだVB初心者で、プログラム作るのに苦労しています(汗)。エクセルから下記のようにランダムにデータを取り出して表示する方法わかる方いましたらご教示お願いします。(サンプルコードありましたら助かります!!) ★VB2008のMSChartコントロールで下記のように表示したいです!! (1)エクセルにあるデータは、A1からデータがはじまっているのではなく、AFの3からはじまり、3,6,9,12(行)に系列ごとにデータが入力されます(下記のエクセルデータ例参考)。 (2)VBでの表示は↓ののようにしたいです!!X軸はエクセルデータの列となり、値は1からはじまりエンドは任意となります。Y軸は測定データで、12.3. 13.5等となり、エクセルのAFから入力した数値となります。系列はエクセルの行となり、表示は系列をすべて重ねて表示します。 【例】      1    2   3   4 ・・・(X軸) 系列1 12.3  13.5  13.4  20.3・・・(Y軸) 系列2 13.3  12.5  11.4  22.3・・・(Y軸) ・ ・ 【エクセルデータ】    AF   AG    AH    AI ・・・(列) 3 12.3  13.5  13.4  20.3・・・・・→系列1 6 13.3  12.5  11.4  22.3・・・・・→系列2 9 11.3  13.5  13.4  20.3・・・・・→系列3 12 15.3  13.5 13.4  20.3・・・・・→系列4 (行) 以上、宜しく御願致します。

  • エクセルVBAにて教えて下さい。

    WindowsMeエクセル2000を使用しています。 業務で使用していのですが、自分には知識が無く困っています。 どなたか分かるかた教えて下さい。宜しくお願い致します。 エクセルで下記のようなデータが有ります。 A列 B列 1  東京 2  大阪 1  千葉 下のコマンド実行ではA列で(1)が重複したので、後ろの業(千葉)を残し 前の業(東京)を削除します。 結果 A列 B列 2  大阪 1  千葉 これを逆に東京を残し、千葉を削除したいのですが、 A列 B列 1  東京 2  大阪 どのようにすれば良いのでしょうか? Sub CommandButton2_Click() Dim key As String Dim RCnt As Long Dim i As Long key = "A1" Worksheets("sheet1").Activate ActiveSheet.Range(key).Select Selection.Sort key1:=Range(key), order1:=xlAscending RCnt = ActiveSheet.Range(key).CurrentRegion.Rows.Count For i = 1 To RCnt With ActiveCell If .Value = .Offset(1, 0).Value Then Selection.EntireRow.Delete Else .Offset(1, 0).Select End If End With Next i End Sub

  • アクセスの外部データ(エクセル)の取り込み。VBA

    アクセスの外部データ(エクセル)の取り込み。VBAの質問です。 アクセス2003 エクセル2003 不要な行・列がある場合の外部データ取り込みVBAを教えて下さい。 今は、エクセルで削除して取り込んでいます。 アクセスに「得意先リスト」というテーブルを作っています。 コード(テキスト型)主キー 名称(テキスト型) フリガナ(テキスト型) 郵便番号(テキスト型) 住所1(テキスト型) 住所2(テキスト型) TEL(テキスト型) FAX(テキスト型) エクセルブック[得意先リスト.xls] シートは「リスト形式」のみです。 1~4行は不要。 5行目が見出しです。 A~AZ列までデータがあります。 必要な列は、B・C・D・F・G・H・M・N列です。 セルの書式設定は「文字列」です。 [アクセス エクセル インポート 行 列 削除]などでサンプルVBAを探しましたが見つからなかったので質問させて頂きました。 申し訳ありませんが、教えて下さい。

専門家に質問してみよう