塗りつぶされたセルが存在する行を削除するマクロ

このQ&Aのポイント
  • 任意の色で塗りつぶされたセルが存在する行を削除するExcelマクロの作り方を教えてください。
  • ExcelのVBAを用いて、任意の色で塗りつぶされたセルが存在する行を削除する方法を教えてください。
  • Excelで、塗りつぶされたセルが存在する行を削除するためのマクロを作成したいです。具体的な手順を教えてください。
回答を見る
  • ベストアンサー

色のないセルの行削除

任意の色で塗りつぶされたセルがあって、塗りつぶされたセルが存在する行を削除するマクロ。 Sub 行削除() Dim r As Integer Dim c As Integer For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1   For r = ActiveSheet.UsedRange.Rows.Count To 1 Step -1     If Cells(r, c).Interior.ColorIndex <> xlNone Then        Rows(r).Delete     End If   Next Next End Sub この逆のことがしたいのですが、わかりません。 ちなみにこのプログラムはそのままC&Pです。 内容もあまり理解できていません。(^_^;) 添付画像の逆に色のついた行だけ残したいです。 よろしくお願いします

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.5

>うまくいきましたが、タイトル行まで削除されました ありゃ、ごめんなさい。 直します。 Sub 行削除()    Dim r As Integer  Dim c As Integer  Dim DelFlg As Boolean '行削除フラグ    For r = ActiveSheet.UsedRange.Rows.Count To 2 Step -1      DelFlg = True   For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1    If Cells(r, c).Interior.ColorIndex <> xlNone Then     DelFlg = False     Exit For    End If   Next      If DelFlg = True Then    Rows(r).Delete   End If    Next End Sub

makisaori
質問者

お礼

ありがとうございます。 For r = ActiveSheet.UsedRange.Rows.Count To 2 Step -1のところがTo2になったんですね? 検証してみます。

その他の回答 (6)

  • kkkkkm
  • ベストアンサー率65% (1605/2442)
回答No.7

表をA1から始めるとも限らないとすれば以下のようにしてもいいかもです。 Sub 行削除色あり残す() Dim r As Integer Dim c As Integer For r = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row _ To ActiveSheet.UsedRange.Row + 1 Step -1 For c = ActiveSheet.UsedRange.Columns.Count + ActiveSheet.UsedRange.Column _ To ActiveSheet.UsedRange.Column Step -1 If Cells(r, c).Interior.ColorIndex <> xlNone Then Exit For End If If c = ActiveSheet.UsedRange.Column Then Rows(r).Delete End If Next Next End Sub

makisaori
質問者

お礼

ありがとうございます。動きを見ながら検証してみます。

  • skydaddy
  • ベストアンサー率51% (388/748)
回答No.6

#1です 最初のものは行全体に色がつけられてあるか、1列のフォーマットしか対応しませんでした。 修正を加えた下記で動くと思います。(当方ではうまくいきました) ただし、背景色の無いセルが白のバックグランドである場合は残されます。 白も消したい時は、 If Cells(r, c).Interior.ColorIndex <> xlNone Thenの行を If Cells(r, c).Interior.ColorIndex <> xlNone AND Cells(r, c).Interior.ColorIndex <> 2 Thenとしてください。 Sub 色なし行削除() Dim r As Integer Dim c As Integer Dim flag As Boolean For r = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 flag = False For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1 If Cells(r, c).Interior.ColorIndex <> xlNone Then flag = True End If Next If flag = False Then Rows(r).Delete Next End Sub

makisaori
質問者

お礼

ありがとうございます。またコピペして検証してみます

  • kkkkkm
  • ベストアンサー率65% (1605/2442)
回答No.4

こういうのも Sub 行削除色あり残す() Dim r As Integer Dim c As Integer For r = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1 If Cells(r, c).Interior.ColorIndex <> xlNone Then Exit For End If If c = 1 Then Rows(r).Delete End If Next Next End Sub

makisaori
質問者

お礼

ありがとうございます。コピペして検証してみます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Sub test01() lr = Range("A100000").End(xlUp).Row MsgBox lr rc = Range("xf2").End(xlToLeft).Column MsgBox rc '-- For i = lr To 2 Step -1 '最下の行からの方向行に繰り返す For j = 1 To rc '.Interior.ColorIndexが xlNone  でなければ、塗りつぶしあり、として行削除 If Cells(i, j).Interior.ColorIndex <> xlNone Then Rows(i).EntireRow.Delete Exit For End If Next j Next i End Sub このやり方は 最下の行からの方向行に繰り返す が要点です。 質問者のケースの場合、 .Interior.ColorIndexが xlNoneで,ない、で「塗りつぶしあり」が捉えられるケースかどうか、が心配ですが。 やってみてください。

makisaori
質問者

お礼

ありがとうございます。動きを見ながら、関数などを調べながら確認してみます。VBA初心者なので皆さんのVBAをコピペしながら覚えてます。

