[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.