そもそもですが
ExcelVBAはシングルスレッドでの実行しかできなかったと思います。
ボタンを押してマクロの処理中に、もう一度ボタンを押すということができないような気がするのですが。
※少なくとも自分の環境Windows7/Office2010ではできなさそうでした。
それはさておき
シート上のボタンを操作する、という意味でアドバイスさせていただきます。
どのようにボタンを作成されたのか記載がありませんが、マクロ名などから察するに、おそらくフォームコントロールのボタンを配置し、そのボタンに「実行」というマクロを割り付けたのではないかと推測します。
さらにそのボタンに表示する文字を「テキストの編集」で「実行」という表示に変えているのではないでしょうか。
上記であると仮定してアドバイスを進めますが、この場合、ボタンの名称はおそらく「実行」ではありません。
表示名(.Caption)は「実行」かもしれませんが、オブジェクト名(.Name)はこれとは別です。
なので実行.Enabled = False
は関数に対してプロパティを指定しているような解釈となり、そんなものはないと怒られているのではないでしょうか?
試ににボタンのあるシートがアクティブな状態で、以下のマクロを実行してみてください。
Sub 確認()
Dim sht As Worksheet
Dim btn As Button
'Dim i As Integer
Set sht = Worksheets("sheet1")
'■コメントアウトされているコードをコメント解除すると、ボタン名などをセルに出力できます。
'i = 1
'sht.Cells(1, i) = "Index:"
'sht.Cells(2, i) = "表示名:"
'sht.Cells(3, i) = "ボタン名:"
'Sheet1上のボタンをループ処理
For Each btn In sht.Buttons
'i = i + 1
'sht.Cells(1, i) = btn.Index
'sht.Cells(2, i) = btn.Caption
'sht.Cells(3, i) = btn.Name
MsgBox "Index:" & btn.Index & vbCr & _
"表示名:" & btn.Caption & vbCr & _
"ボタン名:" & btn.Name
Next
End Sub
シート上にあるボタンのインデックス番号と表示名称、ボタンのオブジェクト名称がそれぞれ表示されると思います。
VBAの中では、
Worksheets("sheet1").Buttons(1).Caption = "hoge"
Worksheets("sheet1").Buttons("Button 2").Caption = "hoge"
といったようにインデックス番号、またはオブジェクト名を指定して目的のボタンを操作します。
ボタンの無効化
今回行いたいのはボタンの無効化ということですが、結論から言うと残念ながらできないようです。
・btn.Caption
で表示名の変更
・btn.Visible
で表示/非表示の変更
など他のプロパティは問題なく変更できるのですが、
・.EnabledI
で有効/無効の変更
は変更してもなぜか効果がでないようです。
代案
有効/無効の制御方法が見つからないので代替え案を考えてみます。
①.Visible=False
としてボタン自体を消してしまうことで物理的に押せなくする
表示/非表示のプロパティは普通に反映されるようですので、ボタンを消してしまうという方法です。
処理中はシート上から実行ボタンが消えてしまいますので、見た目が気に入らないなどの理由で却下ということもあるかもしれません。
②共通変数として実行中フラグを用意し、実行中にボタンが押されても処理を開始しないようにする。
例えば
Private blnJikko As Boolean '実行中フラグ
Sub 実行()
'既に実行中の場合は処理中止
If blnJikko = True Then Exit Sub
'処理開始時にフラグを立てる
blnJikko = True
'---ここから本来の実行処理(省略)---
'処理を抜ける前にフラグを落とす
blnJikko = True
End Sub
のように記述し、実行フラグが立っている状態で重ねて処理が起動されるのを防ぐ方法もあります。
参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/28 09:25
2017/09/28 09:45 編集
2017/09/28 23:34
2017/09/28 23:35
2017/09/29 00:20
2017/09/29 00:45