• ベストアンサー

セル入力時、重複を防ぐ方法を教えて頂きたい

Bookには一か月分のシート(9.1 9.2 ・・・)が存在します。表はB4:AY43の大きさで、各シート共通で行15行目と34行目に「10桁の受注番号」を入力すのですが、この「受注番号」は絶対重複してはいけないコードになっています。当該各セルに受注番号を入力した時に、同シート及び他のシートに同じ番号が存在しないか判別し、存在しなければそのまま入力し、重複している時はメッセージで警告し入力した番号を一旦クリアーするにはどのようにすればよいでしょうか。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.6

イベント処理で行いたいとのことですので、各シートにコードを記載しなければなりませんが、処理内容が同じなので一つにまとめて見ました。 ◆以下を標準モジュールに置いておきます。 Sub Code_Check(s_ad As String) Dim st As Worksheet, rng As Range, flag As Boolean Dim i As Long, s, c_in, c_cmp Set rng = ActiveSheet.Range(s_ad) If rng.Value = "" Then Exit Sub c_in = Array("A1", "A2", "A3")   '//処理対照セル名を列記(入力セル) c_cmp = Array("B1", "B2", "B3")   '//比較対照セル名を列記(参照セル) flag = True i = LBound(c_in) '//処理対照セルかどうかを判定 While flag And (i <= UBound(c_in))  If rng.Address = Range(c_in(i)).Address Then flag = False  i = i + 1 Wend If flag Then Exit Sub '//ブック内の全シートについて比較 For Each st In Worksheets  For Each s In c_cmp   If st.Range(s).Value = rng.Value Then    If (st.Name <> ActiveSheet.Name) Or (st.Range(s).Address <> rng.Address) Then     MsgBox ("同じコードがすでにあります")     Exit Sub    End If   End If  Next s Next st End Sub ◆各月のシートには、以下の最小限のコードを記載しておきます。 Private Sub Worksheet_Change(ByVal Target As Range)  Code_Check (Target.Address) End Sub ◆各月のシートは同じ構成と仮定しています。準備として ・入力をチェックすべきセルをサンプルのように列記しておきます。(例ではA1、A2、A3セル) ・比較するべきセルの範囲を列記しておきます。(例ではB1、B2、B3セル) 重複は絶対不可とのことなので、どのシートであれ同じ番号があればメッセージがでます。 (処理対象と比較対照が重複している場合、自分自身が引っかかってしまいますので、その場合のみ許可するようにしています。) ロジックは単純なので、違う点があれば、適宜修正してご使用ください。

masayuu1
質問者

お礼

御礼が遅れましたが、貴重なご意見誠にありがとうございます。非常に参考になります。色々自分なりに工夫して使用させていただきます。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.7

素朴な疑問ですが、ユニークな受注番号を自動で生成する様にしてはいけないのでしょうか?何かルールがあって受注番号を決めるのでしょうが、それを自動化してしまえば、毎回重複チェックする必要は無くなると思いますがいかがですか。 一人での運用なら、ワークシートのどこかに最後の受注番号を記録しておけば良いでしょう。複数人での運用なら、参考URLをご覧下さい。

参考URL:
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_070.html
全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

入力するセル範囲の(列、行)と 重複をチェックする範囲(シート、行、列の範囲)はどうなっているか、具体的に書いてない質問ではないですか。 こういうのははっきり書くこと。 1シート全体や、複数シートでそういうことをしたければ、それなりの「受注番号」を1列ナリに集める仕組みが必要で、大掛かりになるように思う。 まあアクセスのSQLでも使う世界かと思う。 それにVBAでの処理を希望らしいが、質問には書いてないですね。 それなら課題丸投げですよ。 エクセルは他シートまで対象に何かをするのは苦手で、そうそう自由にはならないから、表設計から考えておく必要がある。

全文を見る
すると、全ての回答が全文表示されます。
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.4

受注番号入力セルが一定でないと、いちいち比較するしかありません。 統合セルが D15:I15、J15:O15 の場合は       4     10   If Target.Column = 4 or _     Target.Column = 10 Then のようにいちいち比較するしかありません。 なので、入力シートを一定に入力出来るように(統合なし)直すか、今のマクロを元に 研究して、修正してみてください。

masayuu1
質問者

お礼

貴重な情報を誠にありがとうございました。もっとVBAを勉強してこれからも頑張りたいと思います。言葉足らずの説明大変失礼致しました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

Const wCol   As Integer = 3 →受注番号が入力されているカラムが、例えば「C」カラムだと「3」になります。  A B C D E・・・・  1 2 3 4 5・・・・ マクロは、各シートに貼り付ける必要があります。 最初は、1日目のシートにマクロを貼り付けた後に、そのままそのシートをコピーして2日目以降のシート を作成すればいいと思います。 ※貼り付け方法 シート名をマウス右クリックして「コードの表示」を選択→白いマクロシートが表示されるので、そのシートへ マクロを貼り付けてください。 ※今日は19日なので、とりあえず、19日のシートへ貼り付けて試してみてください。  受注番号が入力されているカラムが合わないと反応しません。

