エクセルフォームで重複チェックを行い、エラーメッセージを表示する方法

このQ&Aのポイント
  • エクセルのフォームでテキストボックスの値を入力し、重複チェックを行いたい場合の方法を教えてください。重複した値があった場合にエラーメッセージを表示したいです。
  • エクセルフォームでA列とB列でチェックしたい項目がある場合、両方の条件が満たされた場合にエラーメッセージを表示する方法を教えてください。
  • エクセルのフォームを使ってデータを入力している時に、重複した値をチェックしてエラーメッセージを表示する方法を知りたいです。具体的には、A列には番号、B列には氏名が入っている状況で、重複した鈴木さんのデータを削除したいです。
回答を見る
  • ベストアンサー

エクセルのフォームの

エクセルのフォームの テキストボックスの値をエクセルシートに入れていっているのですが フォームを閉じる時に、重複した値のチェックを入れたいのですが A:Bの列でチェックしたい項目が2つあって、どちらも満たしたときに エラーメッセージを出したいのですが、本を見ても載っていないので 質問させていただきました。 列Aは番号 列Bは氏名です。 A     B 1001001 山本 2001001 山本 3001001 鈴木 3001010 鈴木 3001001 鈴木 この例だと3001001 鈴木が重複していますので 2回目に入力した分を削除しようとしています。 すみませんがどなたか教えてください。 よろしくお願いいたします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.7

