アプリ版:「スタンプのみでお礼する」機能のリリースについて

最近エクセルVBAを勉強し始めた初心者です。

エクセル上でコマンドボタンを押すとF12~H12にそれぞれ0~9の数字を一定時間回転させF12、H12、G12の順(左、右、真ん中の順)に時間差で0~9の乱数を発生させ表示させるには(パチンコのリーチみたいな感じ?)どのようなプログラムを組めばよろしいでしょうか?

数字を回転させ乱数を表示させるプログラムは
For = i = 0 To 100
 Range("●●").Value = Int(Rnd * 10)
Next i
です。

よろしくお願いします。

A 回答 (4件)

また授業ですか?


1日をまた無駄に過ごしたの?
http://okwave.jp/qa5388388.html
前回の回答は理解できなかったようで残念です
前回より簡単な気がします

'サンプル
Sub test()
Dim rng As Range
Dim i As Integer
Dim flg As Integer
'一定時間、数字を回転させる
For i = 1 To 10000
For Each rng In Range("f12:h12")
flg = 0
If rng.Column = 6 And i > 3000 Then flg = 1
If rng.Column = 8 And i > 6000 Then flg = 1
If flg = 0 Then rng.Value = Int(Rnd * 10)
Next rng
Next i
End Sub

人に聞いたら身になりませんよ~

この回答への補足

物はついでに教えて欲しいのですがF12とH12には必ず同じ数字(5,●,5)、(7,●,7)を出現させるにはどうすればよろしいのでしょうか?

補足日時:2009/11/11 01:01
    • good
    • 0
この回答へのお礼

いつもお世話になっております。今回もわかりやすいプログラムありがとうございます。回答を見てああ、そういう視点で組むのかと勉強させられる日々でございます。

お礼日時:2009/11/11 00:57

>物はついでに教えて欲しいのですが・・・


ついでなので、#2の回答に追加のみ

'サンプル
Sub test()
Dim rng As Range
Dim i As Integer
Dim flg As Integer
'一定時間、数字を回転させる
For i = 1 To 10000
For Each rng In Range("f12:h12")
flg = 0
If rng.Column = 6 And i > 3000 Then flg = 1
If rng.Column = 8 And i > 6000 Then flg = 1
If rng.Column = 6 And i = 3001 Then rng.Value = IIf(rng.Value > 4, 7, 5)
If rng.Column = 8 And i = 6001 Then rng.Value = Cells(12, 6).Value
If flg = 0 Then rng.Value = Int(Rnd * 10)
Next rng
Next i
End Sub
    • good
    • 0
この回答へのお礼

有難うございます、助かります。

お礼日時:2009/11/12 01:05

最近RaiseEventを覚えたので、試みに作ってみました。

それらしい動きをすると思います。当方XL2000ですので、他のバージョンで動かなかったらご容赦下さい。PCの仕様によらず速度が一定(たぶん)で、CPUを100%占有しないところがメリットですかね。(2~4%位でした)
☆シートモジュール
シートにコマンドボタン(コントロール)を一個おきます。
Private WithEvents myTimer As myTimerClass

Private Sub CommandButton1_Click()
Randomize (Now)
Set myTimer = New myTimerClass
myTimer.TimerTask (10)
DoEvents
End Sub

Private Sub myTimer_UpdateTime1(ByVal counter As Long)
If counter > 600 Then
Range("A1").Value = Int(Rnd * 10)
End If
End Sub

Private Sub myTimer_UpdateTime2(ByVal counter As Long)
If counter > 300 Then
Range("B1").Value = Int(Rnd * 10)
End If
End Sub

Private Sub myTimer_UpdateTime3(ByVal counter As Long)
If counter > 0 Then
Range("C1").Value = Int(Rnd * 10)
End If
End Sub
☆クラスモジュール myTimerClass
Public Event UpdateTime1(ByVal counter As Long)
Public Event UpdateTime2(ByVal counter As Long)
Public Event UpdateTime3(ByVal counter As Long)

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private myCounter As Long

Public Sub TimerTask(ByVal Duration As Long)
Sleep Duration
Select Case (myCounter Mod 3)
Case 0
RaiseEvent UpdateTime1(myCounter)
Case 1
RaiseEvent UpdateTime2(myCounter)
Case 2
RaiseEvent UpdateTime3(myCounter)
End Select
myCounter = myCounter - 1
Loop
End Sub

Private Sub Class_Initialize()
myCounter = 1000
End Sub
    • good
    • 0
この回答へのお礼

回答有難うございます。
難しすぎてよくわかりませんでした。ごめんなさい。
なぜコンパイルエラーがでるのかもわかりませんでした。

お礼日時:2009/11/11 01:20

エクセル(表計算ソフト)は、仕事の数字(金額、個数、人数など)を扱うのに適したものと思います。

ゲームや遊興のソフト作成に使うためには、適したもの(メソッドなど)が少なく、却って普通のエクセルVBAの本に解説されている課題より、難しいと思います。時間(差)の問題なども難しい。下手にやると、一瞬に終わって何がなんだか判らなくなったりする。
上記のエクセルVBAの普通の解説書にあるエクセルVBAを少し判って、多分エクセルVBAを捨ててから、他のもの(VBなど)でやることになるでしょう。ゲーム的なものは特有の技術(サブプログラムの集積)が要ると思います。
>エクセルVBAを勉強し始めた初心者です。がやるべき課題ではないと思う。
両者で進むべき方向が違う。
それにこの課題は丸投げです。回答者にたよらっず、自分で必要なコード群を1つづ勉強してください。
    • good
    • 0

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