• 締切済み

EXCELでの重複入力禁止を実現するVBAについて

EXCELの重複入力禁止についての質問です。 重複入力禁止は、大きく分けて関数、入力規則を使っての設定と、VBAを使って設定の2つに分かれると思いますが(違っていたらすいません)今回、予め入力規則を設定しているセルに対し、重複入力の禁止を設定したいため、VBAで実現したいと考えています。 設定したいのは、A列、B列の2列を対象として、同じ内容の行がある場合はエラー表示させて、重複しているシートを赤く塗りつぶすような動作を考えています。例えば、A1とA2は一致するが、B1とB2が異なるといった一列だけの判断ではなく、A1、B1の内容とA2、B2に入力している内容が完全に一致した場合、エラー表示させて、A1、B1、A2、B2セルを赤く塗りつぶす動作になります。(2列1行という言い方が正確かどうかわかりませんが、上記のような内容を希望しています。) また、空白は対象外と考えます。 上記のようなVBAを作成したいのですが、当方まだまだVBAを勉強段階で自分でソースを作成することが難しいです。 ソースを教えて頂けないでしょうか? また、可能であれば、A、B、C3列を対象としたVBAについても教えていただけると非常に助かります。

みんなの回答

  • argument
  • ベストアンサー率63% (21/33)
回答No.5

こんばんわ 061156 さん 「人非聖賢,孰能無過」という訳ではありませんが、正しく動かねば言えば良いのです。 はい。全力で回答が間違っていましたね。 といっても、自分でソース書かず削除対象の作成丸投げ依頼なため悪びれもせずに回答します。 A、B、C一行をワンセットとして、行ごとの一致行の着色です。 以下を標準モジュールに張ってください。 Sub colorcheckline() maxliney = 0: For i = 65 To 67 If maxliney <= Range(Chr(i) & "65536").End(xlUp).Row Then maxliney = Range(Chr(i) & "65536").End(xlUp).Row Next For i = 1 To maxliney For j = 1 To maxliney If Not i = j Then If Range("A" & i).Value & vbTab & Range("B" & i).Value & vbTab & Range("C" & i).Value = Range("A" & j).Value & vbTab & Range("B" & j).Value & vbTab & Range("C" & j).Value Then Range("A" & i).Interior.ColorIndex = 3: Range("B" & i).Interior.ColorIndex = 3: Range("C" & i).Interior.ColorIndex = 3: Range("A" & j).Interior.ColorIndex = 3: Range("B" & j).Interior.ColorIndex = 3: Range("C" & j).Interior.ColorIndex = 3: Next Next End Sub はい。実行してみましたか?A、B、C一行をひとつのデータをとし、重複する内容の全ての行が着色されました。 tabを挟むのは、入力が「AAA」「AA」「AA」の場合「A」「AAA」「AAA」の判定の為です(どちらもただ連結比較すると「AAAAAAA」で一致と誤認するため) もしも一致しなくなった場合で色を戻す場合else条件で0を渡すだけですので勝手に改造してください。また、Changeイベントにしたいのならそれくらいは勉強してくださいね。 追加処理・処理違い・補足等あればいってください。

  • argument
  • ベストアンサー率63% (21/33)
回答No.4

ほむ。ソースが欲しいだけですか?ならばあげましょう。 ではこれを標準モジュールこぴぺしてください。 実行すればA列B列C列の重複する部分だけ赤くなります。 Sub colorcheck() flag = Array(1, 1, 1): linex = Array("", "", ""): For i = 1 To 65536 If flag(0) Then If Range("a" & i).Value <> "" Then linex(0) = linex(0) & Range("a" & i).Value & vbCrLf Else flag(0) = 0 If flag(1) Then If Range("b" & i).Value <> "" Then linex(1) = linex(1) & Range("b" & i).Value & vbCrLf Else flag(1) = 0 If flag(2) Then If Range("c" & i).Value <> "" Then linex(2) = linex(2) & Range("c" & i).Value & vbCrLf Else flag(2) = 0 If (flag(0) = 0) And (flag(2) = 0) And (flag(2) = 0) Then Exit For Next For i = 0 To UBound(linex): linex(i) = Split(linex(i), vbCrLf): Next For i = 0 To UBound(linex) For j = 0 To UBound(linex(i)) - 1 For k = 0 To UBound(linex) For l = 0 To UBound(linex(k)) - 1 If Not ((i = k) And (j = l)) Then If Cells(j + 1, i + 1) = Cells(l + 1, k + 1) Then Cells(j + 1, i + 1).Interior.ColorIndex = 3: Cells(l + 1, k + 1).Interior.ColorIndex = 3 End If Next Next Next Next 余りに即席で考えなしに作り出したので無駄が多いです。読みやすい記述の仕方も一切していません。でも大切なのは結果です。あなたが中身がたとえ分からなくても処理の答えが得らればよいでしょう? デバッグは一回しか実行してませんがまぁ動くでしょう。 仕様 A列空白までカウント・B列空白までカウント・C列空白までカウント (最初の空白にヒットした時点でカウントをやめます) A1とA2…C最後まで比較。次はA2からC最後まで比較。 既に赤くしたところはカラープロパティを取得しスキップしようと思いましたがめんどくさいのでやめました。どうせ変わるのは早さだけで結果は変わりません。 速度以外で処理的に修正が欲しいならば書き直します。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

