• ベストアンサー

VBAでのコントロール操作

ボタンを押したら、そのボタンを非活性(Enabled=FALSE)にしたいです。 しかし、他に裏で処理が動いていると、すぐに非活性にならず、 少し時間がたった後、非活性になります。 私としてはすぐに非活性にしたいのですが、VBAで何か良い方法ありますか? 例えばC#では ボタンA.Enabled = false; ボタンA.Refresh(); これで、すぐにボタンAは非活性になります。

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

> 少し時間がたった後、 タイマーではないので、その解釈では問題あるでしょう。 プログラムで実行している関数を抜けたタイミングだと思われます。 OS に制御が戻って次の処理が実行できる状態になったときに、OS が再描画 処理を命令します。 > ボタンA.Refresh(); Excel でもコントロールによってできたりできなかったり。 例えば、UserForm の Frame には Repaint があります。 (OS が再描画命令できるのだから内部処理は存在するのだろうけど、プログラム から利用できるように公開されていない。) 総じて DoEvents が紹介されたりしますが、C# にも Application.DoEvents があります。ヘルプで内容を確認できると思いますが、再描画の命令ではなく、 副作用があります。 これっていう良い方法は無いと思います。 上記に挙げたような内部処理を理解した人が、状況に応じてコーディングするか、 副作用込みで DoEvents するかといったところでは。

machine_angel
質問者

お礼

DoEventsでうまくいきました。 ありがとです。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>他に裏で処理が動いていると、すぐに非活性にならず、 >少し時間がたった後、非活性になります。 問題は、こちらの方ではありませんか? 概ね、ここのカテゴリを書く人は、VB系の経験者だけですから、他の言語を知っているということは関係ないわけで、単に知らないなら知らないだけで良いと思います。ましてやC#なら、いずれ、VBAのVB6系は、外に追いやられることになるでしょうから、書いている側の立場が逆になるのかもしれません。 Private Sub CommandButton1_Click()  CommandButton1.Enabled = False End Sub 特に、ボタンのRefresh のメソッドはありませんし、必要ありません。 これ自体は、何の問題もありません。 「裏の処理」の対処をどうするかですが、マクロが動いている最中で、他に動くのはDDEぐらいだけですから、それを、どういうように防ぐか、その手段がいろいろありますから、ボタンだけを言われたところで、分かりません。 例えば、 Application.ScreenUpdating =Fasle ---->True で挟んで、画面のアクセスを防ぐか。 Application.EnableEvents =False ------>True で挟んで、イベント類を止めるか Application.Calculation = xlCalculationManual ----> xlCalculationAutomatic で、組み込み関数の動きを止めるか、 Application.Interactive = False ---> True で、DDEやユーザー割り込みを止めるか、 いろんな方法があります。

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

VBA というのは Visual Basic for Application という意味です。 この Application というのはいろいろあります。 それぞれやり方が違います。 Excel Access Word etc...

関連するQ&A