[[20170817145342]] 『テキストボックスを使用した問題を作成』(ichi) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『テキストボックスを使用した問題を作成』(ichi)

◉テキストボックスを3つ・コマンドボタンを1つを配置した問題文を

   作成しています。
   しかし、目標とする動作ができず質問させていただきます。
◉3つのテキストボックスに答えを入力。コマンドボタンで採点。
   ●3つのテキストボックスに答えを文字で入力。
   ●コマンドボタンをクリックし、3つのテキストボックスに正しい答えが
      入力されている場合は「正解」と表示。
   ●1つでも間違った答えが入力された場合には「不正解」と表示。
※テキストボックスに入力される答えの順番は問わない。
例】正解が「りんご」「みかん」「ぶどう」の問題
      テキストボックスに「みかん」「ぶどう」「りんご」は正解
      テキストボックスに「みかん」「柿」「りんご」は不正解

よろしくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


テキストボックスやボタンは、ユーザーフォームに貼ったものでしょうか? それとも、シートに貼っているのでしょうか?
もしシートに貼っているなら、それは入力し辛いだけに思います。 シートならどこかのセルに入力させれば良いし、「データの入力規則」でコンボ選択式にした方が良いと思います。 いちいち手入力だと、「カキ」とか「かき」とか入力されると、文字列不一致で不正解ですか? 利用者全員、日本語変換に問題はないですか?

あと、ご説明では1問の例ですが、回答形式にするなら、1問しかない、なんて事はないですよね? 全体構成に関しての説明が欲しいのと、貴方が作ってうまくいかなかった、と言っているコードを見せてください。それを直すほうが、お互い無駄な時間を使わなくて済むと思います。
(???) 2017/08/17(木) 15:20


◉テキストボックスとボタンはユーザーフォーム上に貼っています。
◉問題は5問あり、すべて回答形式です。
◉1問ごとに採点ボタンを配置し、答えの正解・不正解を表示します。

If TextBox1.Value = (”みかん”)Or (”ぶどう”)Or(”りんご”) And TextBox2.Value = (”みかん”)Or (”ぶどう”)Or(”りんご”) And _

   TextBox2.Value = (”みかん”)Or (”ぶどう”)Or(”りんご”) Then
           MsgBox (”正解”) 
Else
          MsgBox (”不正解”) 
End If

よろしくお願いします。
(ichi) 2017/08/18(金) 00:20


 kaitouTb = Array("みかん", "ぶどう", "りんご")

 If IsError(Application.Match(TextBox1.Value, kaitouTb, 0)) Then
   ans = ans & 0
 Else
   ans = ans & 1
 End If
 If IsError(Application.Match(TextBox2.Value, kaitouTb, 0)) Then
   ans = ans & 0
 Else
   ans = ans & 1
 End If
 If IsError(Application.Match(TextBox3.Value, kaitouTb, 0)) Then
   ans = ans & 0
 Else
   ans = ans & 1
 End If
 If ans = 111 Then
   MsgBox "正解"
 Else
   MsgBox "不正解"
 End If
(BJ) 2017/08/18(金) 01:40

 BJさんのは、みかんみかんみかん でも正解になるかんじですか?
           (↑懐かしい曲名みたい)
 質問者さんが想定してない回答かも知れませんが、考慮の余地ありかなーと
(稲葉) 2017/08/18(金) 06:38

 ちょっと時間取れたので・・・
 ???さん指摘の、
 >いちいち手入力だと、「カキ」とか「かき」とか入力されると、文字列不一致で不正解ですか? 利用者全員、日本語変換に問題はないですか? 
 について、回答無いので完全一致に限定です。
 e-ラーニング的なものを想定されているのかなと想像。

    Option Explicit
    Private TBs(2) As MSForms.TextBox '0〜2
    Private Sub UserForm_Initialize()
        Set TBs(0) = TextBox1
        Set TBs(1) = TextBox2
        Set TBs(2) = TextBox3
    End Sub
    Private Sub CommandButton1_Click()
        Dim Answer As Collection
        Set Answer = New Collection
        With Answer
            .Add True, "りんご"
            .Add True, "みかん"
            .Add True, "ばなな"
        End With

        Dim TBv As Variant
        Dim ErrNum As Long
        Dim Result As Boolean
        For Each TBv In TBs
            ErrNum = 0
            Result = False
            On Error Resume Next
                Result = Answer.Item(TBv.Value)
                ErrNum = Err.Number
            On Error GoTo 0
            If ErrNum > 0 Then
                Result = False
                Exit For
            Else
                Answer.Remove (TBv.Value)
            End If
        Next TBv
        MsgBox IIf(Result, "正解", "不正解")
        'Unload Me
    End Sub
(稲葉) 2017/08/18(金) 08:34

なるほど、答えは一字一句違えてはいけないけれど、答えの順番は違っていても構わない、というところが問題だったのですね。
だったら、3つの文字列をソートしてから、正解と比較してはどうでしょうか。 これなら、「りんご」「りんご」「りんご」を不正解にできますよ。
(複数問あるなら、答えの文字列を配列定義しておけば良いでしょう)

 Private Sub CommandButton1_Click()
    With CreateObject("System.Collections.ArrayList")
        .Add TextBox1.Text
        .Add TextBox2.Text
        .Add TextBox3.Text
        .Sort
        If Join(.toarray, "|") = "ぶどう|みかん|りんご" Then
            MsgBox "正解"
        Else
            MsgBox "不正解"
        End If
    End With
 End Sub