同じデータを入れるとセルに色をつける A列と仮定します 条件付書式の 「数式が」、で =AND(A1<>"",COUNTIF(A:A,A1)<>1) ーー キワモノ的ですが、別列に第1行に=A1といれ、下方向に式を複写する。 A列に別の条件付書式が入っておれば、その別列に対し、条件付書式を、例えば重複入力禁止なら、上記の式で設定しては。 ーー VBAでですが、VBAのイベントというものを使った経験ありますか。 無いというレベルでは、本質問は荷が重いはず。人に作ってもらって使うだけということになり、本質問コーナーでは歓迎されません。 ーー (1)ChangeイベントでTargetセルの値が他に無いか重複を全行 比較する (2)入力済みセル全体を対象として、Findメソッドをかけて見つかれば、警告(セルの色づけ)、見つからなければOK 参考 http://excelvba.pc-users.net/fol7/7_1.html 2つ以上出現するかどうか調べる必要が無いので、この質問で楽です。 (3)WorksheetFunctionのCOUNTIF関数を使う手もあります。 (後記のように不完全例) G列に入力の例 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 7 Then Exit Sub d = Range("G65536").End(xlUp).Row If WorksheetFunction.CountIf(Range("G2:G" & d), Target) > 1 Then Target.Interior.ColorIndex = 6 Else Target.Interior.ColorIndex = xlNone End If End Sub ーーー しかし今入力した値がダブっているのは判別しやすいのですが、 上から上書きしたときの元の値とダブっていると言うことで色が付いていたセルの色を消すのが難しい。 入力前の既入力の値が捉えにくいこともある。 ーー 結局、初歩的な方法では 毎回入力されるごとに第1(最上行)から最下行まで、全てのセルに ついて、CountIFナリで重複をチェックするロジックにする必要があるようだ。 この上記結論は小生の思考不足であるかもと懸念はあるが。

061156
質問者

お礼

貴重なご意見ありがとうございました。 まだまだ、VBAは勉強段階ですので、内容がなかなか理解できないです。 もう少し勉強してみます。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

#1です。すみません。数式に">1"を付け忘れました。また >空白は対象外と考えます。 を抜かしてました。 2列なら、A1:B1を選択して「書式」「条件付き書式」 「数式が」「=AND(COUNTBLANK($A1:$B1)=0,(COUNTIF($A:$A,$A1)*COUNTIF($B:$B,$B1))>1)」で書式ボタンでパターンで色を選択 としてください。 ちなみにEXCEL2007なら新しい関数COUNTIFSが使えます。 「数式が」「=AND(COUNTBLANK($A1:$B1)=0,COUNTIFS($A:$A,$A1,$B:$B,$B1)>1)」 になるので便利かと思います。

061156
質問者

お礼

回答ありがとうございました。 VBAでもできないか勉強してみます。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

条件付き書式でできます。 2列なら、A1:B1を選択して「書式」「条件付き書式」 「数式が」「=COUNTIF($A:$A,$A1)*COUNTIF($B:$B,$B1)」で書式ボタンでパターンで色を選択 3列なら、A1:C1を選択して「書式」「条件付き書式」 「数式が」「=COUNTIF($A:$A,$A1)*COUNTIF($B:$B,$B1)*COUNTIF($C:$C,$C1)」で書式ボタンでパターンで色を選択