masayuu1
質問者

補足

ありがとうございます。何列目のことですね^^; カラムが複数の場合はどのように記述すればいいのでしょうか?因みに当セルはD15:I15 、 J15:O15 、のようにセルが統合されていて該当セルは8セルとなり、15行目と34行目を合わせると16セルになります。ご教授の程宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.2

以下のマクロで試してみてください。 全シートの重複チェック(Max 31シート)で、少々遅くなる可能性があります。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim curRow   Dim wR     As Integer   Dim ErFlg    As Boolean   Const wCol   As Integer = 3     '←受注番号が入力さているカラム(変更して下さいね)   Dim wShtNm   As String   '   wShtNm = ActiveSheet.Name   If Target.Column = wCol Then     If Not IsEmpty(Target.Value) Then       If Target.Row >= 15 And _         Target.Row <= 34 Then         '         ErFlg = False         For wR = 15 To 34           If wR <> Target.Row Then             '入力行以外             If Cells(wR, wCol).Value <> "" Then               If Cells(wR, wCol).Value = Target.Value Then                 MsgBox "重複エラー"                 Application.Undo                 Cells(Target.Row, wCol).Select                 ErFlg = True                 Exit For               End If             End If           End If         Next         '         If ErFlg = False Then           '他のシートの重複チェック           If Chk_SameString(Target.Value, wCol, wShtNm) Then             MsgBox "重複エラー"             Application.Undo             Cells(Target.Row, wCol).Select           End If         End If       End If     End If   End If End Sub '他のシートの重複チェック 'セルをチェックすると遅くなるので、ワークメモリチェックしています Function Chk_SameString(wStr As String, wCol As Integer, wShtNm As String) As Boolean   Dim c   Dim wI     As Integer   Dim wBuf    As Variant   '   Chk_SameString = False   For Each c In Worksheets     If c.Name <> wShtNm Then       wBuf = Worksheets(c.Name).Range("A1:AY43")       For wI = 15 To 34         If wBuf(wI, wCol) = wStr Then           Chk_SameString = True           Exit Function         End If       Next     End If   Next End Function

masayuu1
質問者

補足

Const wCol   As Integer = 3     '←受注番号が入力さているカラム(変更して下さいね)・・・の意味を教えていただけませんか。すいません素人なもので^^; 当コードをシートに貼り付けたのですが今のところ反応しません。宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

次の方法は如何でしょうか。 (1)Bookに受注番号リストの専用シートを作成   A1にシート名の固定文字列(仮に月「9」)を入力、各シートの入力セルはB15とB34としています。   B1に=INDIRECT(A1&"."&ROW(A1)&"!B5")としてした方向に31日分コピー   同様にC1に=INDIRECT(A1&"."&ROW(A1)&"!B34")としてした方向に31日分コピー (2)B1:C31範囲を選択→名前ボックス(数式バーの左側枠)に任意名(仮に受注番号)を入力 (3)シートのB5,B34入力対象セルを選択→データ→入力規則→「ユーザ設定」を選択、数式欄に=COUNTIF(受注番号,B5)<2→OK

masayuu1
質問者

お礼

VBAでは難しいようでしたので貴殿の方法にて専用シートを作成し既存の入力規則を置き換えることで成功しました。誠にありがとうございました。

masayuu1
質問者

補足

