• ベストアンサー

エクセルの四者択一で、正解判定の方法は?

エクセルで、四者択一問題を作成中です。 前回、回答していただいたお陰で、次々と問題を選択できるようになったのですが、 フォーム中の、txt解答欄に1~4の数字を入力し、cmd判定ボタンをクリックすると、データシートのN行目の6列目にある解答欄の数字と比べ、txt判定欄に正解か間違いを表示しようと考えているのですが、  If txt解答.Value = Worksheets("データ").Cells(n, 6).Value Then txt判定.Value = "正 解" Else txt判定.Value = "間違い" End If 間違いばかりが表示されて、正解が表示されません。 ちなみに、 TextBox6 = Worksheets("データ").Cells(n, 6).Value とすると フォーム中のTextBox6にはtxt解答欄に入力した正解の“3”が表示されています。 どこが、悪いのでしょうか?

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

  • ベストアンサー
  • yasheeki
  • ベストアンサー率20% (14/67)
回答No.3

Dim text as Sting Dim num as Long num = StrConv(text, vbNarrow) とすると、 全角の3でも, 半角の3でも 勝手にVisual Basic がLong型に変換してくれますね。 これを、num = Clng(StrConv(text, vbNarrow)) とすると、より良いかも。 Visual Basic では、通常 "3" は 3 に変換しますね。 他の言語では、なかなかこんな風にはいかないようです(VB は超便利です)

eisan33
質問者

お礼

すごい関数があるのですね。この関数だと プログラムも簡潔にできると思います。 VBは奥が深いことがわかったので、 これから少しずつ勉強していきたいと思います。 有り難うございました。

その他の回答 (2)

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

TexBoxに入力された値は、たとえ数字を入れたとしても それは、数値ではなく文字列なので、VALやCINTなどの関数を使って、TextBoxの数字を数値に変換してやらなければいけません。 ●TextBoxの数字が全角、半角どちらでも許可する場合 If CInt(txt解答.Value) = Worksheets("データ").Cells(n, 6).Value Then ●TextBoxの数字が、必ず半角の場合は、VALでもいい If Val(txt解答.Value) = Worksheets("データ").Cells(n, 6).Value Then 以上です。

eisan33
質問者

お礼

早速回答を頂き有り難うございました。 3は数字ばかりと思っていました。TextBoxなので文字列なのですね。 教えていただいたとおり、Val関数でくくってやると、"正解"の2文字が出ました。本当に「正解」を教えていただき、有り難うございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>TextBox6 = Worksheets("データ").Cells(n, 6).Value とすると フォーム中のTextBox6にはtxt解答欄に入力した正解の“3”が表示されています。 この文章では”txt解答欄”の値が正しいと検証されていませんけど・・・? セルの回答値を取得出来ているだけですよね? MsgBox txt解答欄.Value MsgBox Worksheets("データ").Cells(n, 6).Value とか、 MsgBox txt解答欄.Value & "/" & Worksheets("データ").Cells(n, 6).Value などとして、双方の値を表示させて確認してみてはいかがですか?

eisan33
質問者

お礼

早速回答を頂き有り難うございました。 3が文字であることがわかりました。フォーム中では、数字の3の つもりで見ていました。VAL関数で数字にすると、正解が出ました。 うまくいきました。有り難うございました。

