Excel VBA 質問スレッド No.29 (解決済)

ランダム表示 くじけそうです。

投稿者 : vba初心者     投稿日時 : 2017/05/09(Tue) 15:46:18     OS : Windows 7     EXCEL : Excel 2013
初投稿です。
エクセルシートの「A1」から「E1」まで「赤」「青」「黄」「緑」「白」と入力されています。
「G1」に「0.5」・「H1」に「3」と入力されています。
「A3」にランダムで「A1」から「E1」の文字を「G1」の表示時間で「H1」回数連続で表示させたいのですがコードが解りません。
連続でなく1回ランダム表示はできました。
何か良い方法は有るのでしょうか? 表示の重複は問題ありません。
宜しくお願いします。

[返信 1] Re : ランダム表示 くじけそうです。
投稿者 : 管理人     投稿日時 : 2017/05/09(Tue) 23:06:37
表示時間の計測はおおざっぱですが、こんな感じでどうですか?

Sub sample170509()

Dim intervalSec As Single
Dim dispCnt As Integer

' 表示間隔秒数
intervalSec = Range("G1").Value

' 表示回数
dispCnt = Range("H1").Value

' 乱数ジェネレータの初期化
Randomize

Dim ts As Single
Dim cnt As Integer
Dim col As Integer

Do Until cnt >= dispCnt

If (Timer - ts) >= intervalSec Then

ts = Timer

' 1~5までの乱数を発生
col = Int(5 * Rnd + 1)

' 値表示
Range("A3").Value = Cells(1, col).Value

cnt = cnt + 1

End If

Loop

MsgBox "ランダム表示終了", vbInformation

End Sub

[返信 2] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/10(Wed) 10:58:11
管理人さん
ご回答有難う御座います。

すみません。最初に伝えておくべきでしたが、今回の投稿は他の掲示板により解決済みとさせて頂いているものです。そちらの方で「マルチポスト」に関してご指摘を頂きました。一応ご理解とお許しは頂き、質問も最後まで締めさせて頂きました。しかし解決済みとはいえ、こちらの掲示板のルールを確認しないまま投稿してしまいこれも「マルチポスト」に該当するのではと思い怖くなり確認しようと思いました。

私はまだVBA及びマクロに関しては2週間位(実働20時間位)の初心者です。今回の投稿の発端は、エクセル関数は多少使っていたので「エクセル関数でちょっと複雑にすれば出来るかな!」程度の考えからはじまりました。しかし思ったよりも複雑でVBA・マクロでの製作に流れて行きました。ご教授頂いた方々には本当に親身に返信を頂いたのですが、内容は何も解らず動作の確認をするだけで精一杯でした。ただ、VBAを体感して使えるようになりたいと真剣に考える様になりました。
しかしVBAは何も解らなかった為丸投げ状態で完成し、説明不足からの勘違いや、ちょっとした構想変更の対応も何一つ出来ません。そこで、今回の経験を無駄にしない為に少しづつ理解して作り直していきたいと考えました。
今回はまだ私の構想の初歩段階の質疑ですが、私にとって理解するのに能力オーバー状態です。理解する時間を頂き、少しずつ完成に漕ぎ着けたいのですが、その様な事はご迷惑では無いでしょうか?また「マルチポスト」的な行動もご迷惑では無いでしょうか?

大変失礼な事とは思いますが宜しくお願いします。

[返信 3] Re : ランダム表示 くじけそうです。
投稿者 : 管理人     投稿日時 : 2017/05/10(Wed) 23:25:30
当掲示板においては、マルチポストに関して特に禁止などのルールは設けていません。
VBAに関する質問で、既出の内容でなければ何回質問していただいてもOKです。

[返信 4] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/11(Thu) 23:41:52
管理人さん
ご返信有難う御座います。

有難う御座います。 とてもくだらない質問をしてしまうと思いますが、宜しくお願いします。

教えて頂いたプログラムは希望道理に表示されました。
只今 Do Until ~ Loop で足止めです。

If (Timer - ts) >= intervalSec Then
ts = Timer

の Timer の意味の違いが理解できません。
経過時間を計算していると思うのですが、ts = Timer が ts に Timer を代入だとすると
Timer - ts は Timer-Timer で、結果 0 に・・・・・・違いますよね?
ここの理解に時間が掛かりそうです。もう少し勉強して次の段階に進みたいと思います。

