Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2016)
Rangeのセルの選択範囲を変えて、CountIF関数が使えない原因
投稿日時: 18/07/03 21:59:03
投稿者: karubo0920
メールを送信

 
Sub Sample2()
    Dim i As Long
    For i = 1 To 1000
        If WorksheetFunction.CountIf(Range("A1:A1000"), Cells(i, 1)) > 1 Then
            Cells(i, 1).Font.ColorIndex = 3
        End If
    Next i
End Sub
 
                   ↓
 
Sub Sample2()
    Dim i As Long
    For i = 1 To 1000
        If WorksheetFunction.CountIf(Range("C1:C1000"), Cells(i, 1)) > 1 Then
            Cells(i, 1).Font.ColorIndex = 3
        End If
    Next i
End Sub
 

回答
投稿日時: 18/07/03 22:29:15
投稿者: 半平太

> If WorksheetFunction.CountIf(Range("C1:C1000"), Cells(i, 1)) > 1 Then
                             ~↑~
     そこを 3(つまりC列)にするのを忘れているってオチじゃないですね?

回答
投稿日時: 18/07/03 22:30:10
投稿者: WinArrow
投稿者のウェブサイトに移動

コードだけ書いてもらっても回答者にはあなたのPCの画面は見えませんよ!
 
コードだけではなく、
実行した状況を詳しく説明しましょう。
 

回答
投稿日時: 18/07/03 22:35:10
投稿者: WinArrow
投稿者のウェブサイトに移動

追加のお願い
 
意図する結果と実行結果の両方も掲示してほしいです。

投稿日時: 18/07/03 23:42:50
投稿者: karubo0920
メールを送信

ご回答、ありがとうございます。
  
  A  B   C  
  
1 田中 田中 田中 
2 山田 山田 山田
3 鈴木 鈴木 鈴木
4 田中 田中 田中
5 北尾 北尾 北尾
6 吉村 吉村 吉村
7 池田 池田 池田
8 福田 福田 福田
9 森田 森田 森田

1000
  
意図する結果 ワークシート関数COUNTIFを使って、C列の田中は何個あるかを赤色をつけて表示する。
  
実行結果 A列の田中が赤色をつけて表示される。
  
ご教示ください。

回答
投稿日時: 18/07/04 11:08:48
投稿者: mattuwan44

いま、注目しているC列のセルの値が、C列のデータの中で他にも見つかれば
(=C列のなかで1個より多ければ)。
同じ行のA列のセルのフォントを赤にする。
ということですか?
 
半平太さんが指摘されてますが、そこは修正してみましたか?

回答
投稿日時: 18/07/04 11:14:54
投稿者: mattuwan44

セル範囲を変数に入れるとコードがすっきりする気がします。
 
Sub test()
    Dim Rng As Range
    Dim c As Range
     
    Set Rng = Range("C1:C1000")
    For Each c In Rng
        If WorksheetFunction.CountIf(Rng, c) Then
            c.Offset(, -2).Font.Color = vbRed
        End If
    Next
End Sub

回答
投稿日時: 18/07/04 12:36:29
投稿者: もこな2

横から口だしですが、

karubo0920 さんの引用:
意図する結果 ワークシート関数COUNTIFを使って、C列の田中は何個あるかを赤色をつけて表示する。
こちらの意味がわかりません。
 
もしかしてこうですか?
 
1行目から順番に見ていって、
(1)A列の値をキーにワークシート関数COUNTIFを使って、C列全体にキーと一致するセルが何個あるか数え、
(2)0個→塗りつぶし無し、1個→黄色、2個以上→赤 というように色分けして、何個あるか表示する
 
karubo0920 さんの引用:
実行結果 A列の田中が赤色をつけて表示される。
これは、例示の通りであればC列に2個以上あるのが田中だけだから、マクロは正常に動作してますね。
 
「CountIF関数が使えない」とは、何をもってそのように判断したのか、追加コメントがあるとアドバイスできることがあるかもしれません。

回答
投稿日時: 18/07/04 12:42:09
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

意図する結果 ワークシート関数COUNTIFを使って、C列の田中は何個あるかを赤色をつけて表示する。
   
実行結果 A列の田中が赤色をつけて表示される。

 
この説明では、少しあいまいなところがあります。
私が「意図する結果」と「実行結果」を説明して、とお願いしたのは、
「意図する結果」:このような結果を望んでいるが
「実行結果」:意図した結果とは、○○の部分が違う
という説明をしてほしいということでした。
 
貴方の説明では、2つのことが推測できます。
 
================
(1)C列の範囲(C1:C1000)の中で重複しているセルに赤色を付けたい・・C列セルに色が付く
(2)C列の範囲(C1:C1000)の中で重複しているセルに対応しているA列セルに赤色を付けたい
================
どちらなんでしょう?
 
半平太 さんも、mattuwan44さんも
(2)の方だと考えての回答です。
 
mattuwan44さんの回答のコードはとてもすっきりしていてわかりやすいと思います。
 
ここからは余談です。
 
このコードはどのような目的なんでしょうか?
色が付いたら、それで業務が終了するわけではないですよね?
つまり、重複が分かった後、何をするのか?・・・ということです。
 
その目的によっては、もっと効率のよい方法があるっていうことです。
 
普通は、C1:C1000というように範囲が限定的(固定)ではなく、
データ件数に対応して可変にするものです。
また、入力ミスを検出ことが目的だったら、VBAではなく、条件付き書式を設定する方法の方が、
業務としては効率的です。
 
重複件数が多ければ、赤色が多すぎて、検証が難しくなる可能性があります。
 
 
 
 
 

回答
投稿日時: 18/07/04 13:13:12
投稿者: WinArrow
投稿者のウェブサイトに移動

mattuwan44 さんの引用:
セル範囲を変数に入れるとコードがすっきりする気がします。
 
Sub test()
    Dim Rng As Range
    Dim c As Range
     
    Set Rng = Range("C1:C1000")
    For Each c In Rng
        If WorksheetFunction.CountIf(Rng, c) Then
            c.Offset(, -2).Font.Color = vbRed
        End If
    Next
End Sub

 
ご提示のコードは、とてもすっきりして分かりやすいのですが、
A列セルのすべてのセルに色がついてしまいます。
> If WorksheetFunction.CountIf(Rng, c) Then

        If WorksheetFunction.CountIf(Rng, c) > 1 Then
で、重複が判別できます。
 
それから、私が疑問視している
A列セルに色を付けるのか?C列セルに色を付けるのか?では
次のコードが違います。
C列セルに色を付けるのでしたら
> c.Offset(, -2).Font.Color = vbRed

            c.Font.Color = vbRed
 になります。

トピックに返信