- ベストアンサー
Excelで条件つき行削除について
下記のようなExcelの表があるとします。 A B C D E 1 会社A 会社B 会社C 会社D 2 仕事A 23 45 67 27 3 仕事B 45 24 65 33 4 小計 68 69 132 60 この状態のときはいいのですが、 A B C D E 1 会社A 会社B 会社C 会社D 2 仕事A 0 0 0 0 3 仕事B 0 0 0 0 4 小計 0 0 0 0 上記のようにB4、C4、D4、E4がそれぞれ「0」のときに4行目を削除または行の高さを「0」にするマクロを組みたいです。 わかる方がいましたらよろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>「小計」がある場所がC列で「0」の場所が、F、G、H、Iにある場合は > どうなるのでしょうか。 次のようになります。 4行目で「小計」がある列を文字列で指定します。 この「小計」から右に2つおいて、3つ目から4セル 0か空欄のときが対象になります。 Sub 小計全部ゼロ_行削除() Dim Rng As Range Dim Rw As Long Const Retu = "C" '<--- ここで「小計」の列を指定します。(0数値は右3つ目から) For Rw = Range(Retu & "65536").End(xlUp).Row To 1 Step -1 Set Rng = Range(Retu & Rw) If Trim(Rng.Value) = "小計" And _ Rng.Offset(, 3) = 0 And Rng.Offset(, 4) = 0 And _ Rng.Offset(, 5) = 0 And Rng.Offset(, 6) = 0 Then Rows(Rw).Delete End If Next Rw Set Rng = Nothing End Sub Sub 小計全部ゼロ_行非表示() Dim Rng As Range Const Retu = "C" '<--- ここで「小計」の列を指定します。 For Each Rng In Range(Retu & "1", Range(Retu & "65536").End(xlUp)) If Trim(Rng.Value) = "小計" And _ Rng.Offset(, 3) = 0 And Rng.Offset(, 4) = 0 And _ Rng.Offset(, 5) = 0 And Rng.Offset(, 6) = 0 Then Rng.EntireRow.Hidden = True End If Next Rng End Sub
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
既回答と同じことをしていますが、いろいろやり方があり、コードの印象は変ると言うことの実例。 Sub test02() For i = Range("A65536").End(xlUp).Row To 1 Step -1 p = InStr(Cells(i, "A"), "小計") x = Application.WorksheetFunction.And(p > 0, Cells(i, "B") = 0, Cells(i, "C") = 0, _ Cells(i, "D") = 0, Cells(i, "E") = 0) If x Then Rows(i).Delete End If Next i End Sub A列の「小計」の小と計の間のスペース数は統一して、上記 コードの「小計」部一個所を合わせてください。
- ja7awu
- ベストアンサー率62% (292/464)
行削除と非表示の両方の場合を書いておきます。 こんな感じで如何でしょうか。 Sub 小計全部ゼロ_行削除() Dim Rng As Range Dim Rw As Long For Rw = Range("A65536").End(xlUp).Row To 1 Step -1 Set Rng = Range("A" & Rw) If Trim(Rng.Value) = "小計" And _ Rng.Offset(, 1) = 0 And Rng.Offset(, 2) = 0 And _ Rng.Offset(, 3) = 0 And Rng.Offset(, 4) = 0 Then Rows(Rw).Delete End If Next Rw Set Rng = Nothing End Sub Sub 小計全部ゼロ_行非表示() Dim Rng As Range For Each Rng In Range("A1", Range("A65536").End(xlUp)) If Trim(Rng.Value) = "小計" And _ Rng.Offset(, 1) = 0 And Rng.Offset(, 2) = 0 And _ Rng.Offset(, 3) = 0 And Rng.Offset(, 4) = 0 Then Rng.EntireRow.Hidden = True End If Next Rng End Sub
補足
ありがとうございます。 このマクロのままだと実行できるのですが、「小計」がある場所がC列で「0」の場所がF、G、H、Iにある場合はどうなるのでしょうか自分でやって見たのですがエラーが出てしまいうまくいきませんでした。
- TTak
- ベストアンサー率52% (206/389)
> 小計という文字を認識し、その横にある数字を認識し、その条件がすべて「0」だった 即席ですが、Findメソッドと組み合わせた例です。この例では、A1~A300までの間に「小計」があったら、その列の2~5行目を検査して、すべて0ならその行を非表示にします。 ループ文が入っていますので、データが膨大な場合は処理が遅くなり、お勧めできません。 Private Sub Worksheet_Calculate() Cells.EntireRow.Hidden = False With ActiveSheet.Range("A1:A300") Set c = .Find("小計", LookIn:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do Set c = .FindNext(c) r = Range(c.Address).Row If Cells(r, 2).Value = 0 And _ Cells(r, 3).Value = 0 And _ Cells(r, 4).Value = 0 And _ Cells(r, 5).Value = 0 Then Rows(Range(c.Address).Row).Hidden = True End If Loop While Not c Is Nothing And c.Address <> firstAddress End If End With Set c = Nothing End Sub WIN2000 EXCEL2000動作
- chie65536
- ベストアンサー率41% (2512/6032)
空いている列、例えばF列にオートフィルタを設定し、フィルタの内容を「0以外」にしておきます。 見出し行など消したくない行はF列(F1など)に「1」と入力しておき、文字色を白にして隠します。 他の行はF列に「=SUM(B2:E2)」など、その行のB~F列の合計を出るようにして、同じく、文字色を白にして隠します。 数値を書き替えた後に「フィルタの実行」を行えば、全部ゼロの行は自動的に隠されます。 また、全部ゼロになって隠れている行にゼロ以外の値を入れ直したい場合は「フィルタの解除」を行います。 なお、小計の行だけ隠したい場合は「仕事A」や「仕事B」の行のF列(F2やF3)に「1」と入れておけば良いでしょう(見出し行と同じ扱いにする)
- TTak
- ベストアンサー率52% (206/389)
> B4、C4、D4、E4がそれぞれ「0」のときに4行目を > 行の高さを「0」にするマクロ Calculateイベントで再計算が行われた直後に条件のセルの値がすべて"0"であれば、4行目を非表示にします。該当シートのコードウインドウに記述してください。 Private Sub Worksheet_Calculate() If Range("B4").Value = 0 And _ Range("C4").Value = 0 And _ Range("D4").Value = 0 And _ Range("E4").Value = 0 Then Rows("4:4").Hidden = True Else Rows("4:4").Hidden = False End If End Sub WIN2000,EXCEL2000で動作
補足
すいません説明不足でした。 小計という文字を認識し、その横にある数字を認識し、その条件がすべて「0」だった場合に処理を行いたいのです。 よろしくお願いします。
お礼
うまくいきました。 ありがとうございました。
補足
小計全部ゼロ_行非表示の方で行ったのですが、デバックエラーが出てしまいました。