エクセル | の学校 |
8.一覧 | 9.HOME |
1.Top | 2.Last |
『マクロ実行時の釦連打阻止』(妖精)
エクセルの「実行」シート上に作成した「開始」釦を押して マクロが終了するまで「開始」釦を押せないようにしたいのですが、
Sub 開始_Click()
開始.Enabled = False
〜〜各コード〜〜 開始.Enabled = true
End sub
とネットで見つけたコードを入れてみたのですが、 実行すると「オブジェクトが必要です」と表示されるのですが、 どのようなオブジェクトが必要なのかがわかりません… 超初心者のため、知識不足で申し訳ありません…
< 使用 Excel:unknown、使用 OS:unknown >
どこのネットですかね。そこに説明されているのでは? 不明ならそのURLを示したらいかが?
(xyz) 2024/04/22(月) 17:16:32
そのコードはActiveX コントロール用のものですが、その点は大丈夫ですか。 (hatena) 2024/04/22(月) 17:53:37
どんな時間のかかる処理をさせているんですか? マクロがすぐに終了して、開始.Enabled = true が実行されているからでは?
開始.Enabled = Falseが効いていると、キャプションが淡色表示になって押せないはずです。
(xyz) 2024/04/23(火) 11:15:05
> フォームコントロールで作成したボタンです。
フォームコントロールのボタンではEnabled = Falseにしても押せてしまうようです。 (サンプル作成して確認済み)
そのボタンは削除して、解決タブの挿入から ActiveXコントロールのコマンドボタンを シート上に配置してください。 配置したボタンをダブルクリックするとVBAエディターが開いて下記のコードが 自動で入力されています。
Private Sub CommandButton1_Click()
End Sub
そこに下記のようにコードを挿入してください。 ※CommandButton1 の部分は状況によって変わるので、 自動入力されたものをそのまま使ってください。
Private Sub CommandButton1_Click() CommandButton1.Enabled = False
〜〜各コード〜〜
CommandButton1.Enabled = True End Sub
サンプルで動作確認済み
これでうまくいかないようなら、 現状のコードをコピーして貼り付けてください。
(hatena) 2024/04/23(火) 11:29:57
CommandButton1.Enabled = False のあとに DoEvents DoEvents などとするとキャプションが淡色化されるかもしれません。 # これで失礼します。 (xyz) 2024/04/23(火) 11:34:23
hatena様の記載していただいたとおりにコードを入力してみたのですが、 マクロが終わるまでボタンを押した状態になったままで、 ボタン無効化にはならない状態です。
コードは以下の通りに作成しています。
Private Sub CommandButton1_Click()
'1.変数宣言 Dim endrow As Long Dim nextrow As Long Dim limit As Long Dim Tousen As Long Dim find As Range
'2.処理準備 'findの初期値設定(なんでも可) Set find = Range("A1")
'抽選数字上限取得 limit = Range("A3")
'抽選時間取得 Entyo = 15
'1回目の抽選かどうか If (Range("B3") = "") Then endrow = 2 Else endrow = Range("B2").End(xlDown).Row End If
'最大抽選回数と当選数が同じではない場合は終了 If limit <> Range("K14") Then MsgBox "抽選回数と当選数が同じではありません" Exit Sub End If
'抽選結果表示行 nextrow = endrow + 1
'3.処理()
If (nextrow = limit + 3) Then '抽選回数上限に達した場合 Range("E8") = "抽選は" & vbCrLf & "終了しました。" Else CommandButton1.Enabled = False 'ボタン無効化
'重複しない抽選番号取得 Do Until find Is Nothing Randomize Tousen = Int(limit * Rnd + 1) Set find = Range(Cells(3, 3), Cells(endrow, 3)).find(What:=Tousen, lookat:=xlWhole) Loop
'抽選延長時間 If (Entyo = "") Then Else For i = 1 To Entyo * 170 Range("F2") = Int(limit * Rnd + 1) If i < Entyo Then Range("E8") = "抽選中・・・" Next End If
'4.表示 Select Case Tousen 'Tousenの値により当選を振り分ける Case 1 To Range("K13") Range("E8") = "10等" & vbCrLf & Range("N13") Range("J13") = Range("J13") + 1
Case Range("K13") + 1 To (Range("K13") + Range("K12")) Range("E8") = "9等" & vbCrLf & Range("N12") Range("J12") = Range("J12") + 1
Case Application.WorksheetFunction.Sum(Range("K12:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K11:K13")) Range("E8") = "8等" & vbCrLf & Range("N11") Range("J11") = Range("J11") + 1
Case Application.WorksheetFunction.Sum(Range("K11:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K10:K13")) Range("E8") = "7等" & vbCrLf & Range("N10") Range("J10") = Range("J10") + 1
Case Application.WorksheetFunction.Sum(Range("K10:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K9:K13")) Range("E8") = "6等" & vbCrLf & Range("N9") Range("J9") = Range("J9") + 1
Case Application.WorksheetFunction.Sum(Range("K9:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K8:K13")) Range("E8") = "5等" & vbCrLf & Range("N8") Range("J8") = Range("J8") + 1
Case Application.WorksheetFunction.Sum(Range("K8:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K7:K13")) Range("E8") = "4等" & vbCrLf & Range("N7") Range("J7") = Range("J7") + 1
Case Application.WorksheetFunction.Sum(Range("K7:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K6:K13")) Range("E8") = "3等" & vbCrLf & Range("N6") Range("J6") = Range("J6") + 1
Case Application.WorksheetFunction.Sum(Range("K6:K13")) + 1 To Application.WorksheetFunction.Sum(Range("K5:K13")) Range("E8") = "2等" & vbCrLf & Range("N5") Range("J5") = Range("J5") + 1
Case limit Range("E8") = "1等" & vbCrLf & Range("N4") Range("J4") = Range("J4") + 1
End Select
Range("F2") = Tousen Cells(nextrow, 2) = nextrow - 2 Cells(nextrow, 3) = Range("F2")
'5.降順に並び替え With ActiveSheet.Sort With .SortFields .Clear .Add Key:=Range("B3"), Order:=xlDescending End With .SetRange Range(Cells(3, 2), Cells(nextrow, 3)) .Header = xlNo .Apply End With End If CommandButton1.Enabled = True 'ボタン有効化
End Sub
(妖精) 2024/04/23(火) 11:49:08
xyzさんの回答を試してみてください。
(hatena) 2024/04/23(火) 12:29:17
あと、念のために、 CommandButton1.Enabled = False はプロシージャの先頭に移動させた方がいいかもしれません。
Exit Sub すると無効化されたままになるので、その対策も。
Private Sub CommandButton1_Click() CommandButton1.Enabled = False DoEvents DoEvents
'中略
If limit <> Range("K14") Then MsgBox "抽選回数と当選数が同じではありません" CommandButton1.Enabled = True 'ボタン有効化 'これを挿入 Exit Sub End If
'後略
(hatena) 2024/04/23(火) 12:35:42
ご親切にありがとうございます。 お教えしていただいたとおりにするとボタンの無効化はできました。
ただ、ダブルクリックなら反応がないのですが、 実行中に3クリック以上すると実行完了後に1度実行されてしまいます。 これを回避する事は可能でしょうか? (妖精) 2024/04/23(火) 13:10:51
Enabled = Trueの前にMsgBoxを入れたらどうなりますか?
Private Sub CommandButton1_Click() CommandButton1.Enabled = False DoEvents DoEvents
'処理
MsgBox "処理が終了しました!" '★これを追加 CommandButton1.Enabled = True End Sub (まる2021) 2024/04/23(火) 14:10:44
当方のサンプルでは、 まる2021さんの回答の方法でうまくいきました。
MsgBoxを表示させたくないという場合は、下記の方法でどうでしょう。 OnTimeで1秒後にボタンを有効化します。
Private Sub CommandButton1_Click() CommandButton1.Enabled = False DoEvents DoEvents
'処理
Application.OnTime Now + TimeSerial(0, 0, 1), Me.CodeName & ".BtnEnabled" End Sub
Sub BtnEnabled() CommandButton1.Enabled = True End Sub
(hatena) 2024/04/23(火) 14:22:27
ありがとうございます! 無事、実行中にクリックを連打しても複数回実行されないことが確認でき、 期待通りの処理を行うことができました! 親切・丁寧なご回答にすごく助けられました 本当にありがとうございました!! (妖精) 2024/04/23(火) 14:36:44
解決したようですが、 ボタン有効化する前に DoEvents を入れてもうまく行きました。
Private Sub CommandButton1_Click() CommandButton1.Enabled = False DoEvents
'処理
DoEvents CommandButton1.Enabled = True End Sub
(hatena) 2024/04/23(火) 14:52:43
]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.