[[20210918093654]] 『一番右に入力されているセルに色を付けたい』(よちよち歩き) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『一番右に入力されているセルに色を付けたい』(よちよち歩き)

 項目  内容  単価  計  項目  内容  単価  計
 作業A  運転   100      作業A   運転  150
 作業B  修理   200     作業B

 実際には、もっと項目があるのですがイメージ的にはこんな感じです。
 横方向に同じ項目名があるのは間違いではないです。

 こういう仕様です。変更することは、出来ません。

 今回やりたいっことは、横方向に入っている数値で一番右セルに色を
 付けたいです。
 1行目は、150に色をつけます。
 2行目は、200に付けたいです。あくまでも、数値が入ってるセルです。
 3万行ほどあります。関数か何かで解決出来ますか?

< 使用 Excel:Excel2016、使用 OS:Windows8 >


C2
=AND($C2<>"",SUM($C2:$G2)=$C2)

G2
=$G2<>""
(考え無) 2021/09/18(土) 10:17


関数で色をつけることはできません。
条件付き書式を使います。
行全体を選択して、条件付き書式の「数式を・・」にして、
=COUNT(A1:$XDF1)+COUNT(B1:$XFD1)=1
(とおりすがり) 2021/09/18(土) 10:28

 何かの方で。
 3万行のサンプルを用意するのは大変なので動作時間は未検証です。
 遅い場合は、他の回答者様の回答をお待ちください。

 Sub macro()
    Dim rng As Range
    Dim arr() As Variant
    Dim i As Long, j As Long
    Dim buf As Long
    With Cells(1, 1).CurrentRegion
        Set rng = Intersect(.Cells, .Offset(1))
    End With
    arr = rng
    For i = LBound(arr, 1) To UBound(arr, 1)
        buf = 0
        For j = LBound(arr, 2) To UBound(arr, 2)
            If Not IsEmpty(arr(i, j)) Then
                If IsNumeric(arr(i, j)) Then
                    buf = j
                End If
            End If
        Next j
        If Not buf = 0 Then Cells(i, buf).Offset(1).Interior.ColorIndex = 36
    Next i
 End Sub

 数値が無い行を想定し忘れていました。11:26 修正
