ExcelマクロVBAでE列の注文日が最大の行を表示する方法

このQ&Aのポイント
  • ExcelマクロVBAを使用して、A列のIDでくくった場合に、E列の注文日が最大の行を表示する方法について教えてください。
  • Excel2007やXPでの作業を前提に、A列のIDでグループ化し、E列の注文日が最大の行を抽出するためのExcelマクロVBAのコードや手順について教えてください。
  • ExcelマクロVBAを利用して、A列のIDでデータをグループ化し、E列の注文日が最大の行のみを抽出する方法について教えてください。
回答を見る
  • ベストアンサー

EXCELマクロVBAについて

Excel2007、XPを使用しています。 AからE列に下記のような情報が入力されています。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/10 11111 / 田中 / 東京都 / 00000000000 / 2012/08/09 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/11 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 A列のIDでくくったとして、 E列の注文日が最大のみの行を表示させたいです。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 このようなことはマクロで可能なのでしょうか? 恐れ入りますがご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.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

mitsunori32
質問者

お礼

tom04様 事細かにご説明いただき、ありがとうございます! とてもわかりやすい解説で無事理解出来ました! これで作業を進めることが出来ます。 本当に助かりました!

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! 一例です。 元データは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

mitsunori32
質問者

お礼

すごいです!完璧です。 ありがとうございます! 追加で確認なのですが、 列が増えた場合、どのコードを修正すれば良いでしょうか? また注文日に当たるコードはどの部分か教えて頂けないでしょうか。

  • LHS07
  • ベストアンサー率22% (510/2221)
回答No.2

BASICを勉強すればできるようになります。

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.1

こんにちは。  データが日付順に並んでいるとして、 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列に○のついている行をソートなどでまとめれば良いと思います。 では。

mitsunori32
質問者

お礼

ご回答ありがとうございます! 教えて頂いた内容で出来ましたが、 データ内に作業列を作ることは避けたい為、 マクロ上での動作を希望してます。

