dポイントプレゼントキャンペーン実施中!

●質問の主旨

INT関数及びRND関数を使い、「0から9」までの
数値をランダムに発生させるのではなく、「1から9」
までの数値をランダムに発生させるには、下記のコードを
どのように書き換えれば良いでしょうか?

●質問の補足

下記コード及び画像のように九九の計算問題を
作成したいと思っています。今のコードでは
「0から9」までの数値が発生するのは、分かっていたので
If ThenステートメントやSelect Caseステートメントを
使って、0の数値が発生するときは「1」とみなすというような
記述もしてみましたが、上手くいきませんでした。

ご存知のかたよろしくお願いします。
なお使用機種はWindowsVista、Excel2007を使用しています。
私はVBAをはじめて3カ月程度です。

●コード

Option Explicit

Const ORG_RW As Integer = 4 '問題の開始行
Const DST_RW As Integer = 8 '問題の終了行
Const NUM1_CLM As Integer = 1 '問題の数値1の列
Const NUM2_CLM As Integer = 3 '問題の数値2の列
Const ANSW_CLM As Integer = 5 '問題の解答の列

Private Sub CommandButton1_Click() 'Checkボタン

Dim i As Integer 'カウンタ変数

For i = ORG_RW To DST_RW'問題の開始行から問題の終了行まで

If Cells(i, NUM1_CLM).Value * Cells(i, NUM2_CLM).Value = Cells(i, ANSW_CLM).Value Then

Cells(i, ANSW_CLM).Font.Color = vbBlue '問題が正解のときは文字が青色

Else

Cells(i, ANSW_CLM).Font.Color = vbRed '問題が正解のときは文字が赤色

End If

Next i


End Sub


Private Sub CommandButton2_Click() 'Resetボタン

Dim i As Integer 'カウンタ変数

For i = ORG_RW To DST_RW Cells(i, ANSW_CLM).ClearContents '解答が消去される
Cells(i, ANSW_CLM).Font.Color = vbBlack '解答が消去されたときは文字が黒色

' 解答が消去されたときは0~9までのランダムな数値が発生
    Cells(i, NUM1_CLM).Value = Int(Rnd * 10)

'解答が消去されたときは0~9までのランダムな数値が発生
Cells(i, NUM2_CLM).Value = Int(Rnd * 10)

Next i

End Sub

「1から9までの数値をランダムに発生させた」の質問画像

A 回答 (3件)

AからBまでの整数の場合は下記の通りです。




Int((B-A+1)*Rnd+A)

1から9までなら

Int(9 * Rnd + 1)
    • good
    • 1
この回答へのお礼

o_chi_chi様

ご回答ありがとうございます。

ご回答の通り「Int(Rnd * 10)」の部分を
「Int(9 * Rnd + 1)」の記述に変えたら
0は発生せず、「九九」の計算ドリルに
なりました。

お礼日時:2011/08/11 12:52

標題とか質問文の速いうちにワークシート関数の質問かVBAの質問か明記すべきです。


ワークシート関数デモできると思うがVBAの問題にしているのだね。
ーー
関数の本には、乱数を発生させる領域を指定したいときは
RAND()x(上限ー下限)+下限という解説が有る。
しかし乱数は同じ値が出てくることを排除するものでない。1桁で10個の数字でも同じ数字が出てくるだろう。
だから2桁も数字でも発生させて、それを並べ替えし行番号でもとるのはどうだろう。
Sub test01()
For i = 1 To 9
Cells(i, "G") = i  '行番号的数字
Cells(i, "H") = Int(100 * Rnd()) '2桁乱数
Next i
'---H列で並べ替え マクロの記録などから
Range("G1:H9").Sort Key1:=Range("H1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
'---B2からB11にG列の数字を取って1桁数をセット
For i = 2 To 11
Cells(i, "B") = Cells(i - 1, "G")
Next i
End Sub
ーーーー
上記は被乗数で、乗数に付いても同じ(略)。
正解かどうかの判定は別問題という事で略。
    • good
    • 0
この回答へのお礼

imogasi様

ご回答ありがとうございます。

>標題とか質問文の速いうちにワークシート関数の質問かVBAの質問か明記すべきです。

おっしゃるとおりですね。
関数については標題か質問文の冒頭でワークシート関数が
VBA関数であるか、明記するようにします。

また記述してくださったコードにつきましては
後の参考とさせていただきます。

お礼日時:2011/08/11 13:00

以下の関数があります。

使い方はhelpで見てください。

RAND
RANDBETWEEN

セルに以下を貼り付けします。
=INT(9 * RAND() + 1)
乱数は初期値が決まってしまいますので、年月日や時間の値を組み合わせて初期化する工夫をします。

私がよくやる方法は
10をパイ(3.141592654)で割って1から10までの乱数ができますよね。
10/3.141592654=3.183098862
1の位の数字の3を取って10倍してから10から割ります。
10/((3.183098862-int(3.183098862))*10)
これを繰り返します。
初期値の修正は上記の方法で1から10までの値を作りました。
    • good
    • 0
この回答へのお礼

LHS07様

ご回答ありがとうございます。
最初にワークシート関数ではなく、
VBA関数の質問であることを
書いておけばよかったです。誠に恐縮です。

しかし本件質問について、INT関数とRAND関数の
使い方に関してはワークシートでも同じであることが
分かりました。

初期化する工夫については後の参考とさせていただきます。

お礼日時:2011/08/11 12:57

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


このQ&Aを見た人がよく見るQ&A