- ベストアンサー
ExcelマクロVBAでE列の注文日が最大の行を表示する方法
- ExcelマクロVBAを使用して、A列のIDでくくった場合に、E列の注文日が最大の行を表示する方法について教えてください。
- Excel2007やXPでの作業を前提に、A列のIDでグループ化し、E列の注文日が最大の行を抽出するためのExcelマクロVBAのコードや手順について教えてください。
- ExcelマクロVBAを利用して、A列のIDでデータをグループ化し、E列の注文日が最大の行のみを抽出する方法について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.3です。 追加質問の >列が増えた場合、どのコードを修正すれば良いでしょうか? >また注文日に当たるコードはどの部分か教えて頂けないでしょうか。 に関して・・・ 前回のコードはA~E列にデータがある!というコードで、E列に日付の列の場合で処理しています。 列が増えたり、日付列が変わる場合は、前回コードの ws3.Range("A:E").Sort key1:=ws3.Cells(1, 5), order1:=xlDescending For k = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row ws3.Range("A:E").AutoFilter field:=1, Criteria1:=ws2.Cells(k, 1) i = 2 Do Until ws3.Rows(i).Hidden = False i = i + 1 Loop Range(ws3.Cells(i, 2), ws3.Cells(i, 5)).Copy Destination:=ws2.Cells(k, 2) Next k ws3.Range("A:E").Delete のところに手を加えます。 上記コード内の1行目 >ws3.Range("A:E").Sort key1:=ws3.Cells(1, 5), order1:=xlDescending 部分はSheet3(Sheet1をそのままSheet3にコピーしたもの)のA~E列のE列(日付列)の 降順で並び替えています。 >key1:=ws3.Cells(1, 5) 部分がE列を指定して、 >order1:=xlDescending 部分で降順に並び替えです。 列が増えたり、日付列の変更がある場合はここで処理してみてください。 ※ この際ですので、コードの説明をすると (1)Sheet2のA列にSheet1のIDを重複なしに表示 (2)Sheet1をそのままSheet3にコピー (3)Sheet3を日付の降順に並び替え (4)Sheet2のA列データ順にSheet3にオートフィルタを掛ける (5)Sheet3の2行目から順に行が非表示でなくなるまでループ (6)データが日付の降順に並んでいるので、オートフィルタを掛けているデータの最初の表示されている行がSheet1の最新データとなる。 (7)(6)の行のデータをSheet2のオートフィルタを掛けた行のB列にコピー&ペースト といった手順を踏んでいます。 こんなんで参考になりますかね?m(_ _)m
その他の回答 (3)
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 一例です。 元データはSheet1にあり、Sheet2に表示するとします。 Sheet3を作業用のSheet(Sheet1に手を加えないようにするため)としていますので、 Sheet3は全く使用していないという前提です。 Alt+F11キー → 画面左の「This Workbook」をダブルクリック → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i As Long, k As Long Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet Set ws1 = Worksheets("Sheet1") '←「Sheet1」は実際のSheet名に! Set ws2 = Worksheets("Sheet2") '←「Sheet2」も実際のSheet名に! Set ws3 = Worksheets("Sheet3") Application.ScreenUpdating = False ws2.Cells.ClearContents ws1.Rows(1).Copy Destination:=ws2.Cells(1, 1) ws1.Cells.Copy Destination:=ws3.Cells(1, 1) For i = 2 To ws3.Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Columns(1), ws3.Cells(i, 1)) = 0 Then ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws3.Cells(i, 1) End If Next i ws3.Range("A:E").Sort key1:=ws3.Cells(1, 5), order1:=xlDescending For k = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row ws3.Range("A:E").AutoFilter field:=1, Criteria1:=ws2.Cells(k, 1) i = 2 Do Until ws3.Rows(i).Hidden = False i = i + 1 Loop Range(ws3.Cells(i, 2), ws3.Cells(i, 5)).Copy Destination:=ws2.Cells(k, 2) Next k ws3.Range("A:E").Delete ws2.Activate Application.ScreenUpdating = True End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m
お礼
すごいです!完璧です。 ありがとうございます! 追加で確認なのですが、 列が増えた場合、どのコードを修正すれば良いでしょうか? また注文日に当たるコードはどの部分か教えて頂けないでしょうか。
- LHS07
- ベストアンサー率22% (510/2221)
BASICを勉強すればできるようになります。
- akina_line
- ベストアンサー率34% (1124/3287)
こんにちは。 データが日付順に並んでいるとして、 11111 田中 東京都 0 2012/8/9 11111 田中 東京都 0 2012/8/10 11112 佐藤 京都府 0 2012/8/10 11113 鈴木 北海道 0 2012/8/11 11113 鈴木 北海道 0 2012/8/15 11111 田中 東京都 0 2012/8/18 それをID順、日付順にソートし、 11111 田中 東京都 0 2012/8/9 11111 田中 東京都 0 2012/8/10 11111 田中 東京都 0 2012/8/18 ○ 11112 佐藤 京都府 0 2012/8/10 ○ 11113 鈴木 北海道 0 2012/8/11 11113 鈴木 北海道 0 2012/8/15 ○ F列に下のような式を入れます。 =IF(A9 <>A10,"○","") あとは、F列に○のついている行をソートなどでまとめれば良いと思います。 では。
お礼
ご回答ありがとうございます! 教えて頂いた内容で出来ましたが、 データ内に作業列を作ることは避けたい為、 マクロ上での動作を希望してます。
お礼
tom04様 事細かにご説明いただき、ありがとうございます! とてもわかりやすい解説で無事理解出来ました! これで作業を進めることが出来ます。 本当に助かりました!