関連するQ&A

  • エクセルで四者択一の問題を作りたい。・フォーム画面のボタンをクリック、解答、採点画面を出したい。

    一応、フォーム画面で、ボタンをクリックするとデータシートから 持ってきて、それを問題がなくなるまで繰り返したいのですが、うまく いきません。 Private Sub cmd次_click() Dim n As Integer For n = 3 To Cells(Rows.Count, 1).End(xlUp).Row txt設問.Value = Worksheets("データ").Cells(n, 1).Value   txt問1.Value = Worksheets("データ").Cells(n, 2).Value txt問2.Value = Worksheets("データ").Cells(n, 3).Value txt問3.Value = Worksheets("データ").Cells(n, 4).Value txt問4.Value = Worksheets("データ").Cells(n, 5).Value n = n + 1 Next n End Sub Private Sub cmd判定_click() If op3.Value = True Then txt正解.Value = "○" Else txt正解.Value = "×" End If End Sub Private Sub cmd消去_Click() txt設問.Value = "" txt問1.Value = "" txt問2.Value = "" txt問3.Value = "" txt問4.Value = "" txt正解.Value = "" op1.Value = "" op2.Value = "" op3.Value = "" op4.Value = "" End Sub よろしければ、教えていただけないでしょうか?

  • エクセルのフォーム入力について

    初心者です。 フォームから自動でシート入力をしたいのですが、最下行の取得が出来ません。教えて下さい Private Sub CommandButton1_Click() '登録ボタンの動作 Dim myDCount As Long Worksheets("全体売上").Activate myDCount = Range("扱い月").Rows.Count myDCount = Range("扱い月").Cells(myDCount, 1).EntireRow.Insert 'データの最終行+1を取得 'データの入力(フォームからセルへ) With Worksheets("全体売上") .Cells(myDCount, 1).Value = TextBox1 .Cells(myDCount, 2).Value = TextBox2 .Cells(myDCount, 3).Value = TextBox3 .Cells(myDCount, 5).Value = TextBox4 .Cells(myDCount, 6).Value = TextBox5 .Cells(myDCount, 9).Value = TextBox6 .Cells(myDCount, 13).Value = TextBox9 .Cells(myDCount, 7).Value = TextBox10 .Cells(myDCount, 8).Value = TextBox11 .Cells(myDCount, 21).Value = TextBox12 End With Me.Hide End Sub

  • マクロのフォームから。。。

    マクロのフォームから。。。 マクロのフォームからシートの最終行に入力ができるようにしたいのです。 マクロは下記になります。今の状態ですと、新規入力ボタンを押してデータ登録ボタンを押すと、途中の行に登録がされてしまいます。 暫く考えていましたがどうしてもわからず、また初心者の為できればわかりやすく教えてもらえると幸いです。どうかよろしくお願い致します。 Private Sub CommandButton3_Click() 入力結果 = MsgBox("データを登録しますか", vbYesNo) If 入力結果 = 6 Then If ToggleButton1.Value = True Then 表示行 = Cells(2, 10).Value + 1 Else 表示行 = Cells(1, 10).Value End If If ToggleButton1.Value = True Then データクリア TextBox1.Value = Cells(表示行, 1).Value + 1 Else データ表示 End If 表示行 = Cells(1, 10).Value Cells(表示行, 1).Value = TextBox1.Value Cells(表示行, 2).Value = TextBox2.Value Cells(表示行, 5).Value = TextBox3.Value Cells(表示行, 6).Value = TextBox4.Value Cells(表示行, 7).Value = TextBox5.Value Cells(表示行, 4).Value = ComboBox1.Value If OptionButton1.Value = True Then Cells(表示行, 3).Value = "男" Else Cells(表示行, 3).Value = "女" End If データ表示 End If End Sub ※ 表の範囲:a1:g5(1行目はタイトル) j1:表示行 j2:最終行(counta)

  • エクセルのマクロを教えてください。

    マクロの初心者です。 特に変数が全く使えず、下記もどのように記載していいのかわからないため教えていただけないでしょうか。 ユーザーフォームのtextbox2に開始番号があります。 textbox3に本数があります。 sheet1のB12セルには開始番号が入ります。 開始番号から本数分+1したものを順番にセルに入っていくようにしたいです。 ただ、入れたいセルが横→左下(開始番号の列)→横→左下(開始番号の列)・・・としたいため、どのように書いていいのかわかりません。 地道に書くのであれば、下記のようになると思うのですが、変数を使って書く場合はどのようになるのか教えていただけないでしょうか。 Worksheets("Sheet1").Range("B12").Value = TextBox2.Value If TextBox3.Value = 2 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 ElseIf TextBox3.Value = 3 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 Worksheets("Sheet1").Range("B13").Value = TextBox2.Value * 1 + 2 ElseIf TextBox3.Value = 4 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 Worksheets("Sheet1").Range("B13").Value = TextBox2.Value * 1 + 2 Worksheets("Sheet1").Range("G13").Value = TextBox2.Value * 1 + 3 ElseIf TextBox3.Value = 5 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 Worksheets("Sheet1").Range("B13").Value = TextBox2.Value * 1 + 2 Worksheets("Sheet1").Range("G13").Value = TextBox2.Value * 1 + 3 Worksheets("Sheet1").Range("B14").Value = TextBox2.Value * 1 + 4 ・ ・ ・ End If

  • エクセルVBA 呼出し

    エクセルVBA 呼出し FormをひらいてTextBox31に数字(ID番号)が入り それをSheet”計”のF4に入れます! そのF4を他のブックの WSName = "DATA.xls"にて IDを検索して、名前や色々なものをSheet”計”に写します。 それを再度、FromのそれぞれのTextBoxに入れます。 しかし、SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 が上手くできません!!エラー表示などはないのですが… DATA.xlsにはID番号があるのですが、それを入力しても値が入りません どこの部分が間違っているのか? すいません、教えてください WSName = "DATA.xls"を呼出す記述は省略!! 'DATA.xlsとSheet1をセットする。 Set WS = Workbooks(WSName) Set SH1 = WS.Worksheets("Sheet1") 'ブックが存在していないのであればメッセージを出し処理を抜ける。 Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If flag = False For lng = 1 To lngYcnt_K '計のF4と同じ値を見つけてテキストボックスの値を入力。 If CStr(Worksheets("計").Range("F4").Value) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 With Worksheets("計") ’計のSheetの値を開いているFromのTextBox4に再度値を入れる TextBox4.Value = .Range("B2").Value '計のSheetからTextBox1の値の名前’ End With MsgBox " 記録を呼び戻しました" Else TextBox31.Value = "確認必要" End If

  • VBAでフォームからシートへ入力

    シートが「回答フォーム」と「用語」と言うのがあります。 (1)「回答フォーム」シートに"入力"ボンタをクリックすると「用語」のシートに入力される。 (2)回答フォーム」シートに"検索"ボンタをクリックすると「用語」のシートからフォームへ表示される。 用語のシートに項目は、A列から、ナンバー、検索、フリガナ、用途、用語、意味とあります。 TextBox1に用語、TextBox2に用途、TextBox3に意味 とあります。 (1)には Private Sub 入力_Click()   Sheets("用語").ActiveSheet・・・ここがエラーになります。 「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm1.TextBox1.Value Cells(行, 列 + 1) =UserForm1.TextBox2.Value   Cells(行, 列 + 2)=UerForm1.TextBox3.Value UserForm1.TextBox1.SetFocus Cells(行 + 1, 列).Select End Sub (2)には Private Sub CommandButton1_Click() Set sh1 = bk.Worksheets("回答フォーム") Set sh5 = bk.Worksheets("用語") cnt1 = 2 UserForm1.TextBox1.Value・・・・ここのVALUEがエラーになります。 「コンパイルエラー プロパティの使い方が不正です。」 ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],用語!C[-5],0)" n = ActiveCell.Value '用語 sh5.Cells(n, 2).Value = sh1.TextBox1.Value '意味 sh5.Cells(n, 3).Value = sh1.TextBox3.Value '用途 sh5.Cells(n, 4).Value = sh1.TextBox2.Value End Sub 申し訳ないですがよろしくお願い致します。

  • 条件判定について

    下記のようなコードを作成しましたが、チェックボックスがオンでもオフでもTextBox4.Valueの値が返ります。どこがいけないでしょうか。 Private Sub CommandButton2_Click() If CheckBox1.Visible = True Then Worksheets("sheet1").Range("a1") = TextBox4.Value Else Worksheets("sheet1").Range("a1") = TextBox3.Value End If End Sub

  • ワークシート名を変数に格納する方法

    VBA初心者です。ワークシートが5つあり各シートにデータを転記するマクロを作成したいのですがワークシート名を変数にしてループ処理することはできるのでしょうか? 下記はワークシート名"H"にだけ転記するマクロを作成してみましたがこの後がわからず悩んでいます。よろしくお願いします。 Dim データ行 As Integer Dim cnt As Integer Dim データ数 As Integer cnt = 4 データ行 = Cells(Rows.Count, 8).End(xlUp).Row For データ数 = 11 To データ行   If Worksheets("入力").Cells(データ数,1).Value= "2"Then Worksheets("H").Cells(cnt, 6).Value = Worksheets("入力").Cells(データ数, 8).Value Worksheets("H").Cells(cnt, 7).Value = Worksheets("入力").Cells(データ数, 9).Value Worksheets("H").Cells(cnt, 8).Value = Worksheets("入力").Cells(データ数, 27).Value Worksheets("H").Cells(cnt, 9).Value = Worksheets("入力").Cells(データ数, 19).Value Worksheets("H").Cells(cnt, 10).Value = Worksheets("入力").Cells(データ数, 20).Value Worksheets("H").Cells(cnt, 11).Value = Worksheets("入力").Cells(データ数, 21).Value Worksheets("H").Cells(cnt, 12).Value = Worksheets("入力").Cells(データ数, 10).Value Worksheets("H").Cells(cnt, 13).Value = Worksheets("入力").Cells(データ数, 11).Value Worksheets("H").Cells(cnt, 14).Value = Worksheets("入力").Cells(データ数, 22).Value Worksheets("H").Cells(cnt, 15).Value = Worksheets("入力").Cells(データ数, 23).Value cnt = cnt + 1 End If Next データ数

  • ユーザーフォームをWorksheet上で表示

    数日前、このカテゴリで相談した事の続きです。 以前の相談は、次の通りです。 http://okwave.jp/qa/q8892460.html この相談の中で出来たことは 1 ユーザーフォームを保存終了 2 Worksheet上にボタンを作成、そのボタンをクリックでユーザーフォームを表示 以上のことはできました。 作成したコードは次のとおりです。   '// Private Sub UserForm_Initialize() With Worksheets("Sheet1")  TextBox1 = .Cells(1, 1).Value  TextBox2 = .Cells(2, 1).Value TextBox3 = .Cells(3, 1).Value TextBox4 = .Cells(4, 1).Value TextBox5 = .Cells(5, 1).Value ).Value End With End Sub Private Sub UserForm_Terminate() With Worksheets("Sheet1")  .Cells(1, 1).Value = TextBox1  .Cells(2, 1).Value = TextBox2 .Cells(3, 1).Value = TextBox3 .Cells(4, 1).Value = TextBox4 .Cells(5, 1).Value = TextBox5 End With End Sub '// Private Sub cmdsyuuryo_Click() Unload Me End Sub Private Sub UserForm_Click() Myform.Show vbModeless End Sub そこで質問です。 現在Worksheet上にボタンを作成、クリックしてユーザーフォームを表示しているの を、WorksheetのセルA1(名前を記述してある)をクリックするだけでユーザーフォー ムを表示する方法はありませんか? ユーザーフォームの保存先は「Sheet1」のA1からA5までです。 できれば、この設定で具体的なコードの記述をお願いします。 Excel2013です。 よろしくお願いします。

  • エクセル マクロ 教えてください。

    sheet1に (a1=No. b1=月日 C1=項目 d1=収入 e1=支出 f1=摘要 G1=店名)項目を作りそれらをユーザーフォームを作り入力したいです。 この記述では上手く動けません。教えてください。 Private Sub CommandButton1_Click() Dim r As Long, 最終行 As Long, 項目行 As Long Dim re As String r = textboxs1.Value + 10 最終行 = Worksheets("入力").Range("B65536").End(xlUp).Row If r <= 最終行 Then re = MsgBox("訂正" & " " & "すでにデータが入力されています。" & Chr(13) & _ Chr(13) & "データを置き換えます。 本当に良いですか? ", _ Buttons:=vbYesNo + vbExclamation, Title:="注意!!") If re = vbYes Then With Worksheets("入力") .Cells(r, 2).Activate .Cells(r, 1).Value = TBox1.Value .Cells(r, 2).Value = TBox2.Value .Cells(r, 3).Value = ComboBox1.Value .Cells(r, 4).Value = TBox3.Value .Cells(r, 5).Value = TBox4.Value .Cells(r, 6).Value = TBox5.Value .Cells(r, 7).Value = ComboBox2.Value End With データクリア Exit Sub End If データクリア Exit Sub End If If r >= 最終行 + 1 Then r = 最終行 + 1 End If With Worksheets("入力") .Cells(r, 1).Value = TBox1.Value .Cells(r, 2).Value = TBox2.Value .Cells(r, 3).Value = ComboBox1.Value .Cells(r, 4).Value = TBox3.Value .Cells(r, 5).Value = TBox4.Value .Cells(r, 6).Value = TBox5.Value .Cells(r, 7).Value = CBomboox2.Value End With データクリア End Sub r = データNo + 10 With Worksheets("入力") .Activate .Cells(r, 2).Select TBox1.Value = .Cells(r, 1).Value TBox2.Value = .Cells(r, 2).Value ComboBox1.Value = .Cells(r, 3).Value TBox3.Value = Format(.Cells(r, 4).Value, "###,###") TBox4.Value = Format(.Cells(r, 5).Value, "###,###") TBox5.Value = .Cells(r, 6).Value ComboBox2.Value = .Cells(r, 7).Value End With Exit Sub End If If データNo > 最終行 - 10 Then データNo = 最終行 - 9 TBoxNo.Value = データNo データクリア End If End Sub

専門家に質問してみよう