[[20141117121140]] 『乱数で表示してからの操作』(やま) ページの最後に飛ぶ

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

 

『乱数で表示してからの操作』(やま)

A13 '=RANDBETWEEN(1,120) 回数

B7 '=I7=IF(A13="","",(VLOOKUP(A13,B51:D170,2))) 実

I7 '=IF(F24="","",IF(B7*I7=F24,"◎","?")) 法

L24 '=IF(A13="","",(VLOOKUP(A13,B51:D170,2))) 判定欄

F24 こたえの入力セル 積

 ディスプレイ画面に大きく「くく練習」の作成中です。現在のでは、答えを入力しても
 次の問題が表示されて、今の数式では、判定が狂います。L24に入れる「数式」をご教示
 ください。問題表示に乱数を使用しないで、120問題作成しておいて、「回数」に乱 
 数を考えました。

  

< 使用 Excel:Excel2003、使用 OS:WindowsXP >


 I7セルの数式が循環しませんか?	
 もう一度確認してください。
 「くく練習」なら81で足りるような気もしますが・・。
(ぽち) 2014/11/17(月) 12:45

 ◎ 記載ミスがありましたので、再度UPします。

A13 '=RANDBETWEEN(1,120) 回数

B7 =IF(A13="","",(VLOOKUP(A13,B51:D170,2))) 実

I7 =IF(A13="","",(VLOOKUP(A13,B51:D170,3))) 法

L24 '=IF(F24="","",IF(B7*I7=F24,"◎","?")) 判定欄

F24 こたえの入力セル 積

(やま) 2014/11/17(月) 12:51


 入力するたびに揮発性関数Randbetweenが動いてしまうので、
 マクロを使用することで制御しようと思います。
 A13の式及びL24の式は削除していただいて、B7及びI7の式のみ
 利用する形です。

 シートタブを右クリックし、「コードの表示」からVBEが起動します。
 下記のコードを丸ごと貼り付けて、「×」でVBEを閉じてください。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 24 And Target.Column = 6 Then
        Range("L24").Value = IIf(Range("B7").Value * Range("I7").Value = Range("F24").Value, "◎", "?")
        Randomize
        RndStr = Int(120 * Rnd + 1)
        Range("A13").Value = RndStr
        Range("F24").Select
    End If
 End Sub

(ぽち) 2014/11/17(月) 13:34


 (ぽち) 2014/11/17(月) 13:34 さん:

 ◎ 早々の、ご教示をありがとうございました。 「期待していた事」が、上手くできます。
 やはり、VBAの力が必要ですね! 少し、A13を「A=A+1」の記述とかしてみましたが、上手く出来ず、結局
 考えたのが、質問の方法でした。折角ですので、下記についても説明をお願いします。

 RndStr = Int(120 * Rnd + 1)    VBAの「乱数の関数」といいますか ここで +1 なんですね?
 Range("A13").Value = RndStr   RndStr  これは、何をさせているのでしょうか?  

 ◎ ゲーム感覚でタイム制限で挑戦させて、最後に「100ポイント」だったよ! 「ぐんまちゃん」とか
 ゆるキャラ名でも表示したらと考えております。Sheet1=タイトル表示。ここに「スタート」のマクロボタ
 ン。クリックでSheet2=問題の表示へすすむ。 2分後「Msgbox]で「やめ」の表示で、Shet3へ進みポイントな
 ど、ご褒美の表示をして、終了」のマクロボタンで、次の人と交替できるシステムに仕上げていきたい。
 また、悩んだら質問をさせていただくと思いますので、よろしくお願いします。

(やま) 2014/11/17(月) 14:33


 >RndStr = Int(120 * Rnd + 1)    VBAの「乱数の関数」といいますか ここで +1 なんですね?
 >Range("A13").Value = RndStr   RndStr  これは、何をさせているのでしょうか? 

 すみません。変数の宣言していませんでしたね。
 Dim RndStr As Long
 を1行目に入れておいてください。

 VBAにはRandbetweenがないので、その代わりとして「Int((最大値 - 最小値 +1 ) * Rnd + 最小値)」
 で計算させています。
 その結果をA13セルに記述するコードです。

(ぽち) 2014/11/17(月) 15:00


