[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『重複チェックを行いたい』(ミカン)
お世話になります。 表題の件で悩んでいます。
B C D 7 コード 名称 金額
8 AAAAAA ○○○ 100
9 BBBBBB △△△ 200
10 AAAAAA □□□ 300
11 CCCCCC ××× 400
上記のような表があります。 この時、B列に重複チェックをかけ、重複しているものでも下にあるセルに色をつけたいです。 (上記の表ではB10のセルに色をつけたいです。) Countifで処理を書けばよいのでしょうが、範囲指定などでこんがらがってしまいます。
難しくはないと思いますが良い案が思い浮かびません。 宜しくお願いします。
XP Excel2002
B8セルからB11セルを選択した状態で 書式 → 条件付き書式 数式が =COUNTIF(B$8:B8,B8)>1 書式をクリックしてパターンタブから色を選択
でどうでしょうか?
(se_9)
se_9さんお世話になります。
書き忘れていましたがVBAでやりたいのです。
現在途中までできているのが下記の処理です。 For i = 8 to 最下行 コード = Cells(i,2) Application.WorksheetFunction.CountIf(Range("B8:B" & 最下行), コード) < 1
Next i
これだと、一番最初に重複しているセルに色がついてしまうんです… (ミカン)
Application.WorksheetFunction.CountIf(Range("B8:B" & i), コード) > 1 かな?
(se_9)
こんな方法も
Sub test() Dim x With Range("b1", Range("b" & Rows.Count).End(xlUp)) .Interior.ColorIndex = xlNone x = Filter(.Parent.Evaluate("transpose(if(countif(offset(" & .Address & _ ",0,0,row(1:" & .Rows.Count & "))," & .Address & ")>=2,""b""&row(" _ & .Address & "),char(2)))"), Chr(2), 0) End With If UBound(x) > -1 Then Range(Join$(x, ",")).Interior.Color = vbRed End Sub (seiya)
se_9さん お世話になります。
単純に一番上からコードの対象行までを検索範囲にすればよかったんですね
ありがとうございました。
seiyaさん お世話になります。 seiyaさんのコードはFilter関数を使ってセルの値を入れてチェックする方法でしょうか。 Char(2)というのはあまり使わない記号のようですがなぜこれを使用しているのでしょうか。
(ミカン)
C1:CのB列最終行まで選択して、
=IF(COUNTIF(OFFSET(B1:B23,0,0,ROW(B1:B23)),B1:B23)>=2,"b"&ROW(B1:B23),"") を入力して Ctrl + Shift + Enter で確定。 B1:B23 の 23は実際の数値にする。
C列に出現するのが条件に合ったもののセルアドレス その配列をTranspose関数で 一次元配列に変換したのちFilter関数で 該当データのみ抽出 (実際のコードでは、条件に合わない行をChar(2)として、それ以外を抽出) なぜChar(2)? Filter関数は部分一致したものを対象としてしまうので、殆ど使用しない文字 を使用しているだけ
これをメモリ上で展開したもの (seiya)
Filterとは
=IF(COUNTIF(OFFSET(B1:B23,0,0,ROW(B1:B23)),B1:B23)>=2,"b"&ROW(B1:B23),"") を入力して Ctrl + Shift + Enter で確定。
と同じだったんですね! 勉強になりました。
(ミカン)
一応、後で見る人のために その理解の仕方は、間違い。
Filter 関数は一次元配列からマッチする又は、マッチしない要素のみを取り出す関数。
Evaluateメソッドで計算された結果の配列(二次元配列)から、Filter関数で目的の 要素のみを抽出するには一次元配列に変換する必要があるので、Transpose関数を使用。
その後、Join関数で抽出された配列の要素をカンマで結合して、一気に色を付ける。 (seiya)
解決後? ですが、別法で
Sub Try1() Dim dic As Object Dim c As Range Dim ss As String
Set dic = CreateObject("Scripting.Dictionary") With Range("B8", Cells(Rows.Count, 2).End(xlUp)) .Interior.ColorIndex = xlNone For Each c In .Cells ss = c.Value If dic.Exists(ss) Then '重複あり dic(ss) = c.Address 'アドレスを上書き Else dic(ss) = Empty End If Next End With
Dim e As Variant For Each e In dic.Items() If Len(e) Then Range(e).Interior.Color = vbYellow End If Next End Sub
(kanabun)
すみません、勘ちがいしてました。 何回か重複していたばあい、↑はその最後のセルにだけ色塗りしてました。(下記例) ------------ 8 A 9 B 10 A 11 C 12 A ● 13 B ●
2度目の出現以降すべての重複するセルに色塗りなら、こうでした
Sub Try2() Dim dic As Object Dim c As Range, r As Range Dim ss As String
Set dic = CreateObject("Scripting.Dictionary") With Range("B8", Cells(Rows.Count, 2).End(xlUp)) .Interior.ColorIndex = xlNone For Each c In .Cells ss = c.Value If dic.Exists(ss) Then '重複あり If r Is Nothing Then Set r = c Else Set r = Union(r, c) End If Else dic(ss) = Empty End If Next End With
If Not r Is Nothing Then r.Interior.Color = vbYellow End If End Sub
------------- 8 A 9 B 10 A ● 11 C 12 A ● 13 B ●
(kanabun)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.