宜しくお願いします。

[返信 5] Re : ランダム表示 くじけそうです。
投稿者 : 管理人     投稿日時 : 2017/05/12(Fri) 23:32:59
Timer関数はその日の経過秒数を単精度型(Single)で返す関数です。
ts = Timerはおっしゃるとおり代入です。

If (Timer - ts) >= intervalSec Then

2回目のループのこの行ではtimerは、
ループ内の処理にかかるほんのわずか時間すすんでいますので、
(Timer - ts)はゼロにはなりません。

そして、何回かループがまわるうちにいつか表示間隔時間を超えますので、
そのときにランダム表示処理を行うようになっています。

[返信 6] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/13(Sat) 15:49:11
管理人さん
ご返信有難う御座います。

とても低レベルな質問で申し訳有りません。

If (Timer - ts) >= intervalSec Then

の (Timer - ts) の考えは

(現在の経過時間 - 代入した時の経過時間)

と解釈しました。 よろしいでしょうか?

また、どうしても表記の仕方に不慣れな為、ご教授頂いたプログラムを少し変えさせて頂きました。何かプログラム上でのルールがあるのかもしれませんが、慣れるまでこの様な表記でも支障はないでしょうか?

Sub sample170509()

Dim 表示時間 As Single
Dim 表示回数 As Integer

' 表示時間
表示時間 = Range("G1").Value

' 表示回数
表示回数 = Range("H1").Value

' 乱数ジェネレータの初期化
Randomize

Dim Timer代入時間 As Single
Dim 表示カウント数 As Integer
Dim セル列 As Integer

Do Until 表示カウント数 >= 表示回数

If (Timer - Timer代入時間) >= 表示時間 Then

Timer代入時間 = Timer

' 1~5までの乱数を発生
セル列 = Int(5 * Rnd + 1)

' 値表示
Range("A3").Value = Cells(1, セル列).Value

表示カウント数 = 表示カウント数 + 1

End If

Loop

MsgBox "ランダム表示終了", vbInformation

End Sub


intervalSec や ts が何の意味か、また、関数なのかまだ整理がつきません。いかがでしょうか?
見づらくなっているのは承知しています。
ご指導宜しくお願いします。

[返信 7] Re : ランダム表示 くじけそうです。
投稿者 : 管理人     投稿日時 : 2017/05/13(Sat) 21:55:48
> If (Timer - ts) >= intervalSec Then
> の (Timer - ts) の考えは
> (現在の経過時間 - 代入した時の経過時間)
> と解釈しました。 よろしいでしょうか?

その解釈で問題ないです。
ただ、ループの1回目ではtsには初期値のゼロが入っていますのでそこは認識しておいてください。

プログラム上のルールは特に設けてないので、
日本語の変数の方がわかりやすいというのであればそのように変えていただいてかまわないです。

[返信 8] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/14(Sun) 00:13:53
管理人さん
ご返信有難う御座います。

お蔭様で、ご教授頂いたプログラムは大体理解出来ました。

ひとつ条件を増やしたいのですが・・・。
今エクセルシートの「A1」から「E1」まで5文字入力されていますが、「E1」を「空白」としたとき「空白」はカウントしない様にできるのでしょうか?

現在
「A2」セルにCount関数を入力して、空白以外の数値を取得。
プログラム内の「セル列 = Int(5 * Rnd + 1)」の「5」に「A2」セルを反映。

できればプログラムで処理して、シートの「A2」セルを無くしたいです。

あと、「セル列 = Int(5 * Rnd + 1)」の「Rnd」が理解出来ないのですが・・・。
取得したい数値は「1~5」だと思うのですが、なぜこれで「1~5」が取得できるのか解りません。

大変しつこく質問してしまい恐縮ですが、ご教授宜しくお願いします。

[返信 9] Re : ランダム表示 くじけそうです。
投稿者 : 管理人     投稿日時 : 2017/05/14(Sun) 21:38:16
1行1列目から右方向の空白セルまで入力済みセル数をカウントする処理を追加しました。

Sub sample170514()

Dim セル数 As Integer
Dim 表示時間 As Single
Dim 表示回数 As Integer

' 1行1列目から右方向の空白セルまで入力済みセル数をカウント
Do Until Cells(1, セル数 + 1).Value = ""
セル数 = セル数 + 1
Loop