(ぽち) 2014/11/17(月) 15:00 さん:

 ◎ ありがとうございました。ところで、「◎」のカウントをして、その数を表示させたいのですが?

 ◎ もう一つは: タイムUPで終了して、次と交替をさせる為に、最後の「答えを」消しておこうとしたら
 答えのセル=F24:J39 の範囲を「結合して中央揃え」をしています。そこで、エラー表示されました。
 良い、方法がありますでしょうか?

 Sub 交替_Click()

Dim r As Variant

With Worksheets("かけ算")

Range("F24").ClearContents

 End With

End Sub

(やま) 2014/11/17(月) 15:39


 シートのモジュールに下記をコピペ。
 Public ResultCnt As Long
 Public QuestionCnt As Long
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim RndStr As Long
    Dim Result As String
    If Target.Row = 24 And Target.Column = 6 Then
        If Len(Target.Item(1).Value) Then
            Result = IIf(Range("B7").Value * Range("I7").Value = Range("F24").Value, "◎", "?")
            Range("L24") = Result
            QuestionCnt = QuestionCnt + 1
            If Result = "◎" Then ResultCnt = ResultCnt + 1
            Randomize
            RndStr = Int(120 * Rnd + 1)
            Range("A13").Value = RndStr
            Range("F24").Select
        End If
    End If
    If DateDiff("s", StartTime, Now()) > 120 Then
        StartTime = Now()
        Range("F24:J39").ClearContents
        MsgBox "やめ!" & vbCrLf & QuestionCnt & " 問中 " & ResultCnt & " 問せいかい!"
    End If
 End Sub

 標準モジュールに下記をコピペ。
 Public StartTime
 Sub TestStart()
    StartTime = Now
    Range("F24:J39").ClearContents
    ResultCnt = 0
    QuestionCnt = 0
    Range("F24").Select
 End Sub

 ワークシート上にボタンを配置し、TestStartを割り当てる。
 ボタン押下で開始。

 あまり時間がなくてきれいなコードでなくすみません。
 今から仕事のため、続きの質問等ありましたら明日になります。

(ぽち) 2014/11/17(月) 17:18


 質問答えてませんでしたね。
 結合セルのクリアは
 Range("F24:J39").ClearContents 
 とか
 Range("F24").MergeArea.ClearContents
 とします。
 Range("F24").Value = Null
 というのもいいかもです。
(ぽち) 2014/11/18(火) 08:41

