- ベストアンサー
エクセルVBAで表から行の削除
- エクセルVBAを使用して、表から行を削除する方法について教えてください。
- 表は名前でソートされており、特定の列の比率をチェックして、100でない行を削除したいです。
- 同じ名前が複数行に分かれている場合、最大の比率の行を残し、他の行を削除する方法を知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは >表はB列の名前でソートされています。 D列もソートすれば楽になると思いますが Sub Test2() Dim c As Range Dim LastRow As Long, i As Long Dim Tot As Long LastRow = Cells(Rows.Count, "D").End(xlUp).Row Range("A1:D" & LastRow).Sort _ Key1:=Range("B1"), Order1:=xlAscending, _ Key2:=Range("D1"), Order2:=xlDescending, Header:=xlYes For i = LastRow To 2 Step -1 If Tot + Cells(i, "D").Value < 100 Then Tot = Tot + Cells(i, "D").Value Cells(i, "D").EntireRow.Delete Else Tot = 0 End If Next End Sub
その他の回答 (1)
- TAKA_R
- ベストアンサー率32% (26/79)
B列が複数あるとき、D列の中の最高値を残す Sub test01() Dim k As Long, g As Long, l As Long, n As Long Dim brng As Range Set brng = Range(Cells(2, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)) k = 1 Do k = k + 1 g = Application.WorksheetFunction.CountIf(brng, Range("b" & k).Value) If Not g = 1 Then l = Application.WorksheetFunction.Max(Range(Cells(k, 4), Cells(k + g - 1, 4))) n = Application.WorksheetFunction.Match(l, Range(Cells(k, 4), Cells(k + g - 1, 4)), 0) - 1 Rows(k + n).Copy Range("a" & k) Range(Rows(k + 1), Rows(k + g - 1)).Delete End If Loop Until Range("b" & k + 1) = "" End Sub ですが、NO1さんが言っているように「B列昇順、D列降順」で並び替えておくと、 こんなに簡単なコードになります。 Sub test02() Dim k As Long, g As Long k = 1 Do k = k + 1 g = Application.WorksheetFunction.CountIf(Range(Cells(2, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)), Range("b" & k).Value) If Not g = 1 Then Range(Rows(k + 1), Rows(k + g - 1)).Delete Loop Until Range("b" & k + 1) = "" End Sub
お礼
TAKA_Rさん、ありがとうございます。 とても勉強になりました。
お礼
watabe007さん、さっそくのご回答ありがとうございます。 なあるほど~! 比率も降順で並べ替えしてしまえば下から順に合計100未満を片っ端から消していけばいいわけですね! 勉強になりました。 ありがとうございます。