[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『乱数で表示してからの操作』(やま)
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
◎ ありがとうございました。ところで、「◎」のカウントをして、その数を表示させたいのですが?
◎ もう一つは: タイム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
◎ 昨日から、丁寧にコード記述までしていただき感謝しております。また、今朝は、当方が質問の準備が できたのでと見たら、すでに「修正」指導まですみませんでした。 折角ですが、すでに「当方の流れ」を 作成しておりました。それを、先に提示して、指導を仰ぐべきところを逆になりり申し訳ございません。
◎ 下記コードで、作動中ですが。 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とは、横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
その後、「スタート」シート上の「開始」ボタン押下で、「かけ算」シートに移るはずですが…。
(???) 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.