• ベストアンサー

エクセル 入力規則のVBAを教えてください

先日も質問させていただきましたが、どうしてもうまくいかないので、再度質問させていただきます。 エクセルで顧客管理をしています。 C列に顧客名を入力していくのですが、 同じ顧客のデータは1行にまとめたいため、 C列には同じ名前が入力できないようにしたいのです。 C列全部に データ→入力規則→設定→数式  =countif(c:c,c1)=1 と、入力規則を設定しました。 この後、ダブリ入力をすると警告のメッセージボックスが出るようになったのですが、 中にはまったく同じ顧客名なのに入力できてしまったり、 また同じ名前はないのに、入力できなかったりします。 これは何が原因なのでしょうか? どうしてもダブリ入力はできないようにしたいのですが、他に何か方法はないでしょうか? 前回のこの質問に対して、 式を=countif(c:c,c1)<=1  とするや 入力規則のコピーの方法など、お答えを頂きましたが、どうしてもうまくできませんでした。 同じく、まったく同じ顧客名なのに入力できてしまったり、 また同じ名前はないのに、入力できなかったりします。 伝票を見ながら入力していくのですが、伝票は1000枚ほどあります。 どうしても入力時点で重複をさけたいのですが、これをVBAでできないでしょうか? 入力規則のコードの書き方がわかりません・・。 いつもこちらに頼って申し訳ありませんが、どうぞよろしくお願いします。

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

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

こんにちは。 >C列全部に >データ→入力規則→設定→数式  =countif(c:c,c1)=1 上記の設定代わりに、以下のマクロのみで、如何でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim wCnt    As Integer   Dim wStr    As String   Dim wR     As Long   Dim c     As Range   '   If Target.Column = 3 Then     If Not IsEmpty(Target.Value) Then       wCnt = 0       wStr = Target.Value       wR = ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row       For Each c In ActiveSheet.Range("C1:C" & wR)         If c.Value = wStr Then           wCnt = wCnt + 1         End If       Next       If wCnt > 1 Then         MsgBox "既に入力済です。"         Target.Value = ""       End If     End If   End If End Sub <マクロ貼付> 入力シートをマウス右Click → 「コードの表示」→ 表示される画面に貼り付け

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 VBAでも、根本的には同じではないでしょうか? こちらが見る限りは、その数式自体は、問題ないはずですから、その入力の「ブレ」ではないかと思うのです。だから、その「ブレ」をVBAに含めるなら可能ですが、単純に、VBAに置き換えても無理だと思うのです。うまく行かなかった部分を、徹底的に原因を調べるしかないですね。 今、別な式で試してみました。 C2~C65536 までを、選択し、「C2 を白抜きでアクティブになっているのを確認して」入力規則の数式を以下の入れてみました。 =COUNTIF($C$1:C1,C2)=0 こちらもうまくいきました。

  • x0000x
  • ベストアンサー率52% (67/127)
回答No.2

こんにちは。 マクロで入力規制の設定方法は、「新しいマクロの記録」で確認できますが、VBAで入力規制を設定するのみ、画面から設定するのも設定のアプローチが違うだけで、入力規制そのものには影響を与えません。 >まったく同じ顧客名なのに入力できてしまったり、 >同じ名前はないのに、入力できなかったりします。 見た目同じでも、空白の有無や、全角、半角の違いは考えられませんか? たとえば、「aaa 」と「aaa」では、見た目同じでもcountif()=1となり、入力可能です。 また、Countif関数では、全角と半角文字の区別ができないようです。 「cc」(半角)と「cc」(全角)ではcountif()=2となります。 試しに条件書式で色設定を行い、重複しているセルを判別してみてはどうでしょうか? メニューの「書式」-「条件付書式」で 「数式が」、「=COUNTIF(C:C,C1)>1」、「書式」の「パターン」で任意の色を選択します。 C列すべてのセルに書式をコピーします。 マクロで処理したいなら以下のコードを該当シートのマクロとして貼り付けすれば、二重チェックを行います。 (この処理の検索は、メニューの「編集」「検索」と同じ機能です。) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 3 And Len(Target.value) > 0 Then 'C列の場合だけ確認 Dim rng As Range Set rng = ActiveSheet.Range("C:C").Find(What:=Target, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True, MatchByte:=True) If Not rng Is Nothing Then '発見した。 If rng.Address <> Target.Address Then '入力中セル以外で発見 MsgBox "他で入力済み!" Target.value = Empty '入力値をクリア '入力位置を補正 ActiveSheet.Cells(Target.Row, "C").Select End If End If End If End Sub

