アプリ版:「スタンプのみでお礼する」機能のリリースについて

皆さん、始めまして。

関連[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 和歌山

エクセルのマクロは勉強をし始めたばかりで初心者程度の知識ですが、
もしよろしければご回答、ご助言いただければと存じます。

よろしくお願いいたします。

「テキストデータをエクセルVBAで読み込む」の質問画像

A 回答 (4件)

たたき台って言ったのに。

。。

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. データ 区切り位置 [レ]スペース

マクロの自動記録の助けになればよいかな。

#なんでこのようなデータがテキストデータとして出力されるのか不思議
    • good
    • 0
この回答へのお礼

大変失礼いたしました。
たたき台と記載してくださったのにすみません。

マクロの記録で実際にご教授頂いたものを登録して
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の方へも御礼させて頂きます。

お礼日時:2012/09/12 23:48

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

この回答への補足

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

補足日時:2012/09/12 23:54
    • good
    • 0

#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://oshiete.goo.ne.jp/qa/7692303.html

この回答への補足

ご回答頂いてから、ファイルの読み込み、WorkBook/Sheetの追加、ActiveCellの選択など勉強し、マクロを完成させる事ができました。

これで基本的な動きが勉強できました。
ファイルcheckをファイル名からおこなったり、読み込んだファイルによって処理をかえるコードの書き方などを追加で勉強していこうと思います。

実際のデータが65万行あったのでつくったマクロでは4時間くらい待っても処理が終わりませんでした。。
テキストファイル自体は1行ずつ読み込む形にしたので、
全部読み込まず1行ごとに処理をいれたら関数の計算部分の負荷がさがって
処理がおわるようになるでしょうか。

そもそもデータ大きすぎるのでアクセスの勉強をすべきなのか・・・・

まだまだ初心者ですが、色々試してみようと思います!

補足日時:2012/09/16 00:14
    • good
    • 0
この回答へのお礼

お忙しい中ご回答ありがとうございます!

以前の回答からマクロの登録で実施し中身を確認すると
フィルター部分など使いにくい感じだったので早速明日試してみます。

また余談ですが、読み込み時に"--- END"が"=--- END"となり、Cellにformulが入ったようになって
IF文などの引っかからない事があったので、形式を指定して読み込む方法も勉強してみようと思います。

お礼日時:2012/09/13 00:07

1行ずつは考えていなく、テキストデータをすべてExcelにインポートしてからの作業を考えていました


どのように編集されたかわかりませんが、いずれにせよ当方VBA不得意なので数式に頼っています。

言い忘れましたが、文字列としてインポートするには、先に、セルの書式を文字列にしておく必要があります。インポートの方法によりますが、インポート時に文字列に設定してあげます。

表示をさせなくすることで、計算速度を上げられます
Sub Macro1()
Application.ScreenUpdating = False
' 内容
Application.ScreenUpdating = True
End Sub
VBAに関しての詳しいことは、よくわかりませんので調べてくださいm(_ _)m
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!