- ベストアンサー
Excel VBAで範囲の条件付けを実現する方法
- Excel VBAを使用して、指定した範囲のセルに対して条件付き書式を設定する方法について解説します。
- 条件付き書式を使用することで、特定の条件に合致するセルに対して自動的に書式を設定することができます。
- 具体的には、背景色が赤いセルとその上方の最初の空白セルの下3行を別のシートにコピーする方法を紹介します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 > 具体的な環境は、 > A20が背景色が赤色で、その上に上がった最初の空白のセルが > A2であったりします。その下の3行とはA3,A4,A5なわけです。 > > 同じシート上で、背景色が赤色のセルがA30にあって、 > その上に上がった最初の空白セルA25であることもあります。 > その下の3行はA26,A27,A28です。 これなら #1 で動くと思うのですが、、、 Sheet1が下記の場合 A列 01 02 03 タイトル行1 04 タイトル行2 05 タイトル行3 06 入力1 07 入力2 08 入力3 09 入力4 10 入力5 11 入力6 12 入力7 13 入力8 14 入力9 15 入力10 16 入力11 17 入力12 18 入力13 19 入力14 20 赤いセル(空白以外) 21 22 23 24 25 26 タイトル行4 27 タイトル行5 28 タイトル行6 29 入力15 30 赤いセル(空白以外) Sheet4 はこうなりましたけど、、、 A列 01 02 03 タイトル行1 04 タイトル行2 05 タイトル行3 06 赤いセル(空白以外) 07 08 タイトル行4 09 タイトル行5 10 タイトル行6 11 赤いセル(空白以外)
その他の回答 (3)
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 まだ違うかも知れませんけど、参考に。 Sub Test1() Dim i As Long, r As Range, myArray myArray = Array("Sheet1", "Sheet2", "Sheet3") For cnt = 0 To 2 With Worksheets(myArray(cnt)) For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then If r Is Nothing Then Set r = .Range("A" & i).EntireRow Else Set r = Union(r, .Range("A" & i).EntireRow) End If End If Next i If Not r Is Nothing Then Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) r.Copy Destination:=Worksheets("Sheet4"). _ Range("A65536").End(xlUp).Offset(2, 0).EntireRow Set r = Nothing End If End With Next cnt End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 最初の質問では > 赤色のセルから上に上がって、 > 最初の空白のあるセルの下3行も一緒にコピペして > シート4に連れて行きたいのです。 とあり、「赤色セルを見つけた場合は上に必ず空白セルがあり、その空白セルの下3行もコピーしたい」と認識しています。 > 背景色が赤いセルとそのスグ上の3行をコピペしてしまう。 これに該当するのは「最初の赤色セルが A4 で A1~A3 に空白は無い」とか「A11が赤色セルでA7が空白セル」のような場合だと思います。 回答者はシートの構成が見れない(理解出来てない)ので、想像だけで書いています。 まる投げで完全な回答を求められても、シートの構成も解らない状態では何が悪いのかも解りませんし、質問の意図もつかめません。 ご自分の環境に合わせて修正するくらいは必要かと思いますよ。
お礼
回答者はシートの構成が見れない(理解出来てない)ので、想像だけで書いています。 すみません、おっしゃる通りです。 具体的な環境は、 A20が背景色が赤色で、その上に上がった最初の空白のセルが A2であったりします。その下の3行とはA3,A4,A5なわけです。 同じシート上で、背景色が赤色のセルがA30にあって、 その上に上がった最初の空白セルA25であることもあります。 その下の3行はA26,A27,A28です。 なのでそのような表現になっています。
- papayuka
- ベストアンサー率45% (1388/3066)
前の質問で補足に答える前に閉じられたので、ここに書きます。 http://okwave.jp/qa3452416.html 先の質問での説明ですが下記の誤りです。 「A列を1行目から調べて、『最後に残った背景が赤いセル(ColorIndex = 3)を含む行』および、その上方の空白セルから下3行がコピー状態になります」 ループさせているので途中行も判定してます。 従ってコピーしている部分のコード位置をループ内に変えて、コピー後に変数 r をいったんリセットすれば希望動作に近いと思います。 Sub Test() Dim i As Long, r As Range With Worksheets("Sheet1") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If If Not r Is Nothing Then r.Copy Destination:=Worksheets("Sheet4"). _ Range("A65536").End(xlUp).Offset(2, 0).EntireRow Set r = Nothing End If Next i End With End Sub
お礼
ありがとうございますm( _ _ )m 後は、最初にも書かせて頂きました通り、 【下記コードで実現出来ていないこと】 1.背景色が赤いセルとそのスグ上の3行をコピペしてしまう。 が解決できれば完璧です。 助かります。
お礼
本当に色々と考えてくださって、ありがとうございました。 上記の内容を書いてみて、キレイにマクロが動きました。 私の持っている元データのセルに何らかの 設定がされているようで、そちらでは動かないのですが、 それは別問題です。自分で調べてみます。 ありがとうございました!