関連するQ&A

  • エクセルのデータ並べ替え(抽出)の方法

    エクセルのデータ並べ替え(抽出)の方法 を教えてください。 下記のようなデータがあるとします。   A    B    C   D 1 田中  東京  千葉  福岡 2 山田  京都  滋賀 3 佐藤  奈良  青森  USA 4 鈴木  カナダ 愛媛 A列は名前、B列以降は文字列です。B列以降はC列までの行、D列までの行とさまざまです。重複セルはありません。 これを下記のように並べ替えたいです。   A    B    C   D 1東京  田中 2千葉  田中 3福岡  田中 4京都  山田 5滋賀  山田 6奈良  佐藤 7青森  佐藤 8USA   佐藤 9カナダ 鈴木 10愛媛  鈴木 こういうことは可能でしょうか??? 教えてください。 よろしくお願いします。

  • 【至急】エクセルで、一致するデータを紐付けたい

    エクセルでsheet1のA列のデータに、sheet2の並び順の異なるA列~F列のデータを紐付け、一致、並び替えする方法がありましたら、ご教授ください。よろしくお願いいたします。 ※sheet1のA列とsheet2のA列は、同じデータですが順不同で入力されています。 sheet1 A   B   C   D   E   F   G 田中 斉藤 新井 伊東 塚越 佐藤 吉田 sheet2 A   B    C     D      E      F   斉藤 東京都 文京区 123-0000 0120-・・・ × 伊東 東京都 台東区 123-1000 0120-・・・ ○ 新井 東京都 江東区 123-0000 0120-・・・ × 吉田 東京都 豊島区 121-0100 0120-・・・ △ 塚越 東京都 文京区 122-0000 0120-・・・ × 佐藤 東京都 新宿区 121-0000 0120-・・・ ○ 田中 東京都 大田区 111-0000 0120-・・・ ◎ ◆得たい結果◆ sheet1 A   B   C    D      E      F     G 田中 田中 東京都 大田区 111-0000 0120-・・・ ◎ 斉藤 斉藤 東京都 文京区 123-0000 0120-・・・ × 新井 新井 東京都 江東区 123-0000 0120-・・・ × 伊東 伊東 東京都 台東区 123-1000 0120-・・・ ○ 塚越 塚越 東京都 文京区 122-0000 0120-・・・ × 佐藤 佐藤 東京都 新宿区 121-0000 0120-・・・ ○ 吉田 吉田 東京都 豊島区 121-0100 0120-・・・ △

  • エクセルシート間の照合について

    エクセルシート間で照合をしたいと思っています。 照合する項目は2つ。2つともあえばそのA列のデータを表示するというものです。 データは シート1(前年) A  B  C  D 1  田中 123 東京都・・ 5  佐藤 124 千葉県・・ 3  山本 128 埼玉県・・ シート2(今年) A  B  C  D   山本 128 埼玉県・・   佐藤 124 北海道・・   田中 123 東京都・・ C列とD列を照合し2つともあえばシート2のA列にシート1のA列のデータを入力する。なければ「なし」と入力できるようにしたいのです。 上の場合は山本のA列に「3」佐藤には「なし」田中には「1」と入るのうになればと思います。 入力されている列は同じですが順番はばらばらです。データ数は1万件を超えています。 どなたかアドバイスいただければと思います。よろしくお願いします。     

  • エクセルで一覧作成

    エクセルで一覧作成 エクセルで以下のデータを作成したいのですが どのような関数を使用したらよいのでしょうか?    A   B  C  D 1 東京 田中 鈴木 小林 2 東京 鈴木  3 大阪 伊藤 鈴木  4 東京 佐藤 5 三重 小林 田中        ↓    A   B   C   D   E   F   G 1 東京 田中 鈴木 小林 鈴木 佐藤 2 大阪 伊藤 鈴木 3 三重 小林 田中 よろしくお願いします。

  • エクセルで、次のような自動入力をしたい

      A    B    C    D   E  ・・ AA 1 田中 鈴木 佐藤          山田 2 鈴木 山田              海岡 3 田中 佐藤              佐藤 というような表があり、AAの列に名前を入力したとき、 D1に「山田」、C2「海岡」と、その行に関してAA列に新規の名前が入力されたときにD1,C2に自動入力することは、VBAで簡単にできますか? 3列目には「佐藤」さんがすでいるので入力不要です。 よろしくお願いします。(マクロ初心者です)

  • エクセルVBAの質問です

    sample.xlsがあり内容は下記のように A列に名前、B列に数字が入り、行数は一定でありません 田中一郎 3 鈴木健一 5 佐藤太郎 8 田中一郎 5 田中一郎 2 佐藤太郎 7 鈴木健一 3 佐藤太郎 9 鈴木健一 54 佐藤太郎 8 田中一郎 9 このエクセルシートにコマンドボタンを付け、VBAでコマンドボタンを押した場合 指定したエクセルファイル”kekka.xls”に 田中一郎 19 鈴木健一 62 佐藤太郎 32 と言うように、名前別でその氏名の横の数字の合計を表示させたいと考えています。 何卒お知恵をお貸しください、お願いします。

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

    エクセルVBAの質問です。 (1)の一覧から「出張」の項目のみを抽出し、別シートへ(2)のような形で記載したいのですが、VBA初心者なのでこれが出来るのかもよく分かりません。もし出来るならやり方を教えてください。 (1)  A     B     C   D E  F   G     H    I JOB NO   内容   担当者   日付    日数   行先   時間 02AAA001  出張   田中  2/2 ~ 2/4  3日間   名古屋  日勤 02AAA002  出張   佐藤  2/3 ~ 2/4  2日間   大阪   夜勤 02AAA003  作業   鈴木  2/5 ~ 2/8  4日間   工場   日勤 02AAA004  出張   吉田  2/4 ~ 2/6  3日間   東京   夜勤  ・  ・   ↓↓ (2)  A B   C     D     E     F       佐藤   田中   鈴木   吉田 2/1 日 2/2 月         名古屋 2/3 火  *大阪   名古屋 2/4 水  *大阪   名古屋     *東京 2/5 木                   *東京 2/6 金                   *東京 2/7 土  ・  ・ ☆出張の場合のみ(2)表に記載する ☆日付、曜日、氏名は既に入っていて、日付と氏名の交差する所に行先を入れる。 ☆夜勤の場合、行先の前に『*』を入れる。 説明が下手ですみません。分かる方いらっしゃいましたらお願い致します。

  • Excel行毎に項目列数の違う表を行列変換したい

    A列に何かしらの名称、B列以降に文字列値があるとします。 鈴木|あああ|いいい|ううう| 佐藤|えええ|   |   | 田中|ううう|かかか|   | ・・・ という表を、 鈴木|あああ 鈴木|いいい 鈴木|ううう 佐藤|えええ 田中|ううう 田中|かかか ・・・ というように変換したいのですが、うまい方法ありませんか?

  • excelデータの切り貼りマクロ

    excelマクロの初心者です。 データの切り貼りをするマクロについて教えてください。 以下のような担当者と会社名の入った縦に大きなデータを 担当 社名 佐藤 A社 佐藤 B社 佐藤 C社 田中 D社 田中 E社 田中 F社 鈴木 G社 鈴木 H社 鈴木 I社 高橋 J社 高橋 K社 高橋 L社 最終的に 佐藤 田中 鈴木 高橋 A社 D社 G社 J社 B社 E社 H社 K社 C社 F社 I社 L社 このように一番上に担当者、下に該当する社名を羅列されるように切り貼りをしたいと思っています。 ファイルがいくつもあり、また行数はファイルごとに異なり一定ではありません。 マクロでどのように書いたらよいかご教授頂けないでしょうか。 よろしくお願いいたします<(_ _)>

  • エクセルでの集計関数No.2

    前回の質問より複雑なデータの集計が飛び込んで困っています。 例    A   B   C   D   E   F   G   H   I   J 1  鈴木 田中 佐藤 八木 石島 須藤 徳間 遠藤 伊藤 斉藤 2  田中 八木 田中 遠藤 鈴木 伊藤 佐藤 佐藤 鈴木 徳間 3  石島 鈴木 徳間 鈴木 伊藤 .... といったデータが存在しています(A1:J3)の範囲内で最頻値の文字列を検出する関数の組み合わせを教えてください。回答例 鈴木  しかも、鈴木 佐藤が同一の場合メッセージを表示させるには..とほほです。よろしくお願いします。