プロが教えるわが家の防犯対策術!

学校の課題でVBAのプログラミングが出たのですが、うまくできなくて困っています。 複数分岐で質問に答えていくとクラスメイトが当たる、簡易的なアキネーターのようなものを作りたいのですが、どのようにプログラミングすればよいのでしょうか…
自分なりにifやelse if、vbyesnoなど使ってやってみたのですがうまく動きません…
プログラムのだいたいの文面を教えていただけないでしょうか、初歩的な質問申し訳ないです。

質問者からの補足コメント

  • アプリというのは、今回で言うとエクセルでのプログラミングなのですがエクセルのことですかね??

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/02/12 21:17
  • 抽象的な説明で申し訳ありません!
    具体的に言うと、「その人は運動部ですか?」のような質問にはいいいえで答え、「はい」ならば次の質問A、「いいえ」ならば次の質問B…といったように分岐していく構造を作りたいです。
    その中でクラスメイトの特徴が絞られていって、最終的にこの人だ!とわかるものになります。
    説明不足でしたら言ってください、申し訳ないです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/02/12 22:14
  • 問題数はだいたい20個ほどになります。
    質問がAになった場合Bはでてきません。
    クラスメイトの特徴別に質問を用意しているので、分岐していくと1人に絞り込めるような質問にはなっています。なので、最終的に絞り込めたらメッセージボックスで〇〇さんですね?と表示するところまでプログラムしておきたいです。PCに判断を任せるのではなく、質問のはいいいえに対応して表示する名前を決めておくという感じです。
    ですので途中で特徴を絞り終えて、〇〇さんですね?にたどり着くところもあります。分岐の途中で「はい」なら次の質問に進み、「いいえ」なら絞り終えてプログラム終了になるようなところがいくつかできます。すべてのクラスメイトが同じ質問数にはなりません。
    言葉足らずなところがあれば言ってください!

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/02/12 22:45

A 回答 (6件)

学校の課題ということなので、何か学習の目的があるんだろうと思うのですが、それは無視して良いですか?また、Excelが前提で良いんですよね?


それで問題なければ・・・、

添付画像のようなシートを作成して、次の動作をVBAで行ってみてはいかがでしょうか?

B1セルの内容で質問を表示し、回答でフィルタをかける。
次にC1セルの内容で質問を・・・を繰り返して、最終的に1行に絞る。
フィルタを掛けていくと質問によっては回答が「はい」または「いいえ」のみになるものが出てくるので、その質問はスキップして次の質問に進む。
「VBAプログラミング」の回答画像6
    • good
    • 0

こんばんは



単純な、Yes、Noの2分岐でよいのなら、2の倍数で設問の数が増えていくので、設問を並べておいて、選択してゆくようなループにしておけば良いのではないでしょうか?
回答をどうやって算出するおつもりなのか不明ですけれど、同様に1対1で回答を作成しておいてもよいかも。
あるいは、要素が1、2、4・・と増加するような2次元配列で設問を作成しておく方がわかりやすいかも知れませんね。


以下に、前者の考え方での、ごく簡単な一例をご参考までに。
(とりあえず、質問は4回までにしてあります)

Sub Sample()
Dim Questions, AnsWord, Answers(1 To 4)
Dim cnt, QNo, Ans, Q

AnsWord = Array(" Yes", " No")
Questions = Array( _
"first", "Yes", "No", _
"Yes-Yes", "Yes-No", "No-Yes", "No-No", _
"Yes-Yes-Yes", "Yes-Yes-No", "Yes-No-Yes", "Yes-No-No", _
"No-Yes-Yes", "No-Yes-No", "No-No-Yes", "No-No-No")


QNo = 0
For cnt = 1 To 4
 Q = "Q." & cnt & vbLf & Questions(QNo) & " Question"
 Ans = MsgBox(Q, vbYesNo)
 If Ans = vbYes Then Ans = 1 Else Ans = 2
 QNo = 2 * QNo + Ans
 Answers(cnt) = "Q." & cnt & AnsWord(Ans - 1)
Next cnt

MsgBox "All Answers are" & vbLf & Join(Answers, vbLf)

End Sub

※ 設問や回答のデータは別ファイルなどにしておく方が、わかりやすいかも知れませんね。
※ 全てが2分岐ではなく、共通の設問がいくつかあってから分岐するようなパターンもありそうに思いますけれど・・・
    • good
    • 0

問題を出す順番などは、既に決まっているのでしょうか?


決まっていれば、それをプログラムにするかたちになると思うのですが、
そのイメージが私にはイマイチ掴めないですね。

例えばですが、
最初の質問A 答えがYesなら変数に1、Noなら変数に2を入れる。
変数が1なら質問Bへ
変数が2なら質問Cへ

2番目の質問 答えがYesなら変数×10+1、Noなら変数×10+2を入れる
変数が11なら、質問〇へ 変数を10倍して、+1又は+2をする。
変数が12なら、質問〇へ
変数が21なら、質問〇へ
変数が22なら、質問〇へ

問題数の桁数の数字 10問なら、1111111111~2222222222と、
1と2の組み合わせとか


Do
質問 
Select Case 変数
Case 1
 ’質問B
Case 2
 ’質問C
Case 11
 ’
Case 12
Case 21
Case 22
Case 111
Case 112
Case 121
Case 122
・・・・
End Select
変数=変数*10+回答(+1 又は +2)
Loop
    • good
    • 0

No.2の者です。



2択の問題というのは分かりました。
質問は、どれ位の問題数を用意されるのでしょうか?
ある質問をして、次の質問がAになった場合、質問Bは出てこないという事に
なるのでしょうか? それとも、どこかで出て来る?
クラスメイトの人物を特定するのは、PC? それとも、その場にいる人?
問題だけを出す感じ?なのでしょうか? それとも、回答していく内に
絞り込みをしていって、特定の人物をPCで答えを出す?
この回答への補足あり
    • good
    • 0

こんばんは。



ExcelのVBAとの事ですが、やりたい事をもっと具体的に記載されると、
回答が付くかと思います。

アキネーターというものが、どの様なものか分からないので、アドバイスも
できないですが、質問に答えるのが、選択式になるのでしょうか?
この回答への補足あり
    • good
    • 0

何のアプリかも分からないんでしょうか?

この回答への補足あり
    • good
    • 0

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