暇にまかせてまたまた登場、myRangeです。 ---------------------------------------------------------- >Msg = MsgBox("課題番号:" & kadaiCode & "" & Namae1& _ "は登録済みです。上書きしますか?", vbYesNo,"確認") >の部分が赤くなってしまいました。 入力ミスしてますよ。当方の回答では Msg = MsgBox("課題番号:" & kadaiCode & "" & Namae1▼& _ "は登録済みです。上書きしますか?", vbYesNo,"確認") ▼のところにスペースがひとつあるはずです。 --------------------------------------------------------- >上書きするボタンを押すと 実行時エラー1004 >アプリケーション定義またはオブジェクトの定義エラーとなり >.cells(Gyou,D).Value = kingaku1が黄色になりました。 これまた入力ミスです。回答では  .Cells(Gyou, ▼"D"▼).Value = Kingaku1 Dがダブルクォーテーションで囲まれてますよね? ---------------------------------------------------------- (注意事項) ●入力する時は、一字一句、確かめながら入力すること。 ●エラーが出たら入力ミスがないかちゃんと確認のこと。 で、ミスをなくすためには、なるべく回答コードをコピペする。(^^;;; 以上です。

norisukedon
質問者

お礼

myRangeさん 大変失礼しました。 コピペではなく自分でコードを書きながらやった方が覚えるのかなと 思って、手入力で入力ミス… しょうもないです。すみません。 メッセージボックスの中のスペースと""の位置がよく分からない…のです。 勉強不足ですみません。 myRangeさんは説明がとても上手で、入門者にもよく理解が出来ました。 コードの書き方はまだまだ分からないことばかりですが、本を読み読み アドバイスをいただきながら、今後も頑張りたいと思います。 ありがとうございました。

その他の回答 (6)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.6

マルチページコントロールについてはご自分で勉強する、ということで。。 '---------------------------------- Private Sub cmdTouroku1_Click()  Dim KadaiCode As Long '●数値  Dim KadaiMei As String  Dim Namae1 As String  Dim Kingaku1 As Long  Dim Kensuu As Long  Dim Gyou As Long  Dim R As Long  Dim Msg As Integer  'Dim Flag As Boolean '●今回は使わないので不要  KadaiCode = Val(txtKadaiN.Text) '●数値変換  KadaiMei = txtKadaiMei.Text  Namae1 = txtNamae1.Text  Kingaku1 = CLng(txtKingaku1.Text) '●数値変換 '▼ダブりチェック With Worksheets("電話帳")  Kensuu = .Cells(1, 5).Value '●●Kensuuはここで取得しておく  For R = 2 To Kensuu + 1   If .Cells(R, "A").Value = KadaiCode And .Cells(R, "C").Value = Namae1 Then     Gyou = R     Exit For   End If  Next R End With If Gyou <> 0 Then   Msg = MsgBox("課題番号:" & KadaiCode & " " & Namae1 & _       " は登録済み、上書きしますか?", vbYesNo, "確認")   If Msg = vbYes Then  '▼ダブり上書き     With Worksheets("電話帳")      .Cells(Gyou, "D").Value = Kingaku1     End With   End If Else  '▼ダブりなしの処理   Kensuu = Kensuu + 1   Gyou = Kensuu + 1   With Worksheets("電話帳")    .Cells(Gyou, 1).Value = KadaiCode    .Cells(Gyou, 2).Value = KadaiMei    .Cells(Gyou, 3).Value = Namae1    .Cells(Gyou, 4).Value = Kingaku1    .Cells(1, 5).Value = Kensuu   End With End If '▼TextBoxクリアー&番号へ   txtKadaiN.Text = ""   txtKadaiMei.Text = ""   txtNamae1.Text = ""   txtKingaku1.Text = ""   txtKadaiN.SetFocus End Sub '------------------------------------ ●ダブりの上書きは、金額だけにする ●変数の宣言は、一行ずつにした方が分かりやすい。  また、Dim Namae1, kadaiMei, kadaiCode As String  こういった宣言では、Namae1とkadaiMeiはVariant型になる ●書込み行はセルE1を使わないで自動取得が普通ですが  本を見ながらということですのでそのままにしてあります。  因みに最終行は、以下で取得できます。    Cells(Rows.Count,"A").End(xlUp).Row 以上です。

norisukedon
質問者

補足

myRangeさん 返信ありがとうございます。 教えていただいたコードをさっそく書き込んでみたのですが、 If Gyou <> 0 Then Msg = MsgBox("課題番号:" & kadaiCode & "" & Namae1& _ "は登録済みです。上書きしますか?", vbYesNo,"確認") の部分が赤くなってしまいました。 それで、ダブルクオテーションを増やしてみたところ 課題番号:"&kadaiCode&"&Namae1&"は… とメッセージ内容が変わってしまいました。 あと、上書きするボタンを押すと 実行時エラー1004 アプリケーション定義またはオブジェクトの定義エラーとなり、デバッグを押すと .cells(Gyou,D).Value = kingaku1が黄色になりました。 どうしてでしょうか。。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

こんばんは、myRangeです。 まだ補足がないようなので質問者のコードをちょと眺めてみました。 あと少し補足が必要です。 ●提示のコードで判断すると見出しは    A(課題番号)B(課題名)C(名前)D(金額) となってるようですが、 最初の質問ではA列とB列が同じだったらダブりにする、となってますよね? で、当方の回答もそうなってますが、 実際は、A列とC列が同じだったらダブりとするのでは? ●シート電話帳のセルE5に現在の登録件数が入っていて、  そして、見出しは、1行目で、データは2行目からですね? ●UserFormが表示されてるとき、シート電話帳はアクティブか、そうでないか? (これはアクティブだったらコードが短くなるので)   以上です。

norisukedon
質問者

補足

myRangeさん ご回答いただいていたのに、返信が遅くなり申し訳ありません。 (1)課題番号は、数値なのか文字列なのか?→数値です。 (2)ダブりがあった時に上書きする場合は、    ヒットした行に上書きする →です。 また >最初の質問ではA列とB列が同じだったらダブりにする、となってますよね? >で、当方の回答もそうなってますが、 >実際は、A列とC列が同じだったらダブりとするのでは? すみません。実際はA列とC列がダブリだったらの判定をします。 上書きを聞くようにするのは、金額が変わったりするからです。 >シート電話帳のセルE5に現在の登録件数が入っていて、 >そして、見出しは、1行目で、データは2行目からですね? 「はじめての裏技ExcelVBA」という本を見て書いたので、1件づつ増やすには 現在の登録件数を入れてそれに1づつ追加する、というやり方でしたので…。 見出し、データともにおっしゃるとおりです。 >UserFormが表示されてるとき、シート電話帳はアクティブか、そうでないか? >(これはアクティブだったらコードが短くなるので) シート電話帳は、非アクティブでもどちらでもいいのです。 もともとはいくつかのCSVデータをエクセルに加工したものをいったんマルチページの1ページ目 に読み込んで、マルチページ2~5ページを手入力で入れるというフォームなのです。 共通しているのは課題番号と課題名です。 今教えていただいているのは、2~5ページの手入力の部分で、それは紙ベースでデータが ないので、マルチページの1ページ目のデータを読み込んでいるシート(ライトといいます)とは 別に、電話帳(名前は変ですが)というシートに手入力の分だけデータを入力していっている という感じです。 本当は、ライトというシートに追加していきたいのですが、やり方が分からなかったんです。 でも今こうして教えていただきながらやっていると、なんとなく分かるような…気がしてきました。 返答になっていますでしょうか。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

またまたmyRangeです。 一発必中の回答をするためには最低限以下の補足が必要です。 (1)課題番号は、数値なのか文字列なのか? (2)ダブりがあった時に上書きする場合は、    ヒットした行に上書きするのか    それとも、最終行+1行目に、新たに書き込むのか 今から帰宅予定ゆえ、回答は夜になります。 以上です。  

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

回答2、myRangeです。 >重複したデータを登録せずやめるか、 >上書きするかを聞くようにしたいのですが ダブりのデータを上書きしてもあまり意味がないと思いますが、、、 ま、それは置いといて、、、 先の回答にも書きましたが全体のコードが提示されてないので、部分回答。 MsgBoxにYesNoボタンを表示しそれで分岐します。 '------------------------------------------------- Private Sub CommandButton1_Click()  Dim R As Long  Dim Flag As Boolean  For R = 1 To Cells(Rows.Count, "A").End(xlUp).Row    If Cells(R, "A").Value = Val(TextBox1.Value) And _      Cells(R, "B").Value = TextBox2.Value Then         Flag = True         Exit For    End If  Next R  Dim Msg    '●●YesNo用変数を追加  If Flag = True Then    Msg = MsgBox(TextBox1 & " " & TextBox2 & " はダブりです" _       & vbLf & vbLf & "上書きしますか?", vbYesNo, "確認")          If Msg = vbYes Then      '●●ここに上書きコード●●      Else      TextBox1.Value = ""      TextBox2.Value = ""      TextBox1.SetFocus    End If       Exit Sub  End If      '==▼以下、正常処理== End Sub '-------------------------------------------- ■■更に質問があるときはコードを全部提示のこと。 以上です。  

norisukedon
質問者

補足

myRangeさん 確かに上書きの必要は…と思いますが、ありがとうございました。 分岐を追加したのですが、YesNoすら聞いてこなくなってしまいました。 上書きのコードは最初に実行したコードを書けばよいのですよね? でもきっと何かが足りないのです。全部コピーしましたので、見ていただけないでしょうか。 ---- Private Sub cmdTouroku1_Click() Dim Namae1, kadaiMei, kadaiCode As String Dim Kingaku1, Kensuu, Gyou, R As Long Dim Flag As Boolean Dim Msg As Byte kadaiCode = txtKadaiN.Text kadaiMei = txtkadaiMei.Text Namae1 = txtNamae1.Text Kingaku1 = txtKingaku1.Text Kensuu = Worksheets("電話帳").Cells(1, 5).Value Kensuu = Kensuu + 1 Gyou = Kensuu + 1 With Worksheets("電話帳") .Cells(Gyou, 1).Value = kadaiCode .Cells(Gyou, 2).Value = kadaiMei .Cells(Gyou, 3).Value = Namae1 .Cells(Gyou, 4).Value = Kingaku1 .Cells(1, 5).Value = Kensuu End With For R = 1 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(R, "A").Value = Val(txtKadaiN.Value) And _ Cells(R, "B").Value = txtNamae1.Value Then Flag = True Exit For End If Next R If Flag = True Then Msg = MsgBox("課題番号:" & txtKadaiN.Value & " " & txtNamae1.Value & " はすでに登録されています。上書きしますか?", vbYesNo, "確認") If Msg = vbYes Then Kensuu = Worksheets("電話帳").Cells(1, 5).Value Kensuu = Kensuu + 1 Gyou = Kensuu + 1 With Worksheets("電話帳") .Cells(Gyou, 1).Value = kadaiCode .Cells(Gyou, 2).Value = kadaiMei .Cells(Gyou, 3).Value = Namae1 .Cells(Gyou, 4).Value = Kingaku1 .Cells(1, 5).Value = Kensuu End With Else txtNamae1.Value = "" txtKingaku1.Value = "" txtNamae1.SetFocus End If End If Exit Sub End Sub

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

全体のコードが提示されてないので質問部分だけについて。。。 '------------------------------------------------- Private Sub CommandButton1_Click()  Dim R As Long  Dim Flag As Boolean  For R = 1 To Cells(Rows.Count, "A").End(xlUp).Row    If Cells(R, "A").Value = Val(TextBox1.Value) And _      Cells(R, "B").Value = TextBox2.Value Then         Flag = True         Exit For    End If  Next R  If Flag = True Then    MsgBox TextBox1.Value & " " & TextBox2.Value & " はダブり!"    TextBox1.Value = ""    TextBox2.Value = ""    TextBox1.SetFocus    Exit Sub  End If '==▼以下、正常処理== End Sub '-------------------------------------------- 質問例の番号は数値のようなので、 比較時点で、Val(TextBox1.Value)と数値変換してあります。 以上です。

norisukedon
質問者

補足

myRangeさん ありがとうございます。 結果がちゃんと出ました。 さらに質問させてください。 重複したデータを登録せずやめる (テキストボックスをクリアにするやりかたは  さきほど教えていただきました) か、 上書きするかを聞くようにしたいのですが どのようにすればよいでしょうか。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

A列最優先、B列を2番目に優先、にして並べ換えしてから、 C列に、以下を入れて下にドラッグコピーみて下さい。 C1セル=IF(A1&B1=A2&B2,"重複データ","")

norisukedon
質問者

補足

aokiiさん ありがとうございます。 シート上で作業する分にはこれでいいと思うのですが フォームの確認ボタンを押したときに、この作業が 出来るとよいのですが、VBAにこの関数を書くときは どのようにしたらいいでしょうか。

関連するQ&A

  • エクセルのユーザーフォームについての質問です。

    エクセルのユーザーフォームについての質問です。 かなりの初心者です。 テキストボックスを3つ、チェックボックスを10個作りました。 チェックボックスは複数チェックすることができます。 コマンドボタンをクリックすると、テキストボックスに入力された値とチェックされた チェックボックスがsheet1に自動入力できるようにしたいです。 たとえば、 テキストボックス1には「あいう」 テキストボックス2には「かきく」 テキストボックス3には「さしす」と入力。 チェックボックス1から10のうち、「1」「2」「3」にチェック。 この状態でコマンドボタンをクリックすると、Sheet1には     A列       B列       C列        D列 1行目 テキスト1    テキスト2    テキスト3     チェックボックス 2行目 あいう      かきく      さしす       1 3行目 あいう      かきく      さしす       2 4行目 あいう      かきく      さしす       3 このように、チェックボックスにチェックがあった数だけ、テキストボックスも コピーされて、次々と下の行に入って行くようにしたいのです。 こんなことができるのでしょうか? できるのなら、コードを教えてください。 お願いします。

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • エクセル2003のフォームを作成しています。

    エクセル2003のフォームを作成しています。 2点質問があります。 (1) UserForm1にテキストボックス1と2 マルチページの中にテキストボックス3と4があります。 エクセルのシート名はSheet1です。 一例) マルチページ1 テキストボックス1:A100 テキストボックス2:山田太郎 テキストボックス3: テキストボックス4: マルチページ2 テキストボックス1:A100 テキストボックス2:山田太郎 テキストボックス3: テキストボックス4: マルチページ3 テキストボックス1:A100 テキストボックス2:山田太郎 テキストボックス3: テキストボックス4: マルチページ4 テキストボックス1:A100 テキストボックス2:山田太郎 テキストボックス3: テキストボックス4: マルチページ5 テキストボックス1:A100 テキストボックス2:山田太郎 テキストボックス3: テキストボックス4: エクセルのシート(Sheet1)には A     B    C    D   E A100 山田太郎 木村 5000円 担当1 A100 山田太郎 村田 6000円 担当2 A100 山田太郎 江崎 3000円 担当3 A200 田中花子 吉田 4000円 担当1 A200 田中花子 鈴木 1000円 担当2 とデータが続いています。 UserForm1に読込というボタンがあるのですが、クリックしたらシートの A列でA100、B列で山田太郎、かつE列で「担当1」の行の C列の名前をテキストボックス3、D列の金額をテキストボックス4 に表示させるにはどのように書けば良いのでしょうか。 ページ2は、ボタンではなく、ページをクリックした時に 上記と同様のイベント A列でA100、B列で山田太郎、かつE列で「担当2」の行のC列の名前を テキストボックス3、D列の金額をテキストボックス4に表示、 ページ3は、2と同様ページをクリックした時に A列でA100、B列で山田太郎、かつE列で「担当3」の行の C列の名前をテキストボックス3、D列の金額をテキストボックス4 に表示、 以降のページも上記と同様のことをさせたいと思っています。 マルチページは5ページありますが、必ずしもシートに担当5まで あるわけではなく、A100 山田太郎のように、担当が1から3しか シートにデータがない場合は、マルチページの4と5は空欄に ならなければなりません。 (2)ページのタブをクリックした時のイベントの書き方が分かりません。 ページをクリックした時のイベントは、こちらで同じような質問を されている方のを見て、タブをクリックした時のコードをコピーして みまして試してみましたが、無反応でした。 Private Sub MultiPage1_Click(ByVal Index As Long)  'Page2がクリックされた場合  If Index = 1 Then   Load UserForm1   With UserForm1    .StartUpPosition = 0    .Top = 50    .Left = 20    .Show   End With  End If End Sub 分かりづらい説明で申し訳ありませんが、どなたか教えていただけ ませんでしょうか。よろしくお願いいたします。

  • エクセル マクロの記述 =VLOOKUP()

    エクセル マクロ ユーザーフォームを作成して そのフォ-ムのなかにテキストBoxを2つ 作り、TextBoX1にID番号(Sheet1にA列にID番号、B列に氏名あり)を入力すると、TextBox2に氏名が表示出来るようにしたいです。 そのような記述を教えて下さい。 お願いします。

  • エクセル ユーザーフォームについて

    エクセル ユーザーフォームに関する質問です。 (1)ユーザーフォームを開くと同時に、あるテキストボックスに、その当日の日付が表示できるようにすることはできますか? (2)  A  B  C  D  E  1 名前 英語 数学 国語  2 青木  86 75 85 3 浅野  75 80 65 4 5  となっている場合に、E列のセルをクリックするとユーザーフォームが立ち上がるようにしたいのです。その際に、クリックしたセルが(E列,2行)でしたら、青木君の成績がユーザーフォーム上の各テキストボックスに表示され、また、(E列,18行)をクリックした場合には、18行目の鈴木君の成績が・・・というようにしたいのですが、わかりません。 ご親切な方がおりましたら、是非とも宜しくお願い致します。

  • エクセルのユーザーフォームのことです

    はじめまして。よろしくお願いします。 エクセルで、リストを作成しようと思っています。内容は、顧客名簿で、A名前、B住所、CからEまでははじめから項目があって、それに該当するものにチェックを入れる。項目とは、C医療、D教育、E学校という項目です。ユーザーフォームでテキストボックスを2つとチェックボックスを3つ、その他に確定ボタン、閉じるボタンを付けました。ユーザーフォームの名前住所に文字を入れ、チェックボックスに該当するもののチェックを入れ、確定ボタンでシートに転記し、続けて次の名簿を入れる・・という風にしたいのです。いろいろ参考にしながら作成したのですが、、、 質問(1)一人目、3つあるチェックボックスのうち2つにチェックを入れる→確定ボタンを押してもチェックボックスのチェックが残ってしまい、二人目を入れるのにチェックを一度消さなくてはならないのです。確定ボタンを押すと転記された後チェックがリセットされるようにするには、どうしたらよいのでしょうか? 質問(2)チェックをシートに転記すると、現在セルにはTRUEと入ります。これを”○”とか”レ”とかの記号にするにはどうしたらよいですか? おそらく、既に回答がある質問だとは思ったのですが、探すのが下手なのか見つけられずに、はじめてこちらに質問させて頂く次第です。よろしくお願いいたします。

  • Excelユーザーフォームでのデータ検索

    初心者の質問で申し訳ございません。 ユーザーフォームを利用して検索ボタンを作ろうと考えています。 ユーザーフォームでテキストボックスを2個と コマンドボタン1個を作成し、 テキストボックス1に検索したい氏名を入力して コマンドボタンを押すと、 ワークシート(ワークシート名、データ)に作成されたデータのD列から 一致するものを検索し、 一致したデータのA列にある「番号」をテキストボックス2、 表示する。 というマクロが書けず困っています。 よろしくお願いします。

  • エクセルで検索値があった時に特定の文字列をかえす

    こんにちは。 Excelについて教えてください。 Excelのシートが2枚あり、1枚目には以下のようなデータがあります。 -------------------- A列    B列 -------------------- 1000 2000 3000 4000 4000 1000 -------------------- 2枚目のシートには各列に以下のようなデータがあります。 -------------------- A列    B列 -------------------- 1000    棚田さん 2000    池内さん 3000    山本さん 4000    佐藤さん -------------------- 1枚目の値が2枚目のシートの値に該当するものがあった場合、2枚目シートのB列の値を1枚目のシートに下のように返したいです。どのような関数を使ったらいいでしょうか? -------------------- A列    B列 -------------------- 1000   棚田さん 2000   池内さん 3000   山本さん 4000   佐藤さん 4000   佐藤さん 1000   棚田さん --------------------

  • エクセルでこのような事ができますか?

    エクセルでマクロとか使わずに簡単に以下の作業ができる方法がありますか?      A      B 1   田中 2   山本 3   中村 4   岡田 5   鈴木      ↓   A列にずっと1000人ぐらいの名前がある。   このシートをもとに下のような1から6の番号をB列につけたシートを   作りたいのですが・・・      A      B 1   田中     1 2   田中     2 3   田中     3 4   田中     4 5   田中     5 6   田中     6 7   山本     1 8   山本     2 9   山本     3 10  山本     4 11  山本     5 12  山本     6 13  中村     1 14  中村     2      ↓    6000行まで入ることになります。

専門家に質問してみよう