makisaori
質問者

補足

すみません、lr = Range("A100000").End(xlUp).Rowのところでいきなりエラーでとまりました。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

私だったら、次のようにフラグを使います。 Sub 行削除()    Dim r As Integer  Dim c As Integer  Dim DelFlg As Boolean '行削除フラグ    For r = ActiveSheet.UsedRange.Rows.Count To 1 Step -1      DelFlg = True   For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1    If Cells(r, c).Interior.ColorIndex <> xlNone Then     DelFlg = False     Exit For    End If   Next      If DelFlg = True Then    Rows(r).Delete   End If    Next End Sub

makisaori
質問者

お礼

ありがとうございます。動きを見ながら、関数などを調べながら確認してみます。VBA初心者なので皆さんのVBAをコピペしながら覚えてます。

makisaori
質問者

補足

うまくいきましたが、タイトル行まで削除されました

  • skydaddy
  • ベストアンサー率51% (388/748)
回答No.1

Sub 行削除_色なし() Dim r As Integer Dim c As Integer For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1   For r = ActiveSheet.UsedRange.Rows.Count To 1 Step -1     If Cells(r, c).Interior.ColorIndex = xlNone Then '<>を=に変換して色なしを削除        Rows(r).Delete     End If   Next Next End Sub

makisaori
質問者

お礼

ありがとうございます。動きを見ながら、関数などを調べながら確認してみます。VBA初心者なので皆さんのVBAをコピペしながら覚えてます。

makisaori
質問者

補足

コピペして実行したら全ての行が消えてしまいました。