(???) 2017/08/18(金) 09:20

ご指導ありがとうございます。
(???)さんのコードを実行すると「不正解」のメッセージが表示されます。
アドバイスをよろしくお願いします。
(ichi) 2017/08/18(金) 11:40

利用者も、同じように、どこが間違っているのか判らなくて、困ると思いますよ。 完全一致でなければ全て×なんて、鬼畜過ぎます。

入力した回答をソートしているのだから、比較する正解もソートしていないといけませんが、"ぶどう|みかん|りんご" ではない文字列に変えたのではないですか? 正解も、あいうえお順に変えてみてください。
(???) 2017/08/18(金) 11:51


ありがとうございました。目標とする動作ができました。
(ichi) 2017/08/18(金) 21:17

 既に解決済みですが、初等的方法も上げておきましょう。

 Private Sub CommandButton1_Click()
     If check2 Then
         MsgBox "正解"
     Else
         MsgBox "不正解"
     End If
 End Sub

 Function check2() As Boolean
     Dim answers As Variant
     Dim 正解    As Variant
     Dim c       As Variant  ' correct answer

     正解 = Array("みかん", "ぶどう", "りんご")
     answers = Array(Trim(TextBox1.Value), Trim(TextBox2.Value), Trim(TextBox3.Value))

     '判定
     check2 = True
     For Each c In 正解
         check2 = check2 And Not IsError(Application.Match(c, answers, 0))
     Next
 End Function

 なお書き:
 (1) 
 If TextBox1.Value = (”みかん”)Or (”ぶどう”)Or(”りんご”) といった書き方は文法として不可。
 TextBox1.Value = "みかん" Or TextBox1.Value = "ぶどう"  Or ・・(略)・・
 と書く必要があります。基本的な文法事項ですので、よく理解してください。

 (2)
 他所の掲示板に second opinion ですか?

https://teratail.com/questions/88766

 なぜ他所に聞かないといけなかったのでしょうか。
 どんなデータを入れたか示せば、こちらで十分に間に合ったはず。

 (3)
[[20170815203800]] 『チェックボックスを使用した問題を作成』
 と同じ質問者さんでしょ? 
 タイトルのつけかたや、使用OS,Excelバージョンからしても、
 同じ課題を解く別人とは思えない。(*)
 放置はよくないと思いますよ。

 (*)管理者さんは発言者のIPアドレスがわかります。

(γ) 2017/08/19(土) 00:23


teratailの議論を読み違えていたので修正しました。
コード内容を理解されていないようで悲惨なことになっていますね。
Join(.toarray, "|")と比較すべきものは、
正解文字列をソートして|で連結したものにしないといけない。
 
(γ) 2017/08/19(土) 04:37

 未使用の変数があったので削除しました。

 本題に戻ると、
 3つの回答のどこがまちがっていたかをユーザーに示す必要はないのですかね。
 不正解と判定されたときに、併せて正解はこれこれとすれば良いのかも知れないが。

 まあ、これが学校から出された課題だとすれば、
 そこまで踏み込む必要もないのかもしれないが、
 本当にクイズを設計しているなら必要になるかもしれません。

 以下余談です。

 ついでに、他の掲示板の話で恐縮です。

 >[tukuroku]からのコードと同じコードを入力しているのですが・・・。
 それをそのまま使うのは、どうかしていませんか?
 それはソート結果を確認するためのコードです。
 テキストボックスの値すら使っていません。
 どんな値をテキストに入れても正解となるのは当然です。
 他人から提示されたコードは、自分で意味を考えないと。

 >変更する部分は、
 >If Join(.toarray, "|") = "ぶどう|みかん|リンゴ" Then
 >の部分だけで良いはずですが、それ以外も変更しましたか?
 と指摘もされているのに、脇目もふらず一直線ですな。

 コードに慣れていないといえばそれまでですし、
 他人のコードをよく理解せずに使うと、こうなりがちなのですが、
 ちょっと極端な気がします。
 自分の頭で前に進める必要があると思います。

 ところで、ArrayListもありふれたものではないので、
 ホントに理解されているのかちょっと疑問ですね。
 ヘルプだって見たこと無いでしょう。
 慣れた道具でなんとかしようとしたほうが良いかも知れないですな。

(γ) 2017/08/19(土) 12:43


teratailの書き込みを見て、ちょっとカチンと来ました。

私が書いたコードの変数名を変えて、あたかも自分で考えたコードであるかのように改変し、質問してますね。これ、違法行為ですよ? ArrayListのオブジェクトを使えるくらいのレベルでこんな簡単な事を質問するはずは無いし、恩を仇で返す、最低な行為です。 しかも、こっちで回答ついて解決しているのに、teratail閉じてないし…。 失礼にも程があります。
(???) 2017/08/21(月) 09:38


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.