[[20051004172807]] 『VBA:数値のダブりチェック』(masabou5) ページの最後に飛ぶ

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

 

『VBA:数値のダブりチェック』(masabou5)

       A    B    C    D    E
 1     5    6    1    2    2

 上記のような表があり、各セルに同じ数字が入っていたら、MsgBoxにアラームを出したいのです。
 上記の例でいうと、「2がダブっています」 というメッセージを出したいのです。
 For Each Next を使って行ってみましたが、うまく行きません。
 すみませんが、どなたか教えて下さい。

 countif でチェックしては?
  (INA)

 このようなものは、どうでしょう?                   (LOOKUP)

 Sub Macro5()
    On Error Resume Next
    MsgBox Application.WorksheetFunction.Mode(Range("A1:E1")) & "がダブっています"
 End Sub

 INAさん、LOOKUPさん、ありがとうございました。
 例は1行だけですが、100行くらいあるので、どうしたら簡単に出来るか考えてみます。
 又、Countifは考えましたが、検索条件がその都度変わりますし、
 どうすればいいのか少し考えてみます。(masabou5)


 検索条件でループする方法です。 

 Dim i As Long
 Dim x As String
 Dim c As Long

    For i = 1 To 7
        c = Application.WorksheetFunction.CountIf(Range("A1:G1"), Cells(1, i))
        If c >= 2 Then
            MsgBox Cells(1, i).Address(0, 0) & " の " & Cells(1, i).Value & " は、" & c & " 個ありました。"
        End If
    Next i

  (INA)

 INAさん、出かけていて御礼が遅くなりました。
 私の考えていたことと全く一致していました。
 ほんとにありがとうございました。
 業務に大変役に立ちました。心から御礼申し上げます。(masabou5)

 INAさん、もう一度お伺いします。
 この例では1行だけでしたが、複数行(例えば100行くらい)の場合はどのような処理にすればいいでしょうか?
 質問ばかりで申し訳ありませんが、お教え下さい。(masabou5)


 重複チェックは行単位?
 それとも複数行を対象に重複チェック?

  (INA)

 言葉足らずですみません、重複チェックは行単位です。
 又、重複が出たら1回だけのメッセージに出来ませんでしょうか?
 欲張りな質問ですみません。よろしくお願いします。(masabou5)


 > 重複が出たら1回だけのメッセージ
 各行毎に1回ですか? それとも全体として1回ですか?

 プログラムの仕様を伝えるときは、誤解の無いよう正確に・・・

 Dim i As Long
 Dim x As String
 Dim c As Long
 Dim r As Long

 With ActiveSheet

    For r = 1 To 10
        For i = 1 To 5
            c = Application.WorksheetFunction.CountIf(.Range(.Cells(r, 1), .Cells(r, 5)), .Cells(r, i))
            If c >= 2 Then

                .Cells(r, i).Activate
                MsgBox r & "行目" & Chr(13) & _
                       .Cells(r, i).Address(0, 0) & " の " & .Cells(r, i).Value & " は、" & c & " 個ありました。"
                Exit For
            End If
        Next i
    Next r

 End With
  (INA)

 INAさん、ありがとうございました。
 >各行毎に1回ですか? それとも全体として1回ですか?
    各行毎に、例えば2が2個あった場合は、2がダブっているというメッセージを1回だけ、
    更に3が2個あったら、3がダブっているというメッセージを1回出すという意味でした。
    言葉足らずですみませんでした。
 >プログラムの仕様を伝えるときは、誤解の無いよう正確に・・・
    これからは気をつけるようにいたします。

 いずれにしてもお世話をおかけしました。御礼申し上げます。


 >   各行毎に、例えば2が2個あった場合は、2がダブっているというメッセージを
 >1回だけ、
 >  更に3が2個あったら、3がダブっているというメッセージを1回出すという
 > 意味でした。

 それだとまったく別のロジックでないと対応できないので、
 最初から作り直しになります。
 もう時間がないのでごめんなさい。 
  (INA)

 	A	B	C	D	E	F	G	H	I
1		6	6	1	3	2	4	4	8
2	8		8		5			7	
3	5	5		6		8	2		3
4	2	7		2	1		4		5
5		1	7	8		4		1	
6		4	4		3		8		7
7	7	7			8		9		4
8	6	6		4		7		5	1
9		3	5		6			3

 このような表があったとして、INAさんのコードを参考にして、下記のように作ってみました。
1回だけ表示できればいいと思って、Exit For としてみましたが、いかがでしょうか?
 尚、実行してみましたら、1行目の6は検出しましたが、何故か4は検出できませんでした。
 いずれにしても、ご評価をお願いします。

Sub ダブりチェック()

 Dim i As Integer, j As Integer
 Dim DX(9) As Integer

    For i = 1 To 9
        For j = 1 To 9
            DX(i) = WorksheetFunction _
                  .CountIf(Range(Cells(i, 1), Cells(i, 9)), Cells(i, j))
            If DX(i) >= 2 Then
                Cells(i, j).Activate
                MsgBox i & "行目に、「" & Cells(i, j).Value & " 」が、" _
                  & DX(i) & " 個あります。入力をやり直して下さい。"
                Exit For
            End If
        Next
    Next
End Sub


 ダブりのあるセルを選択するようにはなっていませんが、以下ではどうでしょうか。
 
Sub Test()
For i = 1 To 9
    For j = 1 To Application.Count(Range(Cells(i, 1), Cells(i, 9)))
        MyNum = Application.Small(Range(Cells(i, 1), Cells(i, 9)), j)
        If MyNum <> MyVal Then
            MyCnt = Application.CountIf(Range(Cells(i, 1), Cells(i, 9)), MyNum)
            If MyCnt > 1 Then
                MsgBox i & "行目に、「" & MyNum & " 」が、" _
                  & MyCnt & " 個あります。入力をやり直して下さい。"
                MyVal = MyNum
            End If
        End If
    Next j
Next i
End Sub

 (川野鮎太郎)

 川野さん、ありがとうございました。
 いろいろな考え方、やり方があるものですね。
 特に変数の使い方が、といもスマートだと思いました。
 これからもよろしくお願いします。

コメント返信:

[ 一覧(最新更新順) ]


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