• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのフォームの)

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

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

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

  • ベストアンサー
  • 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