関連するQ&A

  • エクセル VBAで入力

     エクセル初心者です。 条件付き書式で一つのセルに特定の文字列を入力した際に、そのセルと任意の法則性のある複数のセルに(入力内容は無関係でセルの行・列に法則性があります)特定の塗りつぶしを行いたいのですが、どのようにすればよいのでしょうか。 条件付き書式をすべて設定する(手打ち)するのが最も確実で間違いの内方法ではありますが、新規に行・列を挿入した場合、その行・列には条件付き書式が設定されていませんので、意図した作用を起こさなくなってしまいます。 上記ではよくわからないと思いますので、具体的な例を入れさせていただきます。 例)) 任意のセル(A13)に特定の文字列(OK)と入力する。 特定文字列に反応して、そのセルの列に(A12からE12、F12からH12)赤色の塗りつぶしを入れる。 上記は1セルに対して行われますが、VBAを使用してA12からA5000までを検索対象として持たせて、それぞれのセルの列に対して塗りつぶしを入れられるようにしたいと思っています。

  • 重複入力の回避のVBAをご教示ください

    6行目のセル(6行、C列)に顧客番号を入力し、F列以降に、セル(6行、C列)の顧客番号の内容を入力しています。   その入力時に、顧客番号の重複入力を避けるためのチェック及び対処処理をご教示お願い致します。     (1)・セル(6行、C列)に顧客番号を入力し、F列からH列に、セル(6行、C列)の顧客番号の内容を入力する。     (2)・セル(7行、C列)に顧客番号を入力し、F列からH列に、セル(7行、C列)の顧客番号の内容を入力する。       (イ)・セル(7行、C列)に顧客番号を入力し、エンターキーを押した時点でセル(6行、C列)の顧客番号と重複していなかチェックする           ●重複していない場合は、カーソルをセル(7行、F列)へ移動させる           ●重複している場合は、「同じ番号があります」とメッセージボックスを表示する。               メッセージボックスのキャンセルボタンをクリックするとセル(7行、C列)の重複番号が削除されカーソルはセル(7行、C列)へ     (3)・セル(8行、C列)に顧客番号を入力し、F列からH列に、セル(8行、C列)の顧客番号の内容を入力する。        (イ)・セル(8行、C列)に顧客番号を入力し、エンターキーを押した時点でセル(6行、C列)とセル(7行、C列)の顧客番号と重複していなかチェックする           ●重複していない場合は、カーソルをセル(8行、F列)へ移動させる           ●重複している場合は、「同じ番号があります」とメッセージボックスを表示する。               メッセージボックスのキャンセルボタンをクリックするとセル(8行、C列)の重複番号が削除されカーソルはセル(8行、C列)へ     (4)・セル(9行、C列)に顧客番号を入力し、F列からH列に、セル(9行、C列)の顧客番号の内容を入力する。        (イ)・セル(9行、C列)に顧客番号を入力し、エンターキーを押した時点で、セル(6行、C列)とセル(7行、C列)とセル(8行、C列)の顧客番号と重複していなかチェックする           ●重複していない場合は、カーソルをセル(9行、F列)へ移動させる           ●重複している場合は、「同じ番号があります」とメッセージボックスを表示する。               メッセージボックスのキャンセルボタンをクリックするとセル(9行、C列)の重複番号が削除されカーソルはセル(9行、C列)へ     (5)・(1)~(4)を1セットとお考え下さい           ●10行から13行の4行を1セットとして、セル位置は変わりますが、(1)~(4)の処理をしたい。           ●最終  702行から705行まで、(1)~(4)の処理をしたい。 宜しくお願い致します。

  • エクセルマクロを使用して異なるセルの重複データを探したい

    エクセルに以下のような値が入力されています。 A~Bは列番号 1~100は行番号 1 A B 2 11 14 3 12 15 4 13 13 . 100行まで続く A1からB100までに入力された値の中で、重複している値のセルを探して、セルの色を変えたいと考えています。 VBAを使って処理したいのですが、どなたかご教授頂けないでしょうか。宜しくお願いいたします。

  • Excel VBAで値が重複する行を削除する

    Excel2000を使っています。 シートAに数千件のデータがあります。 シートBのE列にある文字とシートAのD列の文字が重複する場合に、シートAの重複するセルがある行を削除する(且つできれば行のデータを抜き出すVBAを作ろうと考えています。 最近VBAの初心者本をやっと理解したところで、ちんぷんかんぷんとまではいかないけど、知恵熱がでました。 仕事なので自分でなんとかすべきかと思いますが、きっかけの調べ方がまずわからない。 どなたか、解かるきっかけだけでも与えて頂けないでしょうか。とくに、別シートの値と重複する値を探す場合に何をいれるかわかればきっと道は開けると思うんですが…。 初めての質問なので、質問内容が至らなかったらもうしわけありません。

  • エクセルで重複するセルを削除したい

    エクセル2000で同じ内容のセルが複数あったとき、ひとつだけを残し他を削除する方法を教えてください。 ただし少し条件があります。 データーは5列100行位からなっています。 A列にある重複したデーターのセルを削除したいのですが、A列は同一なのですがB列は異なっています。B列に数字が入っているセルとうでないセルがあるのですが、数字が入っているものを残したいのです。 具体例は次のとおりです。 A列に 「ホンダCIVIC」 B列 「-」と書かれた行と A列に 「ホンダCIVIC」 B列 「2」と書かれた行、 A列に 「ホンダCIVIC」 B列 「5」と書かれた行、 のA列だけを見ると重複した3行が有ったとします。 B列に「5」または「2」の入った行ひとつだけ残し、他を削除したいのです。 何かよい方法があればお教えください。よろしくお願いします。

  • エクセルの入力規則について!

    エクセルでAの列1~20に入力規則により、その列に同じ数値を入力すると警告が出る様に設定しました。同じように重複してAの列1~20に数字の1~100までの数値以外を入力したら警告が出る様にも設定したいのです。 この様に入力規則を同じセルに複数設定できますでしょうか?お教えください。

  • excelの入力規則リストで重複不可にするには

    エクセルの入力規則でリストを利用して【プルダウンメニュー】を作成しています。 リストのデータを重複して選択できないようにするにはど のようにすればいいでしょうか? 例をあげるとしして 仮にA、b、Cの3つのセルに入力規則のリストを設定していずれも元の値が 『リンゴ』『みかん』『バナナ』とした場合。 Aのセルでリンゴを選択した時BやCのセルでリンゴを選択できないようにするに します。 VBAは全く分からないのでできれば関数で やる方法をご教授頂ければと思います。 宜しくお願いします

  • EXCEL2003 重複データに色を付けるVBA

    A列のA2からA21に氏名、B列のB2からB21に住所が入力済です。A列で重複しているデータに色をつけて、さらに並び替えをしたいと思います。色は黄色、並び替えの設定は黄色で色を付けたセルがA2から順に表示するVBAを教えていただけませんでしょうか。またお手数でも列をB列、C列に変更した場合についても教えていただけませんでしょうか。VBAコードの貼り付けはできます。よろしくお願いします。

  • エクセル 重複行色付(VBA)について質問です。

    Excelで、2ヶ所の場所を重複しているのかどうかチェックし、重複でしたらその行ごと色を付けたいと思っております。 |    A    |    B   |   C   |   D   |   E   |    田中    1046587920   8/2     8/6    100364987    鈴木    1098463612   8/3     8/5    125698001    森川    1548758743   8/20    8/23    103587410    川島    1046587920   8/22    8/23    100365871    森本    1046587920   8/25    8/26    100364987 例えば、上記の様な一覧があり 「B列」 と 「E列」 とで重複を確かめて、同じであれば色が付く様にVBAを組みたいのですが、現在調べて 「B列」 のみの重複に色付けは出来るようになったのですが、2ヶ所重複に色をつけることで困っております。 上の例で行きますと、田中さんと森本さんの行に色が付く形が理想でして、川島さんの、「B列」は該当しておりますが、「E」列が異なるため、色は付きません。 行数は。2万行前後になるのですが、関数を当てると処理が非常に重くなるため、VBAを試みております。 お知恵をお貸し頂けましたら幸いです。

  • エクセルで重複データが入力されたらアラートを表示

    同一内容の文字列が入力されたら、入力規則を使ってアラートを出したいのですが、 http://kokodane.com/kan24.htm こちらを参考にやってみたのですが、これだと、直接セルに文字を入力したときのみ アラードが表示されます。 コピー⇒ペーストで同一データが入力された場合も、アラートを出したい場合は どうすれば良いでしょうか。。。。。 エクセルデータの行数が3万行程あるので、=if(count(A:A,A1)>1,"重複","")) のような関数を入れておく という方法は避けたいです。。。。

専門家に質問してみよう