Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2021)
色付きセルを含む行を別シートにコピーする方法
投稿日時: 22/11/04 15:16:25
投稿者: yusukyo0123

VBA超初心者です。
エクセルの色付きセルを含む行のみ抽出し、別シートにコピーしたいのですが、ネットを検索してもセルのみの抽出・コピーしか探せませんでした。。
しかもセルのみの抽出・コピーもなぜかうまくいきません。TEST用エクセルでは動くのですが、本番用のものでは動きません。(エラーも出ません)
Sheet1はA4-O999までの表で、L、M、N、O列に色付きセルが発生します。(エクセル関数を入力、条件付き書式にて色付け設定、重複行で色付き発生は無し)
L、M、N、O列のいずれかのセルが黄色になったら行ごとコピーしてSheet2に貼り付けたいです。
コードについてご教示頂けませんでしょうか。
 
Sub Macro1()
'
' Macro1 Macro
'
 
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet
Dim LastRow As Long
Dim i As Long
Dim j As Long
    
    j = 2
 
    Set Sh1 = Sheets("Sheet1")
    Set Sh2 = Sheets("Sheet2")
 
    '最終行を取得
    LastRow = Sh1.Cells(Rows.Count, 1).End(xlUp).Row
 
    'セルをループして黄色だったら、Sheet2へ転記
    For i = 5 To LastRow
        If Sh1.Cells(i, 12).Interior.Color = 65535 Then
            Sh1.Cells(i, 12).Copy Sh2.Cells(j, 1)
            j = j + 1
        End If
    Next i
 
    Set Sh1 = Nothing
    Set Sh2 = Nothing
 
End Sub

回答
投稿日時: 22/11/04 15:50:57
投稿者: WinArrow
投稿者のウェブサイトに移動

まず最初に
条件付き書式の機能を理解することです。
 
「条件付き」とは、
条件を指定するには、数式を使います。
その条件に合致した時だけ、書式(今回の場合、黄色の塗りつぶし)が反映されます。
 
従って、塗りつぶし=黄色で判断しても、それは「条件付き書式」の色とは違います。
 
取り敢えず、
色で判定するのではなく、
そのセルに設定したある数式と同じ条件で判定するに変更してみてください。

回答
投稿日時: 22/11/04 15:53:49
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
 
> Sh1.Cells(i, 12).Copy Sh2.Cells(j, 1)
 
このコードは、書式だけではなくすべて複写になってしまいますが
よいのですか?

回答
投稿日時: 22/11/04 16:09:41
投稿者: WinArrow
投稿者のウェブサイトに移動

追加の質問
 
>L、M、N、O列のいずれかのセルが黄色になったら行ごとコピーしてSheet2に貼り付けたいです。
と書いてありますが
コードを見ると
「L、M、N、O列のいずれかのセル」が、Lしか判断していないこと。
「行ごとコピー」が一つのセルだけになっていること
(Sheet1のL列セルだけをSheet2のA列に複写する)
 
確認したほうがよいですね?
 

回答
投稿日時: 22/11/04 16:13:57
投稿者: simple

ご指摘のとおり、条件に遡って、条件で判定する方法もあります。
 
また、次のような方法もあります。

If Sh1.Cells(i, 12).Interior.Color = 65535 Then

If Sh1.Cells(i, 12).DisplayFormat.Interior.Color = 65535 Then
に変更してください。
 
・前者(現行のもの)は条件付き書式によるものは対象外ですが、
・後者(DisplayFormatプロパティを使うもの)は、
 条件付き書式によるもの対象になります。
 
なお、当該部分以外は見ていませんのでご注意ください。

回答
投稿日時: 22/11/04 18:03:48
投稿者: WinArrow
投稿者のウェブサイトに移動

simleさんレスをお借りして
色判定関数を紹介します。
「行」のL〜O列セルを指定して、いづれかが条件付き書式の色が黄色だったら、Trueで返る
 

Function 色判定(ByVal MyRNG As Range)
Dim mFC As FormatCondition, Fx As Long, mRg As Range
Const 黄色 = vbYellow

色判定 = False
For Each mRg In MyRNG  'L,M,N,O
    If mRg.DisplayFormat.Interior.Color = 黄色 Then
        If mRg.FormatConditions.Count > 0 Then
            For Fx = 1 To mRg.FormatConditions.Count
                Set mFC = mRg.FormatConditions(Fx)
                If mFC.Interior.Color = 黄色 Then
                    Debug.Print "条件付き書式の背景色=黄色の条件:" & mFC.Formula1
                    色判定 = True
                End If
            Next
        End If
    End If
Next
End Function

行全体を複写するコード、但し、条件付き書式の条件がシート2で有効/無効は要検証
If 色判定(sh1.Cells(i, "L").Resize(, 4)) Then
    Sh1.Cells(i, "A").EntireRow.Copy Sh2.Cells(j, "a")
End If

回答
投稿日時: 22/11/04 18:09:03
投稿者: simple

こういうことでしょうか。参考にしてください。
(不明点あれば、具体質問してください。)
 

Sub test()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim j As Long

    Application.ScreenUpdating = False

    Set sh1 = Worksheets("Sheet1")
    Set sh2 = Worksheets("Sheet2")

    lastRow = sh1.Cells(Rows.Count, "A").End(xlUp).Row
    j = 1
    For i = 5 To lastRow
        If check(sh1.Cells(i, "L").Resize(, 4)) Then
            sh1.Rows(i).Copy
            sh2.Cells(j, 1).PasteSpecial Paste:=xlPasteValues
            sh2.Cells(j, 1).PasteSpecial Paste:=xlPasteFormats
            j = j + 1
        End If
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

Function check(rng As Range) As Boolean
    Dim r As Range
    For Each r In rng
        If r.DisplayFormat.Interior.Color = vbYellow Then
            check = True
            Exit Function
        End If
    Next
End Function

L〜O列の数式が自行以外を参照している可能性もあるので、
値と書式をコピー貼り付けしています。

投稿日時: 22/11/08 10:41:51
投稿者: yusukyo0123

WinArrowさん、Simpleさん、ご親切にありがとうございました。
お返事が遅くなり申し訳ございません。コードをご教示頂いたとおりに修正したら期待通りの結果を得ることができました。
大変助かりました。またご質問させていただくことがあると思いますが、どうぞよろしくお願いいたします。
 :D