- ベストアンサー
エクセルのマクロでの場所と月ごとのデータ絞り込みと列削除
- エクセルのマクロを使って、場所ごとに検索し、さらに月ごとにまとめ、不要な列を削除して別シートに表示する方法について教えてください。
- 私はマクロ初心者で、簡単なマクロは組めますが、これまでの方法では難しいと思われます。
- 以下の表には、場所ごとの日付、使用機械、作業内容、工数などがあります。どのようにマクロを組めば目的を達成できるでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Sub SplitMacro() Dim sSrch As Variant Dim rng As Range Dim ret As Variant Dim NextSh As Worksheet 'データ範囲 Set rng = ActiveSheet.Range("A1").CurrentRegion Set NextSh = Worksheets("Sheet2") '転送先シート NextSh.UsedRange.Clear 'データ転送部消去 If Application.CountA(rng) < 3 Then MsgBox "シートが違うかもしれません。", 64 Exit Sub End If sSrch = Application.InputBox("場所は?", "検索", Type:=2) If VarType(sSrch) = vbBoolean Or Trim(sSrch) = "" Then Exit Sub ret = Application.Match(sSrch, rng.Columns(1), 0) If IsError(ret) Then MsgBox sSrch & " :が見当たりません。", 48 Exit Sub End If Application.ScreenUpdating = False With rng .AutoFilter _ Field:=1, Criteria1:=sSrch .Sort key1:=.Range("B1"), _ order1:=xlAscending, _ header:=xlYes, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom End With With ActiveSheet .Columns(3).Hidden = True: .Columns(6).Hidden = True .AutoFilter.Range.Copy NextSh.Range("A1") '転送 .Columns(3).Hidden = False: .Columns(6).Hidden = False .AutoFilterMode = False End With Application.ScreenUpdating = True Call SplitDate(NextSh) NextSh.Activate End Sub Sub SplitDate(sh As Worksheet) Dim i As Long Dim Start As Long Start = 1 With sh Application.ScreenUpdating = False For i = .Cells(.Rows.Count, 2).End(xlUp).Row To Start + 1 Step -1 If IsDate(.Cells(i, 2).Text) And IsDate(.Cells(i - 1, 2).Text) Then If Month(.Cells(i, 2).Value) <> Month(.Cells(i - 1, 2).Value) Then .Cells(i, 1).Resize(, 4).Insert Shift:=xlDown End If End If Next For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If .Cells(i, 1).Value = "" Then .Cells(i, 2).Value = " " & Month(.Cells(i - 1, 2).Value) & "月 合計" .Cells(i, 4).Formula = "=SUM(R" & Start + 1 & "C4:R[-1]C4)" .Cells(i, 1).Resize(, 4).Font.Bold = True Start = i End If Next Application.ScreenUpdating = True End With End Sub
その他の回答 (4)
- layy
- ベストアンサー率23% (292/1222)
サイトは「ExcelVBAへの道」です。 ここでなくても良いので、要点を得たサイトを見つけて学習してみてください。 やりたいこととピッタリ当てはまるサイトなんてのはあまりないと思います。 サンプルから加工するスキルが必要になってくると思います。 今回の例で言えば 「場所」と「作業内容」を検索条件にしたい場合どうしますか?。 また、 場所で並べ替えして、日付を月単位に加工したらマクロで無くても条件式だけで合計は出せませんか?。 A B C D 1 場 所 月 作業内容 工数(H) 備 考 2 東京 2010/05 掃除 1.00 なし 3 東京 2010/06 掃除 2.50 なし ----3.0 4 新潟 2010/05 塗布 6.00 なし ----6.0 質問提示情報が少ないとそれだけ回答も時間かかります。 要点をピンポイントで教えると回答も早いです。 さほど文章がなく、 実行前、実行後のデータ例画像だけでも伝わることありますし。 「VBAエキスパート」試験、知ってます。いいと思います。
お礼
有難うございます! 文章って難しいですね、言葉足らずで解りにくく、申し訳ありません。 画像も載せようとしてみましたがエラーで載せられませんでした。 画像の記載方法をもう少し詳しく検索し、今度はわかりやすい質問になるようがんばります! 本当に有難うございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
#3は文章を入れる余裕がありませんでしたので、コードのみにしました。 数式などを自分で書き換える余地は残しています。#3のマクロは、シートごとに分配することも可能です。 掲示板は、残念ながら、書き込み量も限られているので、VBAコーディングの正しい書法やルールを学ぶ場には適していません。 例えば、 #3の MsgBox "シートが違うかもしれません。", 64 のような書き方は、本来は、 64 を vbInformation と書くべきなのですが、文字数の制限のためにしています。入れなければよいと思うかもしれませんが、そういうことをしているとなし崩しになって、自分自身がダメになっていくように思います。私は、ある程度は、実務に耐えられる程度のエラー対処は必要だと思っています。毎回毎回、こういうことを気をつけていけば、それが当たり前になります。 Webサイトとしては、 VBAエキスパート公式サイト ttp://vbae.odyssey-com.co.jp/index.html ここで、どういう方針を立てるか決めると良いと思います。 かんたんプログラミングExcel 2003 ttp://www.amazon.co.jp/exec/obidos/ASIN/4774119660 かんたんプログラミングExcel 2007 ttp://www.amazon.co.jp/exec/obidos/ASIN/477413340X このような書籍があります。 (URLに、hを足してください) しかし、Excelは、裾のは広く初心者向けの本は多いのですが、ランクが上がるというか、本当にプログラミングをしようという人には、あまり詳しい本がないのが実情です。
お礼
詳しい解説有難うございます! なんとか教えてもらった方法で試し試しやっています。 質問に書いたものと自分で作っている表は似ているけど内容がぜんぜん違うので そこからまたコードを直していくのがたいへんでした。 こういう事をしていってみんな覚えていくんですね! 教えていただいたサイト、覗いて見ます! 有難うございました。
- layy
- ベストアンサー率23% (292/1222)
・「場所、月、作業内容」単位に工数合計を別シートに表示 ・検索したい条件は場所 例)神戸で検索 神戸 2010/05 塗布 12.0 神戸 2010/06 掃除 1.0 さらに 「11 神戸 2010/05/15 L形 掃除 3.00 なし」 があれば 神戸 2010/05 塗布 12.0 神戸 2010/05 掃除 3.0 神戸 2010/06 掃除 1.0 ということで解釈します。 初歩的なやり方としては、 「A2からE10まで1つずつ見ていって条件にあうか検知する。」 1)セルB2から順番に2行目、3行目、4行目・・・と下へ移動させて 行内容(=各セル内容)がヒットした条件にあうかIF文を使う 2)ヒットしているときは、工数合計を求める 3)ヒットしない場合はなにもしないで継続する 4)結果はシートBにセットする VBAによるセルの操作は http://www.voicechatjapan.com/excelvba/VBArei2.htm で学習してください。
お礼
回答有難うございます。 せっかく乗せて頂いたURLなんですが、残念ながら拝見できませんでした。 もし、まだこれを見ていて下さりましたらグーグル等でサイトを探して見ますので どんな題名のサイトか教えていただけますでしょうか? 宜しくお願い致します。
- keithin
- ベストアンサー率66% (5278/7941)
準備: Sheet1に,ご質問に例示された全くその通りのレイアウトで元データを用意。 Sheet2のA1に =Sheet1!A1 と記入。 Sheet2のA2に例えば東京のように記入することにする。 作成: シート2のシート名タブを右クリックしてコードの表示を開始する 現れたシートに下記をコピー貼り付ける private sub worksheet_change(byval Target as excel.range) if target.address <> "$A$2" then exit sub if target = "" then exit sub application.screenupdating = false application.enableevents = false range("4:65536").delete shift:=xlshiftup worksheets("Sheet1").range("A1").currentregion.advancedfilter _ action:=xlfiltercopy, _ criteriarange:=range("A1:A2"), _ copytorange:=range("A4"), _ unique:=true range("C:C,F:F").delete shift:=xlshifttoleft range("A4").currentregion.sort _ key1:=range("B4"), order1:=xlascending, _ key2:=range("C4"), order2:=xldescending, _ header:=xlyes if range("A5") <> "" then range("B:B").numberformat = "yyyy/mm" range("A4").currentregion.subtotal _ groupby:=2, _ function:=xlsum, _ totallist:=array(4), _ replace:=true, _ pagebreaks:=false, _ summarybelowdata:=true range("B:B").numberformat = worksheets("Sheet1").range("B2").numberformat end if application.enableevents = true application.screenupdating = true end sub Excel画面に戻り,A2に例えば東京のように記入する。 #参考 「まとめたい」って言葉で言われても,具体的にどんな目に見えるアウトプットにしたいのか,伝わってきません。 「検索したい」も同じです。 折角丁寧に元データの様子を説明して下さったのですから,あと一手間「こういう結果が必要なんです」まで目に見える姿にして,ご相談を作成してみてください。 マクロの改修が必要でしたら,まずはサンプルマクロの知らない命令をF1キーで調べ,次にマクロ以前のエクセルの使い方についても勉強して,応用してみてください。
お礼
回答有難うございます。 エクセルで早速行なってみましたが、こんなに簡単にでるとは思いませんでした。 どこで学ばれたのでしょうか?学ばれたサイト、本等ありましたら教えて頂けますでしょうか? 質問の件に関しての注意、有難うございます。 結果も書けば解りやすいですよね!説明が足りず申し訳ありません。 私は文を書くのが苦手なので至らない点多々あったと思います。 また回答して頂ける機会がございましたら、またご指導頂けると幸いです。 本当に何から何まで有難うございます!
お礼
回答有難うございます。 試してみます!