Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4897 / 13644 ツリー ←次へ | 前へ→

【53653】ラベルにランダムに表示させる ルネッサ 08/1/29(火) 18:45 質問[未読]
【53654】Re:ラベルにランダムに表示させる VBWASURETA 08/1/29(火) 20:02 質問[未読]
【53655】Re:ラベルにランダムに表示させる ルネッサ 08/1/29(火) 20:38 回答[未読]
【53656】Re:ラベルにランダムに表示させる じゅんじゅん 08/1/29(火) 21:28 発言[未読]
【53657】Re:ラベルにランダムに表示させる ルネッサ 08/1/29(火) 21:46 お礼[未読]
【53667】Re:ラベルにランダムに表示させる VBWASURETA 08/1/30(水) 10:15 発言[未読]
【53668】Re:ラベルにランダムに表示させる ハチ 08/1/30(水) 12:27 発言[未読]
【53709】Re:ラベルにランダムに表示させる ルネッサ 08/2/4(月) 12:18 質問[未読]
【53710】Re:ラベルにランダムに表示させる ハチ 08/2/4(月) 13:05 発言[未読]
【53711】Re:ラベルにランダムに表示させる ルネッサ 08/2/4(月) 14:21 お礼[未読]
【53712】Re:ラベルにランダムに表示させる ハチ 08/2/4(月) 14:40 回答[未読]
【53719】Re:ラベルにランダムに表示させる ルネッサ 08/2/4(月) 17:04 お礼[未読]
【53669】Re:ラベルにランダムに表示させる ルネッサ 08/1/30(水) 14:25 お礼[未読]
【53728】Re:ラベルにランダムに表示させる VBWASURETA 08/2/5(火) 10:40 発言[未読]

【53653】ラベルにランダムに表示させる
質問  ルネッサ  - 08/1/29(火) 18:45 -

引用なし
パスワード
   はじめまして.
初心者ですが,Excel VBAで簡単なゲームを作ろうとしています.

お尋ねしたい概要は,
「フォーム上のラベルにランダムに文字(言葉)を表示させる.
文字が表示されたらキーボードを押す.
キーボード反応があったら,次の文字を表示させる.
ただし,一度表示された文字は使われない.」

というものです.

ラベルにランダムに文字を表示させることはできましたが,
その後はどうすればよいかわかりません.
アドバイスいただけますよう,どうぞよろしくお願いいたします.

また初心者ゆえ質問の仕方にも至らぬ点あるかと思いますが,ご指摘ください.

*********

Dim Characters As String     
  
  Randomize     
  Characters = Int((5 * Rnd) + 1)
    
  Select Case Characters
    Case 1: stmCharacters = a
    Case 2: stmCharacters = b
    Case 3: stmCharacters = c
    Case 4: stmCharacters = d
    Case 5: stmCharacters = e
    
  End Select

【53654】Re:ラベルにランダムに表示させる
質問  VBWASURETA  - 08/1/29(火) 20:02 -

引用なし
パスワード
   ▼ルネッサ さん:

こんばんは。

1点質問ですが、質問されている内容ですが何故必要なのでしょうか?
というのはゲームという時点で、課題か何かのように思えるのですが。

そいうのは聞いてしまうと課題になりませんよ^^;

【53655】Re:ラベルにランダムに表示させる
回答  ルネッサ  - 08/1/29(火) 20:38 -

引用なし
パスワード
   ▼VBWASURETA さん:
ご質問ありがとうございます.

私がやろうとしていることについて,もう少し補足します.
表示させる文字の例として,a,b,c,d,eの5種類を挙げていますが,これに対するキーボード反応の速度を測る予定です.
ただし私にとって重要なのは,それぞれに対する速度ではなく,5種類に対する反応の平均値なのです.
そしてその平均値を,このゲーム(課題)に取り組んだ人の間で比較しよう,というものなのです.
ですので,文字の表示の回数を5回として(5種類なので),その表示内容が人によって
例えば"aabce"とか"abbcd"とかばらばらでは厳密な比較にならなくて,
5回の表示内容自体は"abcde"にしたい,ということです.

だったらランダムにしなくてもいいじゃないか,とも言われそうですが,
それはそれで必要なのです.

