質問にそって、コードを書いてみました。書き方の一例です。
内容については、各行にコメントを付けておきましたのでそちらを参照して下さい。
大まかには、
セルに入力
→Worksheet_Changeイベントが発生
→想定してあるセルに入力されていれば回答のチェックルーチン(共通)に飛ぶ
→指定があれば入力文字の指定等(全角文字、半角文字、数値等)をチェック
→回答自体をチェック
→回答内容によってメッセージを出力
の流れにしてみました。
ワークシート関数だけでなく、VBEで、配列を使ったり回答の範囲チェックしたり、ヒントを出したり(これを書きながら思いついた)いろいろなことが可能と思います。 ご参考に。
シートのコードウインドウに貼り付けます。
ここから
↓
'シートに入力された時にWorksheet_Changeイベントが発生する
Private Sub Worksheet_Change(ByVal Target As Range)
'答えが合っていれば『正解』
'合っていなければ『間違っています』+αを隣のセルに出す。
Select Case Target.Address(0, 0) '行・列は相対参照にしている(好みです)
Case "C1"
'セルC1:正解=abc 特に他のメッセージは出さない
Check_Kaitou Target, "abc", ""
Case "C2"
'セルC2:正解=ab 半角でない場合、『半角で入力して下さい』
Check_Kaitou Target, "ab", "半角指定"
Case "C3"
'セルC3:正解=あいう 全角でない場合、『全角で入力して下さい』
Check_Kaitou Target, "あいう", "全角指定"
Case "C4"
'セルC4:正解=123 数値でない場合、『数値で入力して下さい』
Check_Kaitou Target, "123", "数値指定"
End Select
End Sub
'回答のチェックと、回答が入力要件(半角や全角等)を満たしているかなどをチェックします
'引数は、回答:Kaitou、正解:Ans、追加チェックする内容:HanteiKubun
Sub Check_Kaitou(Kaitou As Range, Ans As String, HanteiKubun As String)
Dim msg As String '回答の隣に出すメッセージ
Dim kai As String '回答
Dim L As Integer '回答の文字列のカウンタ
kai = Kaitou.Text
Select Case HanteiKubun
Case "半角指定"
'全ての文字が半角か調べる
For L = 1 To Len(kai)
If Not Abs(Asc(Mid(kai, L, 1))) < 256 Then
msg = "半角で入力して下さい"
Exit For
End If
Next
Case "全角指定"
'全ての文字が全角か調べる
For L = 1 To Len(kai)
If Abs(Asc(Mid(kai, L, 1))) < 256 Then
msg = "全角で入力して下さい"
Exit For
End If
Next
Case "数値指定"
'数値か調べる
If Not IsNumeric(kai) Then
msg = "数値を入力して下さい"
End If
Case ""
'追加のチェックはしない
End Select
'最終のメッセージを作成する
If kai = Ans Then
msg = "正解"
Else
msg = "間違っています。" & msg
End If
'メッセージを表示する
Kaitou.Offset(0, 1) = msg
End Sub
お礼
回答どうもありがとうございます。これなら出来そうです。また複数条件の時の判定のアドバイスのありがとうございます。 後で気がついたのですがC1は回答欄とし、E1とE2は答えです。答えがバレバレですね。E1とE2を対象のセルとして使い非表示に出来るのかな~?。 別シートにしてシートを非表示にするというやり方になるのかな。参考(本)に書いてあるとおりにはうまくいくのですが内容が変わるとエラーとなりなかなかうまくいきません。