エクセル の学校
8.一覧 9.HOME
1.Top 2.Last

[[20240422160334]]

[ 初めての方へ | 一覧(最新更新順) |

|
| 全文検索 | 過去ログ | エクセルの学校HOME ]

 

『マクロ実行時の釦連打阻止』(妖精)

エクセルの「実行」シート上に作成した「開始」釦を押して マクロが終了するまで「開始」釦を押せないようにしたいのですが、

Sub 開始_Click()

 開始.Enabled = False

 〜〜各コード〜〜    開始.Enabled = true

End sub

とネットで見つけたコードを入れてみたのですが、 実行すると「オブジェクトが必要です」と表示されるのですが、 どのようなオブジェクトが必要なのかがわかりません… 超初心者のため、知識不足で申し訳ありません…

< 使用 Excel:unknown、使用 OS:unknown >


 どこのネットですかね。そこに説明されているのでは? 不明ならそのURLを示したらいかが?

(xyz) 2024/04/22(月) 17:16:32


その「開始」釦は、フォーム コントロールのボタンですか、 それとも、ActiveX コントロールのコマンドボタンですか。

そのコードはActiveX コントロール用のものですが、その点は大丈夫ですか。 (hatena) 2024/04/22(月) 17:53:37


フォームを使用せず、シートに直接ボタンを作成し そこに実行マクロを記載しています。 (妖精) 2024/04/23(火) 10:26:02
すみません、質問の意味が理解していませんでした。 フォームコントロールで作成したボタンです。 (妖精) 2024/04/23(火) 10:28:28
ActiveX コントロール用に切り替えると実行することができましたが、 なぜかマクロ実行中は無効化が実行されません・・・ ボタン無効化をコードの前に記載してもボタン連打すると 連打分だけ実行されてしまいます。 (妖精) 2024/04/23(火) 10:56:53
 どんな時間のかかる処理をさせているんですか?
 マクロがすぐに終了して、開始.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


hatena様

ご親切にありがとうございます。 お教えしていただいたとおりにするとボタンの無効化はできました。

ただ、ダブルクリックなら反応がないのですが、 実行中に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


まる2021様 hatena様

ありがとうございます! 無事、実行中にクリックを連打しても複数回実行されないことが確認でき、 期待通りの処理を行うことができました! 親切・丁寧なご回答にすごく助けられました 本当にありがとうございました!! (妖精) 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





[ 一覧(最新更新順) |

]

キーボードヒント:[Home]または[Fn+Home]キーで一番上へ戻ります

YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.