(ぽち) 2014/11/18(火) 08:41 さん:

 ◎ 昨日から、丁寧にコード記述までしていただき感謝しております。また、今朝は、当方が質問の準備が
 できたのでと見たら、すでに「修正」指導まですみませんでした。 折角ですが、すでに「当方の流れ」を
 作成しておりました。それを、先に提示して、指導を仰ぐべきところを逆になりり申し訳ございません。

 ◎ 下記コードで、作動中ですが。 Sheet2(かけ算)の「答え」が削除できておりません。
 ◎ Sheet3(Sheet3)で、評価の表示になります。
 B11=B11:F17   ここに、「◎」の数を表示させたいのです。(ここに手入力で下記を確認した。)
 F20=F20:J27   ここは、上記ポイントに応じてVlookup で一覧表から「表示」しています。

 ◎ Sheet1(スタート) ここの「スタート」=マクロボタン クリックで、タイマー起動させて
 Sheet2(かけ算)の、答え入力セル=F24(F24:J39)を取得。 2分後MsgBox{やめ」出現し、「OK」クリックで
 Sheet3(Sheet3)のB11を取得すろ。 こんな「流れ」です。一応、操作できております。

 標準モジュールには 
Sub スタート_Click()					

 With ActiveSheet					
 Range("A1").Value = Now + TimeValue("00:02:00")					
 Application.OnTime Range("A1").Value, "計算やめ"					
 End With					
With Worksheets("かけ算").Select					
Range("F24").Activate					
End With					
End Sub					

Sub 計算やめ()

              MsgBox "計 算 や め"					
    With Worksheets("sheet3").Select					
    Range("B11").Activate					
  End With					
End Sub					

 Sub タイム解除()					
      Application.OnTime Range("B3").Value, "交代", , False					
End Sub					

 Sub 交代Click()					
With Worksheets("Sheet3").Select					
  Range("F24").MergeArea.ClearContents					
End With					
End Sub					

 Shet2(かけ算シート)には

 Private Sub Worksheet_Change(ByVal Target As Range)					
    If Target.Row = 24 And Target.Column = 6 Then					
Dim RndStr As Long					
        Range("L24").Value = IIf(Range("B7").Value * Range("I7").Value = Range("F24").Value, "◎", "?")					
        Randomize					
        RndStr = Int(120 * Rnd + 1)					
        Range("A13").Value = RndStr					
        Range("F24").Select					
    End If					
 End Sub					

(やま) 2014/11/18(火) 10:14


 おおよそわかりました。
 ボタンの配置の確認ですが、シート「かけ算」には「スタート」ボタンがあるのは
 分かりますが、「交代」ボタンも配置されているんですか?

 「◎」のカウントですが、Publicで変数宣言、結果が「◎」の場合はカウントを1増やす。
 「計算やめ」が実行されたとき、変数の値を表示させたらいいですよ。

 標準モジュールに
 Public ResultCnt As Long
 Sub スタート_Click()
    ResultCnt = 0
    With ActiveSheet
        Range("A1").Value = Now + TimeValue("00:02:00")
        Application.OnTime Range("A1").Value, "計算やめ"
    End With
    With Worksheets("かけ算").Select
        Range("F24").Activate
    End With
 End Sub

 Sub 計算やめ()
    MsgBox "計 算 や め"
    With Worksheets("Sheet3")
        .Select
        With .Range("B11")
            .Value = ResultCnt
            .Activate
        End With
    End With
    With Sheets("かけ算")
        .Range("A1") = ""
        .Range("F24").MergeArea.ClearContents
    End With
 End Sub

 Sub 交代Click()
    With Sheets("かけ算")
        .Range("A1") = ""
        .Range("F24").MergeArea.ClearContents
    End With
 End Sub

 「かけ算」のシートモジュールに
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim RndStr As Long
    Dim Result As String
    If Target.Row = 24 And Target.Column = 6 Then
        Result = IIf(Range("B7").Value * Range("I7").Value = Range("F24").Value, "◎", "?")
        Range("L24").Value = Result
        If Result = "◎" Then ResultCnt = ResultCnt + 1
       Randomize
        RndStr = Int(120 * Rnd + 1)
        Range("A13").Value = RndStr
        Range("F24").Select
    End If
 End Sub

 Sheet3に「交代」ボタンが配置されていて、「交代Click」が割り当てられているものとしています。
(ぽち) 2014/11/18(火) 11:20

> B11=B11:F17 ここに、「◎」の数を表示させたいのです。(ここに手入力で下記を確認した。)

B11に入るのは、数値? @という文字?
B11:F17とは、横5列縦7行ありますよね? 正解が増えていくと、どういう順で@をセットしたい?
1行または1列に並べるのが簡単で良いと思いますが、複数行複数列にするならば、Mod関数で座標を縦横に分ける必要があります。

とりあえず、似た方法ですが、@表示は無しにして整形した例。
(答え表示に使うから、@か?の表示は欲しいのだと思いますが…)

【標準モジュール】

 Public ipCount As Long

 Sub スタート_Click()
    With Sheet1
        ipCount = 0
        .Range("A1").Value = Now + TimeValue("00:02:00")
        Application.OnTime .Range("A1").Value, "計算やめ"
    End With

    Sheets("かけ算").Activate
    Range("F24:J39").ClearContents
    Range("F24").Activate
 End Sub

 Sub 計算やめ()
    MsgBox "計 算 や め。正解数は" & ipCount & "でした。", vbExclamation
    Sheet3.Range("B11").Value = ipCount
 End Sub

 Sub タイム解除()
    Application.OnTime Range("B3").Value, "交代", , False
 End Sub

 Sub 交代Click()
    Sheet3.Range("F24").ClearContents
 End Sub

【「かけ算」シートモジュール】

  Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$24" Then
        Range("L24").Value = IIf(Range("B7").Value * Range("I7").Value = Range("F24").Value, "◎", "?")
        If Range("L24").Value = "◎" Then
            ipCount = ipCount + 1
        End If
        Randomize
        Range("A13").Value = Int(120 * Rnd + 1)
        Range("F24").Select
    End If
 End Sub
(???) 2014/11/18(火) 11:26

 (???) 2014/11/18(火) 11:26 さん:

 ◎ 何度も恐縮ですが、よろしくお願いします。
 ◎ スタート(Sheet1)の「スタート」マクロボタンクリックで、かけ算(Sheet2)へ移動します。
 ◎ 今回のコードでは、「答え入力セル」が入力不可となりました。
 ◎ もう一つ、「かけ算シート」に記述コードで 「デバックしますか?」のエラー表示。
 Range("F24").Select

 ◎ 当方で、勝手に直した、「交代」ボタンクリックで、「スタート」Sheet1を表示にしました。
  Sub 交代Click()
    With Sheets("かけ算")
        .Range("A1") = ""
        .Range("F24").MergeArea.ClearContents
    End With

    With Sheets("スタート").Activate

 End With
 End Sub

 もう一息のとこらかとぞ存じます。

(やま) 2014/11/18(火) 12:09


おや、かけ算シートのモジュールなので、シート省略でいけると思ったのですが。

エラーになるのは、「交代」ボタンを押下した後ですかね?
交代Clickの最後で、Sheets("かけ算").Activate してみてはいかがでしょう?
(???) 2014/11/18(火) 12:35


あ、交代後は「かけ算」シートではなく、「スタート」シートかな?
それならば Sheets("スタート").Activate ですね。(With外す)

その後、「スタート」シート上の「開始」ボタン押下で、「かけ算」シートに移るはずですが…。
(???) 2014/11/18(火) 12:40


 「かけ算」のシートモジュールに
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim RndStr As Long
    Dim Result As String
    If Target.Row = 24 And Target.Column = 6 Then
        Result = IIf(Range("B7").Value * Range("I7").Value = Range("F24").Value, "◎", "?")
        Range("L24").Value = Result
        If Result = "◎" Then ResultCnt = ResultCnt + 1
       Randomize
        RndStr = Int(120 * Rnd + 1)
        If ActiveSheet.Name = "かけ算" Then
            Range("A13").Value = RndStr
            Range("F24").Select
        End If
    End If
 End Sub

 標準モジュールに
 Public ResultCnt As Long
 Sub スタート_Click()
    ResultCnt = 0
    With ActiveSheet
        Range("A1").Value = Now + TimeValue("00:02:00")
        Application.OnTime Range("A1").Value, "計算やめ"
    End With
    With Worksheets("かけ算").Select
        Range("F24").Activate
    End With
 End Sub

 Sub 計算やめ()
    MsgBox "計 算 や め"
    With Worksheets("Sheet3")
        .Select
        With .Range("B11")
            .Value = ResultCnt
            .Activate
        End With
    End With
    With Sheets("かけ算")
        .Range("A1") = ""
        .Range("F24").MergeArea.ClearContents
    End With
 End Sub

 Sub タイム解除()
      Application.OnTime Range("B3").Value, "交代", , False
 End Sub

 Sub 交代Click()
    Sheets("スタート").Range("A1") = ""
    Sheets("かけ算").Range("F24").MergeArea.ClearContents
    Sheets("スタート").Activate
 End Sub

 「タイム解除」プロシージャの使用と「交代」プロシージャの行方は・・?
(ぽち) 2014/11/18(火) 12:51

 (ぽち) 2014/11/18(火) 12:51さん:

 ◎ 自分でセットした「目覚まし時計」を止める所が狂っていますね。
 ご親切なアドバイスとコードまで書いていただき、ようやく出来ました。ありがとうございました。

 ◎ 下記のコードは?  Sub 計算やめ() の中の

  With Sheets("かけ算")

        .Range("A1") = ""
        .Range("F24").MergeArea.ClearContents

 ◎ A1=タイム取得表示 (フォント白色で見えなくしています。)

  何も無い 時は F24セルを削除 ? ここが 分かりません?

 ◎ 
(やま) 2014/11/18(火) 13:31

 「交代Click」プロシージャがあるのでこの部分いらないですね。

 Sub 計算やめ()
    MsgBox "計 算 や め"
    With Worksheets("Sheet3")
        .Select
        With .Range("B11")
            .Value = ResultCnt
            .Activate
        End With
    End With
 End Sub
(ぽち) 2014/11/18(火) 13:36

 (ぽち) 2014/11/18(火) 13:36 さん:

 ◎ 理解できました。 ありがとうございました。

(やま) 2014/11/18(火) 14:30


コメント返信:

[ 一覧(最新更新順) ]


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