かなりわかりづらく納得していただけないかも知れませんが,
よろしければどうぞお願いいたします.

*********

Dim Characters As String     
  
  Randomize     
  Characters = Int((5 * Rnd) + 1)
    
  Select Case Characters
    Case 1: stmCharacters = a
    Case 2: stmCharacters = b
    Case 3: stmCharacters = c
    Case 4: stmCharacters = d
    Case 5: stmCharacters = e
    
  End Select

【53656】Re:ラベルにランダムに表示させる
発言  じゅんじゅん  - 08/1/29(火) 21:28 -

引用なし
パスワード
   重複しない乱数ってこんな感じの事でしょうか?

Private d As String

Sub aa()
Dim i As Integer
Do
  If Len(d) = 5 Then d = "": Exit Sub
  Randomize
  i = Int((5 * Rnd) + 1)
  If InStr(d, CStr(i)) = 0 Then
    d = d & CStr(i): Exit Do
  End If
Loop
Debug.Print i, d
End Sub

発生した数値(i)を文字列(d)に連結していき、同じ数字がない事を確認してます。
ご参考になれば。

【53657】Re:ラベルにランダムに表示させる
お礼  ルネッサ  - 08/1/29(火) 21:46 -

引用なし
パスワード
   ▼じゅんじゅん さん:

ご回答いただきどうもありがとうございます.
参考にさせていただき,試してみます.
うまくいくかどうか,フィードバックさせていただくまで時間がかかるかもしれませんが
改めて報告させていただきます.

【53667】Re:ラベルにランダムに表示させる
発言  VBWASURETA  - 08/1/30(水) 10:15 -

引用なし
パスワード
   ▼ルネッサ さん、じゅんじゅん さん:

おはようございます。
一応、考えて作りましたが、
じゅんじゅんさんのソースが良いかも知れませんね^^;
ただ長いだけであまり良い出来ではないですが
記載します。
自分の場合は配列に値をセットし、選ばれた値は
配列を詰めて行くソースです。


例:

Dim Setval() As String
Dim Maxindex As Integer

Function Main() As String
  Dim MaxCnt As Integer
  Dim Cnt As Integer
  Dim GetStr As String
  
  '初期処理
  Call FncFstSetData
  GetStr = ""
  
  MaxCnt = Maxindex
  For Cnt = 1 To MaxCnt
    '配列より取得処理(連結)
    GetStr = GetStr & FncGetData
  Next
End Function

'初期配列セット処理
Function FncFstSetData()
  Dim i As Integer
  Maxindex = 5
  
  '5の配列定義
  ReDim Setval(Maxindex) As String
  
  'A〜Eまでを配列にセット
  For i = 1 To Maxindex
    Setval(i) = Chr(64 + i)
  Next i
End Function

'配列から1文字を取得
Function FncGetData() As String
  Dim Getindex As Integer
  Dim CntIndex As Integer
  Dim GetStr As String
    
  Randomize
  Getindex = Int((Maxindex * Rnd) + 1)
  
  '取得文字列を取得
  GetStr = Setval(Getindex)
  
  '取得文字列の配列以降を詰める
  For CntIndex = Getindex + 1 To Maxindex
    Setval(CntIndex - 1) = Setval(CntIndex)
  Next
  
  Setval(Maxindex) = ""
  Maxindex = Maxindex - 1
  
  '取得文字列を返す
  FncGetData = GetStr
End Function

【53668】Re:ラベルにランダムに表示させる
発言  ハチ  - 08/1/30(水) 12:27 -

引用なし
パスワード
   自分も一案考えてみました。
Collectionオブジェクトを使うとスッキリすると思います。

Sub Test()
  Dim myColl As Collection
  Dim i As Integer
  
  Set myColl = New Collection
  
  With myColl
    '要素の追加
    .Add "あ"
    .Add "い"
    .Add "う"
    .Add "え"
    .Add "お"

    '実行
    Do Until .Count = 0
      Randomize
      i = Int((Rnd * .Count) + 1)
      MsgBox .Item(i)
      .Remove i
    Loop
  End With
  
  Set myColl = Nothing
  
End Sub

【53669】Re:ラベルにランダムに表示させる
お礼  ルネッサ  - 08/1/30(水) 14:25 -

