質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

2回答

4693閲覧

VBA ルーレット 抽選

uemiy

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

2クリップ

投稿2021/08/02 00:00

編集2021/08/02 04:29

前提・実現したいこと

・抽選会で使用
・ルーレット
・スタートボタンが押され、ストップボタンを押すと、止まった数字のところだけ色変更。
・全クリアボタンを押すとセルの色が塗りつぶしなしに

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

VBA

1Sub ルーレット() 2Range("B3:T14").Select 3With Selection 4.Font.Name = "Arial Black" 5.Font.Size = 20 6.HorizontalAlignment = xlCenter 7.VerticalAlignment = xlCenter 8With .Borders 9.LineStyle = xlContinuous 10.Weight = xlThin 11.ColorIndex = xlAutomatic 12End With 13.HorizontalAlignment = xlCenter 14.VerticalAlignment = xlBottom 15End With 16ActiveWorkbook.Names.Add Name:="table", RefersTo:=Selection 17n = 0 18For Each c In Range("table") 19n = n + 1 20c.Value = n 21Next 22For i = 1 To 2 23For Each c In Range("table") 24c.Select 25For m = 20 To 3 Step -1 26Selection.Interior.ColorIndex = m 27Next m 28Range("table").Interior.ColorIndex = 0 29Next c 30Next i 31Randomize 32x = Int(Rnd * 70) + 1 33For Each c In Range("table") 34c.Select 35For m = 20 To 3 Step -1 36Selection.Interior.ColorIndex = m 37Next m 38Range("table").Interior.ColorIndex = 0 39If c.Value = x Then 40Selection.Interior.ColorIndex = 6 41Exit Sub 42End If 43Next c 44End Sub 45

試したこと

ストップボタンの作成を試みたができなかった

補足情報(FW/ツールのバージョンなど)

ごめんなさい、VBAは全くの知識がなく、初心者です。
ネットで調べたコードをコピペして少しづつ変えていこうと考えていました。
ですが、期限もあと1週間なので、このサイトを頼ることにしました。
言葉足らずと知識不足で申し訳ないですが、ご理解の上、ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2021/08/02 00:15

せめてインデント(Tabキーや半角スペースでやるアレ)ぐらいは入れようよ… 読ませる気無いように見える…
uemiy

2021/08/02 04:30 編集

すいません、ご迷惑をおかけしました。 補足情報に追記したので、ご理解の上、ご回答よろしくお願いします。
meg_

2021/08/02 04:43

> ですが、期限もあと1週間なので、このサイトを頼ることにしました。 抽選会が1週間後に開催されるのですか? 抽選自体が実装できているのならストップボタンなしでも良いのでは?
BeatStar

2021/08/02 04:48 編集

> ネットで調べたコードをコピペして少しづつ変えて 論外。 料理でいえば『料理をしたことないのに、色気出して余計なことをする』ですね。 初めてやるならレシピ通りにするはずです。 でも『俺は天才だから』とかでレシピを読まずに勝手なことをするのと大差ないです。 まずは基礎からやりましょう。 理解していないものを改造しようとしても十中八九失敗します。 車の構造を理解せずに、何も考えずに分解して再構築するようなものです。 そもそも課題は『答えが合っていること』ではありません。 『自分なりに考え、自分なりに調べること』が目的です。 でも基礎を蔑ろにすると、どんな丁寧な説明でも理解できないはずです。 まずは基礎からやりましょう。
BeatStar

2021/08/02 04:52

それと、まだインデントが変です。 コードを読むと、WithステートメントにWithステートメントが入っています。 入れ子状態ですね。 今の書き方だと読みづらいです。
guest

回答2

0

要するにこれは「ループの実行中にストップボタンを操作したい」ということですかね?
それならDoEventsを使ってください。DoEventsを入れるとそこでボタン等のイベント
を処理してくれるのでループ中でもボタン操作が可能になります。

それを含めてコード書き換えてみました。

VBA