' 表示時間
表示時間 = Range("G1").Value

' 表示回数
表示回数 = Range("H1").Value

' 乱数ジェネレータの初期化
Randomize

Dim Timer代入時間 As Single
Dim 表示カウント数 As Integer
Dim セル列 As Integer

Do Until 表示カウント数 >= 表示回数

If (Timer - Timer代入時間) >= 表示時間 Then

Timer代入時間 = Timer

' 1~セル数までの乱数を発生
セル列 = Int(セル数 * Rnd + 1)

' 値表示
Range("A3").Value = Cells(1, セル列).Value

表示カウント数 = 表示カウント数 + 1

End If

Loop

MsgBox "ランダム表示終了", vbInformation

End Sub


Rndは0以上1未満の単精度型の小数の値(0~0.999…)をランダムで返してくれる関数です。
Intは小数部分を切り捨てる関数です。


あと、関数について説明するのを忘れてましたが、
関数とはある決まった処理をしてその結果を返してくれるものと覚えておいてください。

[返信 10] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/16(Tue) 16:47:28
管理人さん
ご返信有難う御座います。

空白セルの対応プログラムは正常に起動しました。
空白セルになるまでループ回数でセル数をカウントしているのですね。有難うございます。

Int関数とRnd関数の疑問も無事解決しました。
関数の性質は多少は理解しているつもりなのですが、なぜ 「指示項目数 * 乱数 + 1」で指示項目数のランダム値が取得できるのか悩んでいました。実際に0~0.999までシートに打込み「Int(セル数 * Rnd + 1)」に当てはめてみて納得しました。(単純に私の数学の能力不足か・・・汗)

この後、ご教授頂いたプログラムを参考に目的のプログラムに挑戦してみようと思います。
先は長く途中行き詰るのは確実ですが、また丸投げ状態になりたくないので出来る所まで自分で作成してみます。作製したプログラム(おそらく起動しない)にアドバイスや助言が頂ければとても助かります。

つぎに投稿するときはこちらの後に続けたほうが良いのでしょうか?
ご指導宜しくお願いします。

[返信 11] Re : ランダム表示 くじけそうです。
投稿者 : 管理人     投稿日時 : 2017/05/16(Tue) 21:36:15
> Int関数とRnd関数の疑問も無事解決しました。
> 関数の性質は多少は理解しているつもりなのですが、なぜ 「指示項目数 * 乱数 + 1」で指示項目数のランダム値が取得できるのか悩んでいました。実際に0~0.999までシートに打込み「Int(セル数 * Rnd + 1)」に当てはめてみて納得しました。(単純に私の数学の能力不足か・・・汗)


疑問に思ったことを地道に確認することはいいことです。
ある範囲の乱数を取得するときはこの決まった計算式を使うことを覚えておけば
いろんなところで使えると思います。


> この後、ご教授頂いたプログラムを参考に目的のプログラムに挑戦してみようと思います。
> 先は長く途中行き詰るのは確実ですが、また丸投げ状態になりたくないので出来る所まで自分で作成してみます。作製したプログラム(おそらく起動しない)にアドバイスや助言が頂ければとても助かります。

> つぎに投稿するときはこちらの後に続けたほうが良いのでしょうか?
> ご指導宜しくお願いします。

頭の中でわかるのと、実際に使えるのは別ものだと思っていますので、
ダメもとでもご自身で考えてコードを書いてみた方が上達がはやいと思います。

このスレッドはかなり長くなってしまったので、
次投稿するときは新規で投稿してください。

[返信 12] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/18(Thu) 08:23:37
管理人さん
ご返信有難う御座います。

いろいろとご指導有難う御座いました。
頂いたプログラムや助言をもとに、出来る範囲ですが少しづつ挑戦してみようと思います。
また行詰まった時などはご指導宜しくお願い致します。
本当に有難うございました。

[返信 13] Re : ランダム表示 くじけそうです。
投稿者 : vba初心者     投稿日時 : 2017/05/18(Thu) 16:22:33
解決済み

スポンサード リンク
 
 
当掲示板について
返信入力フォーム
お 名 前  :
内  容   :
ステータス  : この質問を解決済みにする

認証コード  :
        キャプチャ画像


( 処理日時 : 2019-08-26 09:43:16 )

Page
Top