dポイントプレゼントキャンペーン実施中!

先日こちらで重複チェックの仕方を教えていただきました。
これをアレンジしようと思ったのですが、どうしてもうまくいかないので、もう一度教えていただけませんでしょうか?

先日は4つ全てのデータが一致する場合にメッセージボックスが出るように教えていただきました。
今回はチェックするのは3箇所で、そのうち2箇所が選択でどちらかにだけデータが入ります。

一番最初にコンボボックスでワードを選びます。
次にテキストボックスに数字を入れるのですが、テキストボックスが2つあり、どちらかにだけデータを入れます。

コンボボックス とテキストボックス1、コンボボックス とテキストボックス2の組み合わせになるのですが、
これが既にデータがある場合にメッセージボックスが出るようにしたいと思います。

この場合はどのように変更したらいいのでしょうか?
今のコードは以下の通りです。
どうかよろしくお願いいたします。

Private Sub touroku2_Click()
Dim res
res = MsgBox("登録します。よろしいですか?", vbYesNo + VbInfomation, "確認")
If res = vbNo Then
Exit Sub
End If
Sheets("銘柄").Activate
Dim Lrow
With Sheets("銘柄")
If WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("C:C"), txtip, .Range("D:D"), txtru) = 1 Then
MsgBox "既に登録があります。"
Exit Sub
Else
Lrow = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & Lrow).Value = cbokaisya
.Range("C" & Lrow).Value = txtip
.Range("D" & Lrow).Value = txtru
.Range("E" & Lrow).Value = txtmeigara
.Range("F" & Lrow).Value = txthyouki
End If
End With
End Sub

A 回答 (11件中1~10件)

No.10です。



>をするケースはあります。
>これは有効にしたいです。

この場合ですと過去に
cbokaisya : txtip
で登録した際のtxtruのセルは当然空白って事ですよね?

こちらではどうでしょう?(一部しか載せてませんが)

With Sheets("銘柄")

Select Case True
Case txtru = "" And WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("C:C"), txtip) > 0
MsgBox "既に登録があります。"
Exit Sub

Case txtip = "" And WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("D:D"), txtru) > 0
MsgBox "既に登録があります。"
Exit Sub

Case Else
Lrow = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & Lrow).Value = cbokaisya
.Range("C" & Lrow).Value = txtip
.Range("D" & Lrow).Value = txtru
.Range("E" & Lrow).Value = txtmeigara
.Range("F" & Lrow).Value = txthyouki
End Select

End With
    • good
    • 0
この回答へのお礼

できました!
ありがとうございます(涙)
何度も本当にありがとうございました。

お礼日時:2020/05/09 11:52

No.9です。



もしかしてですが。
過去に
cbokaisya : txtip
で登録をしていて今回は
cbokaisya : txtru
で登録をしようと(そのようなデータ登録は有効とみなす?)しているとか。
ならば既に登録されているって判定される事について他に理由はなさそうに思えるのですが。。。

そうすると空白ではないテキストボックスコントロールを判断させ(No.6 fujillin さん回答の)、CountIfsを加算させて判定していたのをそのテキストボックスコントロールのみとの
組み合わせになるよう切り離して別々に判定した方が良いかもですが、実際のデータとしては私の仮説であってますでしょうか?
もしあっているとした場合、現在の検証コードはどのようになっているのか教えてください。
    • good
    • 0
この回答へのお礼

めぐみん_さん、何度もすみません。

cbokaisya : txtip
で登録をしていて、その後
cbokaisya : txtru
をするケースはあります。
これは有効にしたいです。

今はテストなので全く異なる数値で入力していました。
今まで登録がないものを入力してみようとしておりましたが、既に登録されていると表示されてしまいます。

お礼日時:2020/05/09 11:05

No.7,8です。


ちょっと確認を。

If WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("C:C"), txtip) + WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("D:D"), txtru) > 0 Then

このコードを

If (WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("C:C"), txtip) + WorksheetFunction.CountIfs(.Range("A:A"), cbokaisya, .Range("D:D"), txtru)) > 0 Then

このようにカウントの加算を()で括った状態でも未登録なのに挙動がおかしくなりますかね?
CountIfs関数自体使う機会がなく(最近まで2002を使ってたので)、動作を把握しきれてませんでした。
先ほどの懸念を数式でチェックしてみると私が思っていたような結果にはならなさそうでしたので、あとは条件式の判定ミスなのかな?と。
    • good
    • 0
この回答へのお礼

確認が遅くなりすみません。

()で括ってみましたが、やはり「既に登録があります」と表示されてしまいます・・・。

お礼日時:2020/05/09 10:13

No.7です。



やっぱり。
前回の質問が閉じられた後にCountIfs関数の欠点が出てこないかと心配はしてたのですが。。。やっぱり。。。出ましたか。
どう対策するかですよねぇ。
    • good
    • 0
この回答へのお礼

元々懸念があったのですね。
もう私の知識では全然理解できていなくて・・・。

お礼日時:2020/05/08 15:04

No.5です。



>WF As WorksheetFunction '文字数省略の為
>WF.CountIfs

