- 締切済み
EXCELの行を指定して削除する方法
下記のような商品の管理表があり、12月~3月以外の納入月の行を削除した表を作成しようと考えております。 通常でしたら並び替え後削除すれば済む話なのですが、 1商品3行でワンセットとなっており(「登録番号」列参照)、単純に「納入月」で並び替えると ほかの商品の「*」が混在してしまいます。 力技で該当箇所を3行ずつ削除しようにも膨大な量の為、ケアレスミスが心配です。 丸投げする形で本当に申し訳ございませんが、皆様のお知恵を借りたくよろしくお願い致します。 登録番号 商品・・・・・・・・・・・・・・・・・・・納入月 1 A 2011107 1 * * 1 * * 2 B 20101225 2 * * 2 * * 3 C 20100301 3 * * 3 * * 4 D 20100702 4 * * 4 * * ・ ・ ・ ・ ・ ・ ・ ・ ・ 40000
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
>「納入月」で並び替えるとほかの商品の「*」が混在してしまいます 正確に3行で1セットになっているなら 空き列(A1)に =INT((ROW()-1)/3)+1 と入れて下方向に式を複写すると、1,1,1,2,2,2、・・のような番号が振れます。 日付列+番号列で並び替えれば、日付を見るだけで、>12月~3月以外の納入月の行を範囲愛体で着ますので、あとは行削除すれば良い・ ーー VBAでやる方法もあるがまあそこまで?? ーー また 日付でフィルタをかけて、可視セルを捕まえて、コピー貼り付けすれば出来る
- old-tigers
- ベストアンサー率50% (35/70)
納入月の右のセルは空いていると考えて宜しいですね。(M列と仮定します) 残すデータが12月~3月であることを考慮します。 1)M1~M3を結合します(登録番号1の3行)。 2)結合したセルに以下の計算式を入力します。 = IF(OR(MONTH(L2)=12,AND(MONTH(L2)=>1,MONTH(L2)=<3)),0,1) 3)結合したセルを最下行(40001行)までコピーします。 4)A2~M40001を範囲指定し、M列をキーに昇順でソートします。 5)M列を範囲指定し、”1”をキーに検索します。 6)検索行から最終行までを削除します。 こんな感じで如何でしょうか? ただし、納入月が文字データの場合は、一度日付データに変換が必要です。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 一つの提案です。 >12月~3月以外の納入月の行を削除した表を作成しようと・・・ とありますが、削除するのではなく別Sheetに削除するもの以外を抽出してはどうでしょうか? 「12月~3月以外の納入月の行を削除」ということは「12月~3月」のデータのみを表示すれば良いと思いますので、VBAでの一例です。 Alt+F11キーを押してみてください。VBE画面が出ますので、↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) 尚、Sheet2の項目も↓の画像のようにSheet1と全く同じものを用意しておきます。 実際の「納入月」の列が判らないので、こちらで勝手にF列にしていますので、お使いのSheetの列に合わせてコート内の数値を変更してみてください。 コード内の Cells(i,6) の「6」がF列ということになります。 仮にH列であれば「6」を「8」に変更すれば大丈夫です。 Sub test() 'この行から Dim i As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row Step 3 '↓Sheet1の日付列をF列としています(実際のデータによって「6」の部分を変更してください。) If Month(ws1.Cells(i, 6)) = 12 Or Month(ws1.Cells(i, 6)) <= 3 Then Range(ws1.Cells(i, 1), ws1.Cells(i + 2, 6)).Copy ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1).Select ActiveSheet.Paste End If Next i Application.CutCopyMode = False ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1).Select End Sub 'この行まで 参考になれば良いのですが。m(__)m
3行で一つの製品を示しているなら、全ての行に納入年月日を記入すれば解決するような気がします。 ケアレスミスを心配するなら、そのくらいの力業を使ってもいいと思うんです。 日付が入力されていない場所に日付を入れるのですから分かりやすいよう先頭に列を挿入してそこに新規に作っちゃえばいいと思います。 納入日が入力されている列がE列なら、新規にA列を作って =E1 =E1 =E1 と3つ並べて書いたらその3つのセルを下へコピーするだけで簡単にできます。 できたらA列をコピーして「形式を選択して貼り付け」から「値」を選んで貼り付ければいいでしょう。 貼り付けまで終われば、あとはA列を並べ替えの対象にすれば良いですよ。 日付順に並んでくれますから不要な月の行をまとめて消しちゃいましょう。 不要な行を消し終わったらA列も削除して元の並び順に戻しておけば完璧です。