関連するQ&A

  • エクセル 入力規則について教えてください

    エクセルで顧客管理をしています。 C列に顧客名を入力していくのですが、 同じ顧客のデータは1行にまとめたいため、 C列には同じ名前が入力できないようにしたいのです。 C列全部に データ→入力規則→設定→数式  =countif(c:c,c1)=1 と、入力規則を設定しました。 この後、ダブリ入力をすると警告のメッセージボックスが出るようになったのですが、 中にはまったく同じ顧客名なのに入力できてしまったり、 また同じ名前はないのに、入力できなかったりします。 これは何が原因なのでしょうか? どうしてもダブリ入力はできないようにしたいのですが、他に何か方法はないでしょうか? 入力規則のようなものをVBAではできますか??

  • エクセルの入力規則で

    似た質問があるかもしれませんが、ご質問します。 エクセルの入力規則で、[挿入]メニューで定義した名前をリストのところで設定したいのですが、リストの入力欄に「名前」を入れるのにはどのような文字列にすればいいでしょうか。 分かりにくい質問かもしれませんが、「名前」はどのように表現したらいいでしょうかという質問です。入力規則のリストにしたいデータが他シートにあるため、質問しました。 お願いします

  • エクセル2000の入力規則

    エクセル2000を使っていますが、データ→入力規則で、「文字列(長さ指定)」で最大値を10文字ではなく10バイト分としたいのですが、それは可能でしょうか。 また、この入力規則では不可能であるとすれば、ある列を全て10バイト分で設定したいとき、よい方法はありますか? よろしくお願いします。

  • エクセル入力規則で関数を使ってエラーを表示させたい

    エクセル2003を使用しています。 入力規則の条件設定でユーザー設定を選び、関数を使用して、 E5のセルに「A」、もしくは、「B」で始まるデータを入力したときに、 エラーメッセージを表示させたいのですが、 うまくエラーメッセージを表示させることができません。 COUNTIF関数を使って =OR(COUNTIF(E5,"A*"),COUNTIF(E5,"B*")) と数式に入れてみたのですが、うまくいきませんでした。 どなたかご教示いただければありがたいです。よろしくお願いします。

  • エクセル 入力規則

    何か良い方法がないか教えてください。シートが2つあり、一方のBシートのある列に担当者の名前を入力すると(行は顧客データが入っています)、もう一方のAシートのその顧客の行の担当者欄のセルにその担当者名が参照され、参照されると自動的に進行状況欄のセルに商談中と表示させたいのです。進行状況欄に入力規則のリストが設定されていない場合でしたら、簡単に出来ると思いますが、進行状況欄のセルにはリストで(未、商談中、成約、破談、その他)で選べるようにしておきたいのです。で商談の進み具合により、商談中を成約に変えたりできるように。 現在は、Bシートに営業の者が担当者名を随時入力すると、毎週決まった曜日に私が担当者名が新たに入力されたかどうか確認して、それをコピーしてAシートに貼り付け、進行状況欄を商談中に代えています。かなり手間がかかるので営業の者が担当者名を入力するだけで一度に入力規則を残したまま商談中と表示できないものでしょうか? Aシートの担当者名をBシートからの参照にしておき、Aシートをフィルターかけて担当者名が入力されているのに、まだ未になっているもの(商談中が未に逆戻りすることはないため)を商談中に変える方法なら今より楽にはなりますが、上記のように一気に出来ないものかと。 質問がわかりづらかったらすいません。補足しますのでご質問ください。

  • エクセルの入力規則について質問します。

    エクセルの入力規則について質問します。 やりたいことは、“東京都”を選ぶと東京都の区と市がプルダウンで出てくるみたいな感じです。 困っていることは、 A列に大項目A、B、C、D、E、(←実際使う文字)と一つずつ入れ、名前の定義で名前を付け、B列以降の列に中項目を入れて名前の定義をつけて入力規則を使ってプルダウンで選べるようにしようとしたのですが、”C”だけがなぜか名前がつけられず困っています。 なので他の部分はちゃんとプルダウンで選べるのですが“C”だけは中項目が選べません。 説明がわかりづらくてスイマセン。 この方法を使わなくても、とにかく中項目をプルダウンで選べるようにしたいのですが。。。 何か方法がありませんでしょうか??よろしくお願いいたします。

  • Excel VBA:エクセルのマクロで入力規則を設定する際のアラートの扱いがわからず困っています

    エクセルでINDIRECTを使った入力規則設定をマクロで行う際の、アラートの扱いがわからず困っており、お教えいただけると幸いです。 例えば、A列に日付、B列にその日付に行った都道府県名、C列にはB列で選択した都道府県に属する自治体名を入れる場合を考えます。 そのために、  ・北海道、青森、…という具合に都道府県名のリストに、あらかじめ『都道府県名』と言う名前をつけたものを作成しておく。  ・洞爺湖、阿寒湖、釧路、…という北海道の自治体名リストにあらかじめ『北海道』と言う名前をつけたものを作成しておく。  ・弘前、八戸、十和田、…という青森県の自治体名リストにあらかじめ『青森』と言う名前をつけたものを作成しておく。   :(以下同様) と言う準備をしたあと  -B列の入力規則ダイアログボックスで、入力値の種類を『リスト』、元の値として『=都道府県名』とすることでドロップダウンリストから都道府県名を選ぶことが出来ます。  -C列の入力規則ダイアログボックスで、入力値の種類を『リスト』、元の値として『=INDIRECT(B1)』とすることでドロップダウンリストから自治体名を選ぶことが出来ます。   C列の規則を設定する際にB列にまだ都道府県名が入っていない場合は『元の値はエラーと判断されます。続けますか?』と言うアラートが出ますがOKを押して続行。 とすれば、C列のドロップダウンリストでB列で選択した都道府県に属する自治体名が選べることになります ここまでは、教科書などにも書いてある内容なので問題はないのですが、これをマクロ化すると問題が発生します。 上記の入力規則の設定をマクロで記録し、実行すると  『実行時エラー'1004'.アプリケーション定義またはオブジェクト定義のエラーです。』 が発生します。エラーの起こっている場所はC列の入力規則定義部分の .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:="=INDIRECT(B1)" のようです。 B列に都道府県名が入った状態ではエラーとはならないので、マクロ記録時に『元の値はエラーと判断されます。続けますか?』が出てOKとした部分が 何らかの問題となっているとは思うのですが、対処方法がわからずに困っております。 ちなみに、On Error Resume Nextを入れておいたとしても、エラーでマクロが中断されることはなくなりますが、入力規則の設定は行われないので対処方法にはなりません。 質問が長くなり恐縮です。 コピーペーストなどで入力規則の設定が消えてしまうことがあるので、ブックの立ち上げ時に入力規則の再定義をしたいと考え、このような質問となりました。 対処方法おわかりの方、ご教授いただけると大変助かります。 なお、環境はwindowsXP、excel2003です。 よろしくお願いいたします。

  • エクセルVBAで入力規則の列数を取得

    エクセル2013です。 ワークシートのB列、C列、E列に入力規則が設定してあります。 ところが以下のマクロを動かすと Cells.Count は正しく3を返しますが、Columns.Countは2返ります。 B、C、D列に入力規則を設定したときは、Columns.Countはちゃんと3が返ります。 B、D、E列に入力規則を設定したときは、Columns.Countはなんと1が返りました。 なぜでしょうか? Sub TEST01()   With Rows(3).SpecialCells(xlCellTypeAllValidation)     MsgBox .Cells.Count     MsgBox .Columns.Count   End With End Sub

  • 「入力規則」が適用されているセルのコピーについて

    以前、エクセルの入力規則を用いて重複入力を防ぐ方法について質問(具体的にはA1~A20とC1~C20の計40マスについて、同じ数値が入るとエラーが出るようにするにはどうすればよいか)させていただき、以下の方法で解決しました。 1)A1:A20を範囲選択して、Ctrlを押しながら、C1:C20の範囲を選択します 2)このように範囲選択しますと、「C1」がアクティブセルになります 3)メニューバーの「データ」→「入力規則」を選択して「入力値の種類」を「ユーザー設定」にして「数式」に =(COUNTIF($A$1:$A$20,C1)+COUNTIF($C$1:$C$20,C1))<2 と入力します さて、この続きで疑問が生じたのですが、 1.追加でD5のセルをこの範囲に含めたい場合(A1~A20とC1~C20とD5に同じ数値が入力できない状態)に、もう一度上記のような算式を入力せずに簡単にできる方法はありますか?(例えばセルのコピーのような方法) 2.また同様に追加でE1~E20をこの範囲に含めたい場合(A1~A20とC1~C20とE1~E20に同じ数値が入力できない状態)に、もう一度上記のような算式を入力せずに簡単にできる方法はありますか?

  • エクセルで入力規則が崩れてしまう。

    エクセル2003を使用しています。 入力規則を入れてから並べ替えをすると、せっかく入れた入力規則が崩れてしまいます。 ~入力内容~  あるデータの1つの項目に3つの分類があり、入力する際にその案件はA分類なのかB分類なのかC分類なのかを見て入力してもらうため、入力ミスがないようにデータには入力規則のユーザー設定を入れて、間違ったセルに入力するとエラーが出て入力できないようにしました。  その後、案件順び並べ替えたら、崩れてしまいました。  並べ替えてから入力規則を入れればいいと思いますが、案件は都度増えていき、そのたびに並べ替えをしたいのです。  何かいい方法があったら教えてください。

専門家に質問してみよう