って使えないみたいですね。(どこかでか見たような気がしたのですが、未検証でしたのでごめんなさい。)
変数の宣言を消して
WF.CountIfs(~

WorksheetFunction.CountIfs(~
に書き換えてみて下さい。
    • good
    • 0
この回答へのお礼

何度もすみません。
ありがとうございます。

試してみたところ、エラーは出ませんでしたが、未登録情報でも「既に登録があります」と出てしまいます。

お礼日時:2020/05/08 12:53

No2です。



他の方が丁寧に回答なさっているようなので、今更追加する必要もないのかもしれませんが…

どのような形でテキストボックスの値を取得しているのかわかりませんが、ふたつのテキストボックスの値をtxt1、txt2とするなら、

If (txt1 = "" And txt2 = "") Or (txt1 <> "" And txt2 <> "") Then
  '両方未入力または両方に入力がある場合のエラー処理
 Exit Sub
End If

If txt2 = "" Then
  'txt1に入力がある場合の処理
Else
  'txt2に入力がある場合の処理
End If

といった形式で判断できるはずです。

>どちらかに数値を入力します。
上記では変数が空白("")かどうかでチェックしていますが、数値の意味のあるものかどうかでチェックするなら、
 IsNumeric(txt1)
などを利用して判定するようにすれば良いでしょう。


>コピペして実行してみたところ、~~
コピペで実行できるものを作成するには、私には情報が不足しています。
コピペ以外をお考えでない場合は、この回答はスルーして他の方の回答をお待ちください。
    • good
    • 0
この回答へのお礼

fujillinさん、ありがとうございます。
せっかくの貴重なアドバイスですので、少しでも理解できるように頑張りたいと思います。

ご提示いただいたコードの日本語のところに希望する処理(メッセージボックスを入れるなど)をするということでしょうか?

お礼日時:2020/05/08 09:42

No.4です。



Bookをバックアップして先に書いていた Private Sub touroku2_Click() ~ End Sub 全体を上書きするか、或いはその間のコードだけをコピペ上書きで良いはずですが。。。
どのような事をしてそのエラーが出ているのか、ちょっと思いつかない。(そのエラーの経験がないので)
    • good
    • 0
この回答へのお礼

お礼が遅くなりすみません。
原因がわからず、ひたすら消して書き直しをしていました。
とりあえずエラーは出なくなりました。

コードについて試してみたところ、
If WF.CountIfs(.Range("A:A"), cbokaisya, .Range("C:C"), txtip) + WF.CountIfs(.Range("A:A"), cbokaisya, .Range("D:D"), txtru) > 0 Then
のところで黄色くなってしまいました。

ここはどのようにしたらよろしいのでしょうか???

お礼日時:2020/05/08 09:33

No.3です。


未検証なのでBookはバックアップを取って下さいね。

Private Sub touroku2_Click()
Dim res, WF As WorksheetFunction '文字数省略の為
res = MsgBox("登録します。よろしいですか?", vbYesNo + VbInfomation, "確認")
If res = vbNo Then
Exit Sub
End If

Select Case True '強制実行

'双方の文字を連結しても文字列の長さが0でしかない
Case Len(txtip & txtru) = 0
MsgBox "テキストボックスが双方とも未入力です": Exit Sub

'双方の文字数を積算しても0にならない
Case Len(txtip) * Len(txtru) <> 0
MsgBox "テキストボックスが双方とも入力されてます": Exit Sub

End Select

Sheets("銘柄").Activate
Dim Lrow
With Sheets("銘柄")
'それぞれを別々にCountして加算し結果として0を超えた場合
If WF.CountIfs(.Range("A:A"), cbokaisya, .Range("C:C"), txtip) + WF.CountIfs(.Range("A:A"), cbokaisya, .Range("D:D"), txtru) > 0 Then
MsgBox "既に登録があります。"
Exit Sub
Else
Lrow = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & Lrow).Value = cbokaisya
.Range("C" & Lrow).Value = txtip
.Range("D" & Lrow).Value = txtru
.Range("E" & Lrow).Value = txtmeigara
.Range("F" & Lrow).Value = txthyouki
End If
End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
コピペして実行してみたところ、

「名前が適切ではありません:touroku2_Click」

と表示されてしまいます。

ボタンの名前は「touroku2」で間違いありません。

この場合はどうしたらよいのでしょうか?

お礼日時:2020/05/07 18:52

あれ?


うちの火狐の調子が悪いのかな?
既出の回答が見られない・・・

まずコンボボックスとテキストボックス2に値を入れて登録をするとします。
この場合テキストボックス2の値はD列に存在しているかを調べるだけで、C列の値(テキストボックス1で登録するデータ)には存在しないので調べる必要がないと考えて宜しいのでしょうか?
    • good
    • 0
この回答へのお礼

めぐみん_さん、ありがとうございます。

コンボボックス は必ず値を選択します。
その後テキストボックス1かテキストボックス2のどちらかに数値を入力します。
両方に入れた場合については現状対策しておりませんでしたが、
もし両方に数値が入った場合はエラーメッセージが出るようにしたいと思っています。

テキストボックス2の値はC列には存在しないので調べる必要はありません。

どうぞよろしくお願いいたします。

お礼日時:2020/05/07 16:26

No1です。



>テキストが両方とも入力される場合はありません
>(両方入力の場合はエラーになる仕組みを忘れていました)。
どこでテキストを取得してチェックを行っているのか不明ですが、両方ともに有意な文字列になることがないと保証されているなら、if文でどちらか片方が空白かどうかを判定すれば良いだけでは?
これで場合わけができるので、後は、ご提示と同じ方法でそれぞれチェックすればよいでしょう。
    • good
    • 0
この回答へのお礼

再度のアドバイスありがとうございます。
txtipとtxtruがテキストボックスで、このどちらかに数値が入ることになります。
両方に入ってしまった場合にエラーになるようにしたいのと、
cbokaisya(コンボボックス )+txtip(テキストボックス)、
cbokaisya(コンボボックス )+txtru(テキストボックス)、
で重複をチェックする方法が知りたいと思っております。
この場合はどのように記述したらよいか教えていただけませんでしょうか?

お礼日時:2020/05/07 08:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!