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

エクセル2010以降ですが。
ユーザーホームに、ランダムに指定したセルの内容(テキスト)を表示するには、どうすればいいですか?
セル範囲はB2~B51 の50個
B2~B51 には、全角文字で、10~20文字が入力されています。

それを一つのユーザーフォームに一定時間毎に(時間はA1で指定:15秒~60秒くらいで)表示したいのです。

どのようなマクロを組めばいいのか、教えてください。
よろしくお願いします。

質問者からの補足コメント

  • うれしい

    WindFller 様
    ご回答ありがとうございました。インフルエンザも峠を越して落ち着きましたので、提示していただいたマクロを試行いたしました。
    うまく実行できてうれしく思います。ありがとうございました。
    ただ「アレンジが云々」は、浅学な私にはよく分かりません。どこがアレンジで、基本が何かが。
    また
    DoEvents
    が正常に作用しているのかも、いまいち理解できておりません。
    お教えいただいた方法を試行しているうちに、あれこれとドンドン欲が膨らんできています。
    これから学習していきますので、ご指導のほどお願いします。

      補足日時:2018/01/26 19:47

A 回答 (2件)

いつも回答は読ませていただいております。



私は、今回のような質問を、ずっと続けているのですが、今回、返事を付けるのが遅くなってしまいました。

>ランダムに指定したセルの内容(テキスト)を表示するには
>B2~B51 には、全角文字で、10~20文字が入力されています。

ランダムはランダムでも、「重複を許さないランダム」なのでしょうね。
そこで、今までとは違う、ランダム・パレット方式を利用した方法を試したいと思いました。乱数であっても、決められたパレット(組み合わせ)を何度も使う疑似乱数です。
しかし、その乱数が日替わりなのです。例えば、暗記用には最適かと思います。

少し、私のアレンジが過ぎていたら、おっしゃってください。
度が過ぎるかもしれません。

'//

Dim rndPalate(49)
Dim stopFlg As Boolean
Dim cnt As Long '←これは、Public cnt として、標準モジュールの方がよいかもしれません。
Private Sub CommandButton1_Click()
  Dim wTime As Date
  Dim tSec As Long '待ち時間
  Dim i As Long, j As Long
  tSec = Val(Range("A1").Value)
  If tSec = 0 Then MsgBox "秒数が、A1にありません。", vbCritical: Exit Sub
  If tSec > 59 Then MsgBox "値が多すぎるかもしれません。60より下", vbExclamation: Exit Sub
  
  CommandButton2.BackColor = &H8000000F
  wTime = TimeSerial(0, 0, tSec)
  For i = cnt To UBound(rndPalate)
    j = rndPalate(i)
    TextBox1.Text = Cells(j + 1, 2).Value
    DoEvents
    Application.Wait Now() + wTime
    If stopFlg Then Exit For '中止ボタンで止まる
    cnt = i '再開の時に、次から読む
  Next i
  stopFlg = False
End Sub

Private Sub CommandButton2_Click()
stopFlg = Not stopFlg
If stopFlg Then
  CommandButton2.BackColor = &HFF& 'ボタンが受けられたら、赤に変わる
Else
  CommandButton2.BackColor = &H8000000F
End If
End Sub

Private Sub UserForm_Initialize()
Dim j As Long, i As Long
Dim ret
Rnd -1: Randomize Day(Date) '一日だけ同じの乱数
Do
 j = Int((Rnd() * 50)) + 1
 ret = Application.Match(j, rndPalate, 0)
 If IsError(ret) Then
  rndPalate(i) = j
  i = i + 1
 End If
 ret = ""
Loop Until i >= 50
cnt = 0
CommandButton2.BackColor = &H8000000F
End Sub
「エクセル ユーザーフォームに、ランダムに」の回答画像1
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございます。
インフルエンザに罹患してしまって、少しの間PCからはなれます。
学習して、お礼は改めて。とりあえず、礼を失しては申し訳ないので。
ありがとうございました。

お礼日時:2018/01/24 18:17

構想が膨らんでいるようで何よりです。

では、こんなのはいかがでしょうか?
ユーザフォームをModelessで表示することにより、表示中でも普通にExcelの操作ができます。

下記のコードを張り付けてから、UserFormShow を実行するとユーザフォームが表示されます。

【標準モジュール】
Public myTime As Variant

Sub UserFormShow()
UserForm1.Show vbModeless
Call UpdateTextbox1
End Sub

Sub UpdateTextbox1()
Dim r As Long
r = WorksheetFunction.RandBetween(2, 51)
UserForm1.TextBox1.ControlSource = "Sheet1!B" & r
myTime = Now + TimeSerial(0, 0, Sheets("Sheet1").Range("A1"))
Application.OnTime myTime, "UpdateTextbox1"
End Sub

【フォームモジュール】
Private Sub UserForm_Terminate()
Application.OnTime myTime, "UpdateTextbox1", Schedule:=False
End Sub
    • good
    • 0
この回答へのお礼

ママチャリ様
ご回答ありがとうございます。
なるほど、そうなのですね!
ちょうど、かゆいところに手が届かなくて、イライラし始めているところでした。
使わせていただきます。ありがとうございます。

今ひとつ、ユーザーフォームのテキスト表示が縦書きにできるとうれしいのですが。
横書きと縦書きのユーザーフォームを混在させることは可能でしょうか?

お礼日時:2018/01/27 16:11

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