関連するQ&A

  • マクロでファイルを読み込み、重複行を削除したい。

    35万件以上あるエクセルデータに対して、マクロを使って以下のような処理で重複業を削除したいと思っています。 Sub DeleteOldRow() Dim lastRow As Integer Dim i As Integer Dim j As Integer Dim strVal As String 'B列の最終行を求めます。 lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row '1行目から最終行の前まで繰り返します。 For i = 1 To lastRow - 1 'チェックする値を、strValに代入します。 strVal = ActiveSheet.Cells(i, 2).Value '今見てる行から、下をチェックします。 For j = i + 1 To lastRow 'もし、値が同じであれば、 If strVal = ActiveSheet.Cells(j, 2).Value Then '元の行を削除します ActiveSheet.Rows(i).Delete '最終行が1行減ったのでlastRowの値を減らします。 lastRow = lastRow - 1 'チェックしている行を1行前に戻します。 j = j - 1 End If Next j Next i End Sub 上記処理を35万件あるファイル上でマクロの実行すると、オーバーフローしてしまいました。マクロ側で対象ファイルを読み込むなどして、処理を軽くするやり方はありますでしょうか。上記処理にどのような処理を加えればスムーズに処理されるでしょうか。

  • エクセル マクロで行削除のコードについての質問です

    ある指定のセル範囲が空白ならその行自体を削除したいですが 上手くいきません。 記述したコードは以下の通りです。 Sub A01() Dim IRow As Long Dim d As Variant, i As Variant d = InputBox("抽出する日数を入力してください", "日数") If d = "" Then Exit Sub lRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lRow To 2 Step -1 If ActiveSheet.Range(Cells(i, 5), Cells(i, d)) = Empty Then ActiveSheet.Rows(i).EntireRow.Delete End If Next End Sub Ifの判定の部分でエラーが出ます。 どう修正したらよいかご教示願います。

  • 条件に一致すれば行を削除するVBA

    こんにちは、以下のVBAについて質問をさせてください!m(_ _)m(タイプミスがあったらすみません、処理は成功しています。) Dim data As Integer For data = Cells(Rows,Count 1).End(xlUp).Row To 2 Step -1 If Cells(data,29) = "おやつ" Then Rows(data).EntireRow.Delete End If Next おやつ 上記だと29列目に「おやつ」という文字が入っている行は消えるのですが、For data~の部分を For data = 2 To Cells(Rows,Count 1).End(xlDown).Row に変えると何も起こらなくなります。 上の行から処理するか下の行から処理するかの違いで、やっていることは同じだと思うのですが、なぜ上の行から処理をしようとするとうまくいかないのでしょうか…?!Step -1のようにどこかに+1というのを入れないといけないのでしょうか…? どなたかご教示いただけると大変嬉しいです、よろしくお願いいたします<(_ _)>

  • エクセル 同じ内容行削除マクロ 2

    シート1、シート2(基準)のB列を比較して同じ内容行を削除したいのですが、「栃木県3」と「#栃木県3」を同じのもと考えて削除されてしまいます。 Sub 削除()   Dim wh1     As Worksheet   Dim wh2     As Worksheet   Dim f      As Range   Dim wR     As Integer   Dim mR     As Long   Dim wStr    As String   '   Set wh1 = Worksheets("Sheet1")   Set wh2 = Worksheets("Sheet2")   wR = 0   With wh1     mR = .Cells(Rows.Count, "A").End(xlUp).Row     For wR = mR To 1 Step -1       wStr = .Cells(wR, "B")       Set f = wh2.Range("B1:B" & wh2.Cells(Rows.Count, "B").End(xlUp).Row).Find(wStr)       If Not f Is Nothing Then         .Rows(wR).Delete       End If     Next   End With End Sub 解決策教えて下さい。

  • 特定の文字を含まないセルの行を削除するには

    いつもお世話になっております。 特定の文字列(下記では"0610")を含まないセルの行を削除するプログラムを組むにはどのようにしたどのようにしたらよいのでしょうか。 以下のようなプログラムを組んでみました。 Sub test() Dim i As Long With Range("C1") For i = .CurrentRegion.Rows.Count To 1 Step -1 If .Offset(i, 0) <> "0610*" Then .Offset(i,0).EntireRow.Delete Next i End With End Sub しかしこれでは先頭行を残し全ての行が削除されてしまいます。 IF文の"<>"がうまくないのだと思いますが、Like演算子の反対のようなものはありませんでしょうか。ご教授いただければ幸いです。 *ちなみに上のプログラムは'06年10月以外のデータは削除するために作ったものです。

  • VBA どこでもセル選択

    教えて頂いたVBAなのですがもう一つ Sub Macro1() Dim Ws01 As Worksheet Dim Counter As Long, i As Long, j As Long Dim INP As String Set wS = Worksheets("Sheet4") wS.Cells.ClearContents For i = 3 To ActiveSheet.UsedRange.Rows.Count INP = "" For j = Selection(1).Column To Selection(Selection.Count).Column If Cells(i, j) = 1 Then INP = INP & Cells(2, j) & "," End If Next j Counter = Counter + 1 If INP <> "" Then wS.Cells(Counter, "A") = Left(INP, Len(INP) - 1) End If Next i End Sub -------------------------------------------------------------- For i = 3 のところを3としないでどのセル(行)にも対応させたいのですが どうすればいいでしょうか?

  • エクセルマクロでEnd Subが見つからないとでる

    Excelのマクロ記述についての質問です.  以下のマクロはエクセルにない関数「IMMULT」をあらかじめ定義するためのものです.(技術計算のHPより入手し,コピーして貼り付けたものです)  これを実行すると「End Subがみつからない」と出てしまいます.End Subは記述しているのになぜでしょうか,どなたか解決策を教えて頂けませんか! Sub 関数定義() Public Function IMMULT(a As Range, b As Range) As Variant Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer Dim r As Integer, c As Integer Dim cr As Integer, cc As Integer Dim n As Integer Dim mm() As Variant r1 = a.Rows.Count r2 = b.Rows.Count c1 = a.Columns.Count c2 = b.Columns.Count If (c1 = r2) Then nn = c1 Else Exit Function End If cr = r1 cc = c2 ReDim mm(1 To cr, 1 To cc) For r = 1 To cr For c = 1 To cc mm(r, c) = 0 For n = 1 To nn mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c))) Next Next Next IMMULT = mm End Sub

  • マクロ実行が遅い・・・

    皆さんにおしえてもらいながら下記のようなマクロを組みました。 しかし、マクロを実行すると計算中が長いのです。 もしこのマクロに原因があれば教えてください。 よろしくお願いします。 -------------------------- Sub 見積書作成() Sheets("見積書").Select '見積書シートを選択 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 If Cells(i, 5).Value = "0" Then '工数が「0」のときは Rows(i).RowHeight = 0 '行高さ「0」 End If Next For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 Range("E8:E55") = Application.Round(Range("E8:E55"), 0) '工数を四捨五入 Next 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(, 6) = 0 Then Rng.EntireRow.Hidden = True End If Next Rng End Sub

  • EXCELVBAで行の削除

    WIN98SE EXCEL2000です。 G列に99の文字があったらその行を削除するというVBAを下記のように作りました。 Dim i As Integer Dim rowcount As Integer rowcount = Cells(1,1).CurrentRegion.Rows.Count For i = 1 To rowcount If Cells(i, 7) = "99" Then Rows(i).Delete Next i これを実行するとG列に99のある行が連続してあると1行おきに削除されます。どこをなおせばよいのか教えてください。よろしくお願いします。

  • Excelセル範囲内の値のみ1行空欄にする

    下記コードでは1行づつ挿入により下段までずれてしまいます。 Excelセル範囲内の値のみ1行づつ開けるにはどのようにすれば良いでしょうか。 どなたか解る方よろしくお願いします。 Sub 空欄1行() Dim i As Long If TypeName(Selection) <> "Range" Then Exit Sub With Selection For i = .Rows.Count To 2 Step -1 Intersect(.Cells(i, 1).EntireRow, .Columns).Insert xlDown Next End With End Sub

専門家に質問してみよう