1Option Explicit 2 3Dim STOPFLAG As Boolean ' グローバル 4 5Private Sub CommandButton1_Click() ' スタートボタン 6 STOPFLAG = False 7 Call ルーレット 8End Sub 9 10Private Sub CommandButton2_Click() ' ストップボタン 11 STOPFLAG = True 12End Sub 13 14Sub ルーレット() 15 ' 16 ' 盤面作製 17 ' 18 Dim TA As Range: Set TA = Range("B3:T14") 19 TA.Font.Name = "Arial Black" 20 TA.Font.Size = 9 21 TA.HorizontalAlignment = xlCenter 22 TA.VerticalAlignment = xlBottom 23 TA.Borders.LineStyle = xlContinuous 24 TA.Borders.Weight = xlThin 25 TA.Borders.ColorIndex = xlAutomatic 26 27 Dim i As Long 28 Dim m As Long 29 30 i = 0 31 Dim c As Range 32 For Each c In TA 33 i = i + 1 34 c.Value = i 35 Next 36 ' 37 ' 回転(無限ループ) 38 ' 39 Do While (True) 40 For Each c In TA 41 DoEvents ' 終了ボタンの受け付け 42 If (STOPFLAG) Then GoTo LOOPEXIT ' Break条件 43 For i = 1 To 2 44 For m = 20 To 3 Step -1 45 c.Interior.ColorIndex = m 46 Next m 47 c.Interior.ColorIndex = 0 48 Next i 49 Next c 50 Loop 51 52LOOPEXIT: 53 ' 54 ' ストップ。当たり作製 55 ' 56 Randomize 57 Dim x As Long: x = Int(Rnd * 228) + 1 58 For Each c In TA 59 For m = 20 To 3 Step -1 60 c.Interior.ColorIndex = m 61 Next m 62 c.Interior.ColorIndex = 0 63 If c.Value = x Then 64 c.Interior.ColorIndex = 6 65 Exit Sub 66 End If 67 Next c 68End Sub 69

あと、ストップした時の処理ですが…
どのタイミングでストップボタンを押しても駒の流れが1からリスタートするので
見ていて動きがインチキ臭い(笑)。
ストップボタンが押されたら「あと何個マスを進めるか」を乱数で決定し、その個数だけ
進んだところで無限ループを止めて当たりにするようにすれば自然になります。

投稿2021/08/06 01:51

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

求めているものと微妙に違うと思いますが。

VBA

1Option Explicit 2 3Sub 盤面作成() 4 Dim c As Range, n As Long 5 With Cells 6 .Clear 7 .Font.Name = "Arial Black" 8 .Font.Size = 20 9 .HorizontalAlignment = xlCenter 10 .VerticalAlignment = xlCenter 11 .HorizontalAlignment = xlCenter 12 .VerticalAlignment = xlBottom 13 .Columns(1).Font.ColorIndex = 2 14 End With 15 With Range("B3:T14") 16 ActiveWorkbook.Names.Add Name:="table", RefersTo:=.Cells 17 With .Borders 18 .LineStyle = xlContinuous 19 .Weight = xlThin 20 .ColorIndex = xlAutomatic 21 End With 22 n = 0 23 For Each c In .Cells 24 n = n + 1 25 c.Value = n 26 Next 27 .FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=$A$1").Interior.ColorIndex = 3 28 End With 29End Sub 30 31Sub ボタンクリック() 32 If Range("A2").Value = 0 Then 33 Range("table").FormatConditions(1).Interior.ColorIndex = 3 34 Range("A2").Value = 5 35 ルーレット回転 36 Range("table").FormatConditions(1).Interior.ColorIndex = 4 37 Cells(1, Columns.Count).End(xlToLeft).Offset(, 1).Value = Range("A1").Value 38 Else 39 Application.OnTime Now + TimeValue("0:0:1"), "CountDown" 40 End If 41End Sub 42 43Sub CountDown() 44 With Range("A2") 45 If .Value = 0 Then Exit Sub 46 .Value = .Value - 1 47 End With 48 Application.OnTime Now + TimeValue("0:0:1"), "CountDown" 49End Sub 50 51Sub ルーレット回転() 52 Dim i, j, x 53 x = WorksheetFunction.Max(Range("table")) 54 For i = 1 To WorksheetFunction.RandBetween(500, 1000) 55 Range("A1").Value = i Mod x 56 If Range("A2").Value = 0 Then Exit For 57 For j = 1 To 20 + 10 ^ (5 - Range("A2").Value) 58 DoEvents 59 Next 60 Next 61End Sub

投稿2021/08/03 12:37

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問