引用なし
パスワード
   VBWASURETA さん,ハチ さん

一生懸命考えてくださってありがとうございます.
参考にさせていただき,またフィードバックさせていただきます.

【53709】Re:ラベルにランダムに表示させる
質問  ルネッサ  - 08/2/4(月) 12:18 -

引用なし
パスワード
   ハチ さん:

教えていただいたコードを試しました.
おかげさまで,重複しない乱数という点は思い通りだったのですが,,,
要素("あ"など)の呈示される場所としてはMsgBoxしか使えないのでしょうか?

フォーム上のラベルに呈示させたくて,いろいろ試してみたのですがうまくいきません.
もしおわかりになれば,方法を教えてください.
よろしくお願いします.

>
>Sub Test()
>  Dim myColl As Collection
>  Dim i As Integer
>  
>  Set myColl = New Collection
>  
>  With myColl
>    '要素の追加
>    .Add "あ"
>    .Add "い"
>    .Add "う"
>    .Add "え"
>    .Add "お"
>
>    '実行
>    Do Until .Count = 0
>      Randomize
>      i = Int((Rnd * .Count) + 1)
>      MsgBox .Item(i)
>      .Remove i
>    Loop
>  End With
>  
>  Set myColl = Nothing
>  
>End Sub

【53710】Re:ラベルにランダムに表示させる
発言  ハチ  - 08/2/4(月) 13:05 -

引用なし
パスワード
   ▼ルネッサ さん:
>ハチ さん:
>
>教えていただいたコードを試しました.
>おかげさまで,重複しない乱数という点は思い通りだったのですが,,,
>要素("あ"など)の呈示される場所としてはMsgBoxしか使えないのでしょうか?

そんなことはありません。

>>MsgBox .Item(i)
ここがメッセージに表示してる箇所です(たぶん解ってると思いますけど)
.Captionに代入すれば良いと思います。

>フォーム上のラベルに呈示させたくて,いろいろ試してみたのですがうまくいきません.

この「いろいろ試してみたこと」を書いてください。
丸投げとは思いませんが、相手に伝えることは大切です。

【53711】Re:ラベルにランダムに表示させる
お礼  ルネッサ  - 08/2/4(月) 14:21 -

引用なし
パスワード
   ハチ さん:

早速の返信,ありがとうございます.

>>>MsgBox .Item(i)
>ここがメッセージに表示してる箇所です(たぶん解ってると思いますけど)

ここを変えるのだろうということはなんとなくわかって,
いろいろ試してみたというのはここを,
Label1.Caption(i) とか
Label1.Caption = Item(i) とか
Label1.Caption.Item (k) とか,

自分なりに思いつくまま書き換えては試し,エラーが出てはまた書き換えて,
なんていう感じでやってました.
すみません,質問のマナーもあまり知らずに.

というわけで.Captionを使うというのはなんとなくわかりながら,どういう
コードにするかということが,私はおそらく基本的にわかっていないのです.
一応,参考書なども見ているのですが…

それで恥ずかしながら未だにうまくいっていませんが,さらに試行錯誤します.

【53712】Re:ラベルにランダムに表示させる
回答  ハチ  - 08/2/4(月) 14:40 -

引用なし
パスワード
   ▼ルネッサ さん:

>Label1.Caption = Item(i) とか
これが一番近いです。

Label1.Caption = .Item(i)

With myCollでくくってますので、
コードの意味としては、

Label1.Caption = myColl.Item(i)

となります。

【53719】Re:ラベルにランダムに表示させる
お礼  ルネッサ  - 08/2/4(月) 17:04 -

引用なし
パスワード
   ハチ さん

教えていただいたとおりのやり方で,思い通り動かすことができました!
たびたび丁寧に教えていただき,本当にありがとうございました.
いろいろすごく勉強になりました!

【53728】Re:ラベルにランダムに表示させる
発言  VBWASURETA  - 08/2/5(火) 10:40 -

引用なし
パスワード
   こんにちは。

余談ですが、早いループ処理としてFor文が最速らしいです。
実際計ってはいないですがどうなのでしょうね。
それで、固定の回数ループである場合はFor文を使うようにしてます。
Doのような動的ループは条件が変わる場合だけにしてます。
ちょっと余裕あるときに計測してみます。

4897 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free