Excel (VBA)

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

 
(Windows 11 Pro : Excel 2021)
Interior.Color = vbYellow Then にヒットするハズなのにヒットしない 
投稿日時: 24/02/10 10:22:28
投稿者: Nubo

ws.Cells(50,"B")は,事前処理で黄色(vbYellow)に着色済みで
wsシート上では間違いなく黄色(vbYellow)に着色済みを確認後に
マクロをSTOPで止めてF8でマクロを進めるとws.Cells(50,"B")は,
If ws.Cells(i, "B").Interior.Color = vbYellow Then にヒットするハズなのにヒットしない
原因が不明なのでどういう事が考えられるか?
教えてほしい。
 
なお、
? ws.Cells(50,"B") ---> BAAA-001 test.txt は正しく表示されている
 
ローカルウインドウで調べたら
ws.Cells(50,"B")は黄色(vbYellow)で着色されているのに
? ws.Cells(50,"B").Interior.color ---> 16777215
 
ws.Cells(52,"B")は着色されていない別のセルも
? ws.Cells(50,"B").Interior.color ---> 16777215

回答
投稿日時: 24/02/10 11:39:16
投稿者: WinArrow

ステップ実行で、確認しているようですが、
「i」の値も確認していますか
 

引用:

?ws.Cells(52,"B")は着色されていない別のセルも
? ws.Cells(50,"B").Interior.color ---> 16777215

↑の説明はおかしいですよ・・・
あwてずに、落ち着いて、再度、しましょう。

投稿日時: 24/02/10 11:48:23
投稿者: Nubo

すいません、訂正します。
 
ws.Cells(52,"B")は着色されていない別のセルも
? ws.Cells(52,"B").Interior.color ---> 16777215
 
>「i」の値も確認していますか
 
はい、F8でi=50まで進めて
If ws.Cells(i, "B").Interior.Color = vbYellow Then がTRUE になるはずなのに
着色されていない他のセルと同じくスルーされます。

投稿日時: 24/02/10 12:37:34
投稿者: Nubo

>事前処理とは条件付き書式をつかっています、ということは無いですね?
 
 
セルの着色にセル(Rangeオブジェクト)のFormatConditionsコレクションを利用しているので
条件付き書式です。
 
FormatConditions.Add(xlExpression, Formula1:="=RC[3]>1").Interior.Color = vbYellow
 
このような場合は、どうして処理すればいいですか ?
 

回答
投稿日時: 24/02/10 12:46:08
投稿者: WinArrow

simpleさん、ご指摘の通り、条件付き書式でしtsか・・・・
 
案1:
ifの条件を「条件付き書式」と同じ条件に修正することで対応出来るはず。

回答
投稿日時: 24/02/10 12:52:02
投稿者: WinArrow

案2を忘れました。
DisplayFormat
を使う方法
があります。

投稿日時: 24/02/10 13:27:53
投稿者: Nubo

ありがとうございます。
 
>案1
以下のように考えてみましたが上手く処理出来ませんでした。
 
            'B列の操作範囲を指定
            Set rng = ws.Range("B2").Resize(500,)
             
            ' 各セルをチェック
            For Each cell In rng
                  If cell.Interior.Color = vbYellow Then
                        'その行のデータを重複シートにコピー
                        ws.Rows(i).Copy ws2.Rows(nextRow)
 
>案2を忘れました。
>DisplayFormat
>を使う方法があります。
 
こちらで上手く処理できました。
 
       If lastRow >= 2 Then
            '重複シートの書き出し行
            Dim nextRow As Long
            nextRow = 2
            Stop
             
            For i = 2 To lastRow
                  If ws.Cells(i, "B").DisplayFormat.Interior.Color = vbYellow Then
                        'その行のデータを重複シートにコピー
                        ws.Rows(i).Copy ws2.Rows(nextRow)
                        '重複シートの書き込み行を更新
                        nextRow = nextRow + 1
                  
                  End If
            Next
      Else
            MsgBox "重複ファイルはありません。"
            Exit Sub
      End If

投稿日時: 24/02/10 14:37:48
投稿者: Nubo

条件付き書式で着色された行を別シートに行をコピーした場合、
着色も保持されてコピーされました。
 
