- 締切済み
テキストデータをエクセル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 和歌山 エクセルのマクロは勉強をし始めたばかりで初心者程度の知識ですが、 もしよろしければご回答、ご助言いただければと存じます。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
1行ずつは考えていなく、テキストデータをすべてExcelにインポートしてからの作業を考えていました どのように編集されたかわかりませんが、いずれにせよ当方VBA不得意なので数式に頼っています。 言い忘れましたが、文字列としてインポートするには、先に、セルの書式を文字列にしておく必要があります。インポートの方法によりますが、インポート時に文字列に設定してあげます。 表示をさせなくすることで、計算速度を上げられます Sub Macro1() Application.ScreenUpdating = False ' 内容 Application.ScreenUpdating = True End Sub VBAに関しての詳しいことは、よくわかりませんので調べてくださいm(_ _)m
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
#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
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
URLを晴れ、そこのAが見たい!!
補足
http://oshiete.goo.ne.jp/qa/7692303.html 最初の質問の事でしょうか。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
たたき台って言ったのに。。。 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. データ 区切り位置 [レ]スペース マクロの自動記録の助けになればよいかな。 #なんでこのようなデータがテキストデータとして出力されるのか不思議
お礼
大変失礼いたしました。 たたき台と記載してくださったのにすみません。 マクロの記録で実際にご教授頂いたものを登録して 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の方へも御礼させて頂きます。
お礼
お忙しい中ご回答ありがとうございます! 以前の回答からマクロの登録で実施し中身を確認すると フィルター部分など使いにくい感じだったので早速明日試してみます。 また余談ですが、読み込み時に"--- END"が"=--- END"となり、Cellにformulが入ったようになって IF文などの引っかからない事があったので、形式を指定して読み込む方法も勉強してみようと思います。
補足
ご回答頂いてから、ファイルの読み込み、WorkBook/Sheetの追加、ActiveCellの選択など勉強し、マクロを完成させる事ができました。 これで基本的な動きが勉強できました。 ファイルcheckをファイル名からおこなったり、読み込んだファイルによって処理をかえるコードの書き方などを追加で勉強していこうと思います。 実際のデータが65万行あったのでつくったマクロでは4時間くらい待っても処理が終わりませんでした。。 テキストファイル自体は1行ずつ読み込む形にしたので、 全部読み込まず1行ごとに処理をいれたら関数の計算部分の負荷がさがって 処理がおわるようになるでしょうか。 そもそもデータ大きすぎるのでアクセスの勉強をすべきなのか・・・・ まだまだ初心者ですが、色々試してみようと思います!