早速のご返答ありがとうございます。回答方法参考にさせて頂きますが、出来ればVBAにて「Private Sub Worksheet_Change(ByVal Target As Range)」で方法があればいいのですが・・・言い忘れましたが、というのも当該セルには既に「入力規則」が設定されている為、出来ないのです。VBAでの方法があれば宜しくお願い致します。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルのマクロについて(重複セル色付け)

    現在、エクセルで重複セルに色をつける際に、 条件付き書式から重複セルに色をつけております。 しかし、行数が多くなってくるにつれ、表が重くなってきましたので マクロで出来ないかをお教えいただきたいです。 重複のチェックは I から AYまで数字が入っており、 各行ごとの I から AYまでチェックをし、重複した数字のセルに色をつけたいです。 BからHは任意に数字を入力をしますので、Bに文字が入っている行について I から AYまでの重複チェック→色付けとなります。 そして、データも日々増えていきますので、 行の下からBに数字が入っているかを検索し、 入っていたら、その行から上に向かって各行ごとにチェック・・・ としたかったのですが、理屈は分かっていても組めないという情けない結果になり、 皆様にご相談させていただいた次第です。 表現が下手で申し訳ありませんが、ご回答をお願い致します。

  • ◆◆急募◆◆ エクセル 重複するデータの抽出について

    データの入力された2枚のA、Bシートが同じブックにあります。 <Aシート> D2~D500まで顧客番号が入力されています。 <Bシート> C2~C600まで顧客番号が入力されています。 AシートとBシートの顧客番号はいくつか重複しています。 その重複している番号をBシートのどこかのセルに”重複”と表示したいのですが、その方法が分かりません。最終的にオートフィルタで重複と重複していないものを分けたいのです。 大至急教えてください!宜しくお願いします。

  • 重複入力の回避の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)の処理をしたい。 宜しくお願い致します。

  • 行の塗り潰し方法

    過去ログをさんざん調べたんですが発見できなかったので、教えてください。 エクセルで受注リストをシート1に入力していて、 シート2に受注件名の受注番号や受注元といったデータを入力しています。 シート1の受注リストにハイパーリンクでクリックするとシート2の受注番号のセルに飛ぶようには設定できたのですが、何分件数が多い為出来れば、受注番号に飛んだ時点でその受注番号の行全てを適当な色に塗り潰したいのですが、そのようなことは可能でしょうか? 条件付設定で出来るかと思ったのですが、特定のセルをクリックしたらその行を塗り潰すといったことが可能でしょうか? 簡単な数式を使う程度の知識しかありませんので、マクロなど難しい方法ではなく、できるだけ簡単な方法を教えてください。よろしくお願いします。

  • エクセルで入力時データを重複を避けるには

    エクセルでB列にデータ(単語)を入力します  例えば B2のセルから データを入力してゆき  常に 上のセルと比較して 重複データなら入力しなくて良い方法はありますか (何らかの 警告が出るとか セルに色が付くなど)  すでに 条件付書式で重複しているデータを検索できましたが(以前お世話になり) 今回は 入力時に 重複させない方法が知りたいのですが 宜しくお願いします  

  • 入力が重複したとき警告がしたい

    入力が重複したとき警告がしたい いつもお世話になります。 Windows XP EXCELL2003 です。 下記でご指導いただいて現在使用しています。 「入力したデーターを別シートに ~その2」 http://okwave.jp/qa/q5952346.html 使用していて下記のような問題点が新たに発生しました。 参照図で説明します。 上図の 「C2 D2」(泊は1/1 2 3日) と 「C3 D3」(1/3 4日)の来場日及び退場日の記入を記入者がミスすると 下図の D6(黒○印 3日)のように重複します。 ご指導を仰ぎたいのは参照図の上図の C3 D3 を入力したときに3日の重複を警告するような何かいい方法がないでしょうか。 誠に恐れ入りますかご指導いただけませんでしょうか。

  • ある行(の各セル)に入力されたデータが、自動的に別の行(の各セル)に表示されるようにしたい。

    Excelに関しては全くの素人のあほな質問で、大変恐縮しています。 あるブックの中のシートのある行に、各セルに「1119」「1187」「1113」「664」......などと左から右へ入力していきます。 この各セルに入力したデータが、別のブックにあるシートの特定の行の各セルに、左から右へ「1119」「1187」「1113」「664」......と、自動的に数値が入力されるようにしたいのです。 これを可能にする方法は、何かありますか? ちなみに、100個くらいの行のデータが別の行にも自動的に入力されるようにしたいと考えています。

  • ACCESS入力での重複キーチェック

    ACCESSを初めて使う初心者です。 ACCESSで携帯電話の管理を行うデータベースを作ろうと考えています。 電話番号をキーにして携帯電話台帳にデータを入力するフォームを作りました。 当然、電話番号は重複なしのインデックス項目にしています。 しかしフォームを作って入力を行うと、最初に電話番号を入力した時には、 まだ重複のチェックは行われず、使用者等のすべての項目を入力し終わって、 次のデータの入力を行おうとした時に初めて、「重複キーがある」というような メッセージが出てきます。(一般使用者には分かりにくいメッセージだと思います) これを最初に電話番号を入力した時点で直ちに重複チェックを行って、 重複がある場合にはエラーにして、以下の項目の入力はさせないようにする。 そして適切な指示を表示するには、どうしたらいいでしょうか? マニュアルに書いてある通りにやってみて、一応できたという程度の全くの初心者 です。ピントの外れた質問かもしれませんがどうかよろしくお願いいたします。

  • 重複しないセルのカウント 条件付

    下記のようなデータがエクセルシートに入力されている場合、どのように重複しないセルをカウントすれば良いでしょうか?例えば、SBの数を数えたいのですが、3行目・4行目にあるCC SBは重複しています。この重複を数えないように、かつ表全体にSBがいくつあるのかということです。宜しくお願いします。 AA SB BB RH CC SB CC SB DD HC EE RH FF HC

  • VBA 実行時エラー91がでてしまいます。

    請求書を作成する課題をしているのですが、実行時エラー91がでてしまいます。 売上シートにある受注番号セルに受注番号をを入力し、実行ボタンをおすとその受注番号とその列の受注日、宛名を請求書シートに表示させる課題です。 Private Sub 請求書作成ボタン_Click() Dim 売上, 請求書, 受注番号, 宛名, 受注日, 行 Set 売上= Sheets("売上") Set 請求書 = Sheets("請求書") 受注番号= 売上.Cells(2, 10) 請求書.Cells(8, 6) = 受注番号 行 = 売上.Range("A1,A31").Find(受注番号).Row  宛名 = 売上.Cells(行, 3)  請求書.Cells(3, 1) =宛名  受注日= 売上.Cells(行, 2)  請求書.Cells(9, 6) = 受注日 End Sub

専門家に質問してみよう