(そもそも、条件付き書式で別シートに行をコピーした場合は
   これはまだ条件付きが生きていますか?
   それとも、コピーした時点で条件付きは解消されますか?)
 
他の条件で塗り替えを行おうとしましたが上手く処理できません。
If文は思うところでTrueとなって塗り替えコード(1,2)に進みますが
1,2を試しましたが塗り替えは発生しません。
 
どう処理したら良いですか?
 
 
      '重複シートのB列の最終行を取得
      lastRow = ws2.Cells(Rows.Count, "B").End(xlUp).Row
     
  
      '重複シートのB列のデータをループでチェック
      For i = 2 To lastRow
            str = CStr(ws2.Cells(i, "B").Value)
            If Left(str, 1) = " " Or Left(str, 1) = " " Then
                  'ws2.Cells(i, "B").Interior.ColorIndex = 4 '黄緑     ------>1
                  ws2.Cells(i, "B").DisplayFormat.Interior.ColorIndex = 4 ---->2
            End If
      Next i
             
  
   

回答
投稿日時: 24/02/10 14:56:45
投稿者: WinArrow

引用:
>案1
以下のように考えてみましたが上手く処理出来ませんでした。
  
            'B列の操作範囲を指定
            Set rng = ws.Range("B2").Resize(500,)
              
            ' 各セルをチェック
            For Each cell In rng
                  If cell.Interior.Color = vbYellow Then
                        'その行のデータを重複シートにコピー
                        ws.Rows(i).Copy ws2.Rows(nextRow)
 

> If cell.Interior.Color = vbYellow Then
この条件を変更するようれすあいたはずです。
条件付き書式の条件とは
>Formula1:="=RC[3]>1"
です。RC[3]が、何処のセルなのか判断できませんんで、
Cell(色を判断しているセル)と条件のンkのセルの関係を組み込みます。
色設定セルの一つ左セルの場合
                  If cell.Offset(,-1).Value > 1 Then
というかたちになります。

投稿日時: 24/02/10 15:17:11
投稿者: Nubo

> If cell.Interior.Color = vbYellow Then
>この条件を変更するようれすあいたはずです。
>条件付き書式の条件とは
>Formula1:="=RC[3]>1"
>です。RC[3]が、何処のセルなのか判断できませんんで、
>Cell(色を判断しているセル)と条件のンkのセルの関係を組み込みます。
>色設定セルの一つ左セルの場合
> If cell.Offset(,-1).Value > 1 Then
>というかたちになります。
 
タイピングミスが多くて文を理解することが難しいです。
 
すいませんが、訂正をお願いできますか ?

回答
投稿日時: 24/02/10 15:40:51
投稿者: WinArrow

入力ミスが多くて申し訳ありません。
左薬指を骨折していて、思うようにうごかない・・・・いいわけです。
 
 

引用:
>案1
以下のように考えてみましたが上手く処理出来ませんでした。
   
            'B列の操作範囲を指定
            Set rng = ws.Range("B2").Resize(500,)
               
            ' 各セルをチェック
            For Each cell In rng
                  If cell.Interior.Color = vbYellow Then
                        'その行のデータを重複シートにコピー
                        ws.Rows(i).Copy ws2.Rows(nextRow)
  

> If cell.Interior.Color = vbYellow Then
この条件を変更するようレスしたはずです。
条件付き書式の条件とは
>Formula1:="=RC[3]>1"
です。RC[3]が、何処のセルなのか判断できません。
Cell(色を判断しているセル)と条件セルとの関係を調べて、組み込んでください。
色設定セルの一つ左セルとした場合の場合
                  If cell.Offset(,-1).Value > 1 Then
というかたちになります。
 

投稿日時: 24/02/10 16:14:30
投稿者: Nubo

>左薬指を骨折していて、思うようにうごかない
 
 
そのような事情があるとは思わず大変失礼しました。
 
14:37:48の質問での回答がありませんでしたが
思うに条件付き書式を別シートに行をコピーした場合でも
コピー先でも条件付き書式は、生きている(設定はそのまま持ち越される)ようですね。
 