(#) 2021/09/18(土) 10:31

# さん

 ありがとうございます。

 色付け出来ました。

 例えば、データがA1から始まっていない場合例えばA10セル「項目」が
 始まっている場合はどのように修正すれば良いのでしょうか?
  With Cells(1, 1).CurrentRegion → With Cells(10, 1).CurrentRegion
 と、してみたのですが色が付く場所がA1セルに項目があったときと同じ場所に色
 がついてしまいます。

 とおりすがり さん

 =COUNT(A1:$XDF1)+COUNT(B1:$XFD1)=1
 判定対象が、横に40項目ある場合は40個つなげるのでしょうか??
(よちよち歩き) 2021/09/18(土) 15:51

 >判定対象が、横に40項目ある場合は40個つなげるのでしょうか??
 なんで書いてあるとおりにためさないんですか?
(とおりすがり) 2021/09/18(土) 16:04

通りすがりさん

 試して見ました。(すいません、投稿してから試しました)

 横方向には、確かに出来ました。

 下方向へが、動作しなかったです。

 範囲を、条件付き書式で範囲広げても一つ下の空白セルに色を付けて
 止まってしまいます

(よちよち歩き) 2021/09/18(土) 16:12


# さん

 If Not buf = 0 Then Cells(i, buf).Offset(1).Interior.ColorIndex = 36
                     ↓
                    ここを、10にしたら出来ました!!
 ただ、コードの意味をしっかり理解出来ていないので教えていただけるとありがたいです。
 宜しくお願い致します。

(よちよち歩き) 2021/09/18(土) 16:44


 If Not buf = 0 Then Cells(i, buf).Offset(10).Interior.ColorIndex = 36
                                          ~~
 ※With Cells(10, 1).CurrentRegion の場合です。
 ※配列の添字とセルの行番号のズレ分、Offsetしています。
 --
 衝突していました。
 解説出来るほどVBAを習得しておりませんので、概要だけ。

 With Cells(1, 1).CurrentRegion
     Set rng = Intersect(.Cells, .Offset(1))
 End With
 ↑上記の部分で、表の見出し部分を除いた範囲を rng に取得します。
  CurrentRegion と Intersect は検索して図解があるサイトを見た方が理解が深まります。

 arr = rng ←配列 arr に表の範囲を代入します。

 あとは、For Next のループで、配列内の値を総当たりして、
 If Not IsEmpty(arr(i, j)) Then ← でEmpty値を除外
 If IsNumeric(arr(i, j)) Then ← で数値かどうかの判定をして
 If Not buf = 0 Then Cells(i, buf).Offset(10).Interior.ColorIndex = 36
 ↑該当するセルに着色です。
(#) 2021/09/18(土) 17:04

 落ち着いて見直すと rng を設定する必要ありませんね。
 直接セル範囲を配列に入れれば済みます。
 こういうところがVBAを習得できていないと思うところです。。。

 With Cells(10, 1).CurrentRegion
     arr = Intersect(.Cells, .Offset(1))
 End With
(#) 2021/09/18(土) 18:32

#さん

ありがとうございます。出来ました!!

とおりすがりさん

ありがとうございます。出来ました。
タイトル行から選択しないといけないんですね。

でも、なんでカウント関数なんですか?
もっと複雑な関数になると思っていたのでびっくりしいます。
(よちよち歩き) 2021/09/18(土) 20:21


とおりすがりさん

 項目  内容  単価  計  項目  内容  単価  計

 数値が、入る単価セル1つ前までのセルをカウント関数で囲ってるって言う認識で良いでしょうか??

=COUNT(A1:$XDF1)+COUNT(B1:$XFD1)=1

(よちよち歩き) 2021/09/18(土) 20:45


 解釈のお手伝い^^;

 COUNT(A1:$XDF1) セル自身を含む右端までの範囲の数値の数
 +               足す
 COUNT(B1:$XFD1) セル自身を含まない(ひとつ右から)右端までの範囲の数値の数
 =1              が[1]である

 って事で、
 セル自身が数値で、ひとつ右以降に数値が無い場合だけ[1]になる
 という意味だと思いますよ。

 例えば、
 この条件付き書式の適用範囲が[A:H]だった場合は、
 適用範囲外(I列から右)に数値セルがあると、[A:H]の範囲での一番右の数値セルには色が付かないので、
 適用範囲外の使い方によっては、適用範囲にあわせてCOUNT関数内の範囲も変更が必要になるかもですね。
 且つ、適用範囲のひとつ右の列は使用不可として運用する事になるかな?
 (あらかじめ文字列を埋めておく等の対策が必要?)

(白茶) 2021/09/18(土) 21:46


 A1は、横一列指定してOK
 B1は、データが入っているセルの1つ右まで
 例えば、Wまで入っていたら COUNT(B1:$X1)ですか??

 すいません、カウント関数は良く使うのですがこのような使い方が初めてで
 理解が追い付きません・・・。

(よちよち歩き) 2021/09/18(土) 23:58


すいません、1つ問題がありました。
途中、計という項目があるのですがそこは除きたいとの
ことでした。
あくまでも、単価という項目を探して1番右に色つけたい
そうなのですが可能でしょうか?
(よちよち歩き) 2021/09/21(火) 09:13

 A列からデータの最終列までを選択して条件付き書式で
 =COLUMN()=MATCH(1,0/(($A1:$Z1<>"")*($A$1:$Z$1="単価")*(ROW()>1)),1)
 と指定ではどうだろうか?
 なお上記式は最大列がZ列までとしている。
(ねむねむ) 2021/09/21(火) 09:30

ねむねむさん

私の作成したダミーデータは、出来たのですが本ちゃんのデータで
作業している人のデータでは変な動きをしているのです。
色は、付くのですが着色して欲しいセルの1つ上に色が着いてしまいます。

関数自体は、問題なさそうなのですが何か原因として考えられる要因
ありますか?
(よちよち歩き) 2021/09/21(火) 12:28


 もし最初の範囲選択で行を選択している(2行目から最終行を選択)であれば
 =COLUMN()=MATCH(1,0/(($A2:$Z2<>"")*($A$1:$Z$1="単価")),1)
 としてみてくれ。
(ねむねむ) 2021/09/21(火) 09:30
 の式は範囲選択を列単位で行った時のものになる。
(ねむねむ) 2021/09/21(火) 12:50

ねむねむさん

ありがとうございます。

本ちゃんデータを入手出来たのでやってみました。

状況は、変わらずだったのですが最初の選択範囲を$A1:$Z1としたら
色付け部分が1つ下って正しく着色されました。

やはり、何か手順が違うのでしょうか…
(よちよち歩き) 2021/09/21(火) 18:40


 条件付き書式を設定する際は、アクティブセルを基準点とした式で書きます。
 ねむねむさんが
 >もし最初の範囲選択で行を選択している(2行目から最終行を選択)であれば
 と、選択範囲によって式も変わってくる旨を示唆されているのはその為です。

 例えば
 _|___A____|___B____|___C____|___D____|___E____|___F____|___G____
 1|        |        |        |エリア1 |エリア1 |エリア1 |        
 2|        |        |        |エリア1 |エリア1 |エリア1 |        
 3|        |        |        |エリア1 |エリア1 |エリア1 |        
 4|        |        |        |        |        |        |        
 5|        |        |        |        |        |        |        
 6|        |エリア2 |エリア2 |エリア2 |        |        |        
 7|        |エリア2 |エリア2 |エリア2 |        |        |        
 8|        |エリア2 |エリア2 |エリア2 |        |        |        
 9|        |        |        |        |        |        |        

 範囲[D1:F3,B6:D8]に一括して条件付き書式を設定する場合、
 アクティブセルが[E2]の状態であれば、その条件式は「[E2]から見てどうだったら」という書き方になります。
 絶対参照の部分は影響無いですが、相対参照の部分はアクティブセルの場所を意識して設定しないとズレてしまいます。

 んで、ちょっとややこしい余談なんですけど、
 ↑の条件付き書式を改めて「ルールの管理」で見てみると「[B1]から見てがどうだったら」という式が現れます。
 条件付き書式の中で表すの参照式は「適用範囲全体を含む矩形範囲の左上のセル」を基準点として管理されますので、
 [D1:F3]と[B6:D8]を含む矩形範囲(B1:F8)の左上のセルである[B1]が基準点になるんですよね。

(白茶) 2021/09/21(火) 21:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.