一度コピー先の条件付き書式を削除(FormatConditions.Delete)して色の塗り替えをすると上手く処理できました。
 
      Dim str
    
      lastRow = ws2.Cells(Rows.Count, "B").End(xlUp).Row
     
      For i = 2 To lastRow
       
            ws2.Cells(i, "B").FormatConditions.Delete   ----> 追加コード
 
            str = CStr(ws2.Cells(i, "B").Value)
            If Left(str, 1) = " " Or Left(str, 1) = " " Then
                  ws2.Cells(i, "B").Interior.ColorIndex = 4 '黄緑
            End If
      Next i
             
これで思っていた事が出来て解決しました。
ありがとうございます。
 
この先タイピングも大変だと思いますので
他にアドバイスなければ「解決済み」にしたいと思います。
 
(暫く「解決済み」は、保留にします。)

回答
投稿日時: 24/02/10 18:43:25
投稿者: WinArrow

セル範囲の複写には、幾つかの方法があります。
全複写、(クリップボードを経由しない方法)
全複写、(クリップボードを経由する方法)
 
値複写、(クリップボードを経由しない方法)
値複写、(クリップボードを経由する方法)
 
書式だけ複写、(クリップボードを経由する方法)
数式だけ複写、(クリップボードを経由する方法)
 
いろいろあります。
「形式を選択して貼付け」のダイアログを参照してみてください。
 
クリップボードを経由した場合は、複写後、クリップボードをクリアすることを忘れずに。
 
数式や名前が含まれている場合は、絶対参照、相対参照の定義内容(使い方)で、
意図しない結果になることがあります。前以て、手操作で検証してからコーディングした方が無難です。
 
複写ですから、複写元の設定内容が変化することはありません。

回答
投稿日時: 24/02/10 19:56:28
投稿者: simple

念のためコメントしておきます。
 
(1)
いわゆる"案1"は、
Formula1:="=RC[3]>1" であれば、対象セルの3つ右のセルが 1を超えていたらという条件を
マクロ内で実行して判定すればよいだけです。
 
DisplayFormatが導入(Excel2010)される前は、
Formatcondition配下の条件をマクロで読み出して、
それをマクロ側で評価して、判定結果を求めることに精力を傾けていました。
 
複雑な条件では面倒なことが多く、特定の条件の場合は、再現できないこともあった記憶があります。
今回のような簡単な例であればこの方式で問題ありませんが、
DisplayFormatがある以上、これを使うのが簡明でしょう。
特にもっと複雑な条件の場合は殊更、余計な苦労をする必要は無いと思います。
 
(2)
「いったん条件付き書式を削除して、条件に応じた書式をマクロで付与する」という方法が
ありましたが、これは、条件判定に使うセルの値が変わったときには、
自分でマクロを書いて再計算する必要がでてきます。
条件付き書式の自動再計算機能は残しておくほうが得策でしょう。
今後一切条件判定のためのデータは変わらない、ということなら問題ありませんが。
 
(3)
ws2.Cells(i, "B").DisplayFormat.Interior.ColorIndex = 4
というコードがありましたが、これは不可です。
DisplayFormatオブジェクトの配下のプロパティはすべて「読み込み専用」であり、
変更はできません。
  
(4)
「条件付き書式」は、基本的に「書式」というカテゴリーに属します。
普通にコピーすれば、フォントの色や罫線などと同様に、条件付き書式の内容もコピーされます。

回答
投稿日時: 24/02/10 20:49:35
投稿者: WinArrow

追加レス
 
シート1
A列セルに条件付き書式を設定します。
条件:=RC[3]>1
書式:任意
 
列Aと列Bをシート2に複写します。
 
この場合条件付き書式の条件式で参照しているシート1の列Cとシート2の列Cが同じ値ではないので
結果は保証されません。
 
このように、条件付き書式を含むセル範囲を複写する場合は、注意が必要です。

投稿日時: 24/02/11 08:56:53
投稿者: Nubo

winArrowさん、simpleさん、解決済みの投稿にアドバイスありがとうございます。
 
基本、条件を付けずにCopy(全複写)で他シートにPasteしたら
複写元の設定内容が変化する事はないのですね。
今回の場合、全複写でなく値のみ複写すれば良かったのだと思います。
 
早速、試してみます。
 

投稿日時: 24/02/11 13:58:15
投稿者: Nubo

ありがとうございました。
 
全複写でなく値のみ複写してうまく処理できました。