[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『時間をおいて表示したい』(とんとん)
シートにテキストボックスを2個とコマンドボタンを1個配置し、 次のようなコードを書いてみました。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub CommandButton1_Click() TextBox1.Text = "aaa" Sleep (2000) TextBox2.Text = "bbb" End Sub
これで、コマンドボタンをクリックすると、まず TextBox1 に"aaa" を表示し、 2秒置いて TextBox2 に"bbb"を表示する、という風にできると思ったのですが、 やってみると、クリック直後には何も表示されず、2秒たって 二つのテキストが 同時に表示されました。
初めに
TextBox1.Text = "aaa"
が実行されると思うのですが、それがすぐに表示されないのはどうしてでしょうか? また、上に書いたように、1番目の表示−2秒の間−2番目の表示 という 動作をさせるにはどうすればいいのでしょうか?
WindowsXP excel2003 です。
非常にわかりやすい記述ですね!!
Private Sub CommandButton1_Click() TextBox1.Text = "aaa" doevents '←これを追加 Sleep (2000) '因みに↑カッコの意味はおわかりですか? この場合は、なくてもよいです TextBox2.Text = "bbb" End Sub
これで試してみて下さい
ichinose
横から失礼します。 To,ichinoseさん
私も「doevents '←これを追加」と思ってやってみたのですが やはり同時に書き込まれます。 ちなみに、コントロールツールボックスのテキストボックスを使用してみました。
私が持っている環境のエクセルが駄目なのですかね? OS:XP エクセル:2002
(HANA)
HANAさん あらっ、本当ですね!! これで出来ると思い込んでいました。 何故かなあ???
検証していただきありがとうございます。
仕方がないですねえ Ontimeでもつかいましょう
Sub CommandButton31_Click() TextBox1.Text = "aaa" Application.OnTime Now() + TimeValue("00:00:02"), "sheet1.lateset" ' ↑ここは、当該シートのオブジェクト名 End Sub '============================================================================== Sub lateset() TextBox2.Text = "bbb" End Sub
ichinose
Sub CommandButton1_Click() Dim tm As Date TextBox1.Text = "aaa" tm = Now() + TimeValue("00:00:02") Do Until Now() >= tm DoEvents Loop TextBox2.Text = "bbb" End Sub
ichinose
ichinoseさん、有り難う御座います。
一応私も色々やってみました。 DoEventsも二つにすると表示されるみたいです。 不思議な感じがしますが。
Private Sub CommandButton1_Click() TextBox1.Text = "aaa" DoEvents '←二つ DoEvents '←並べる Sleep (2000) TextBox2.Text = "bbb" End Sub
(HANA)
>DoEventsも二つにすると表示
なるほど・・・、 ActiveXControlとシートの相性の悪さの一例でしょうかねえ・・。
こういうのは、一度経験しとけば、本番で慌てずに済みます。
このご質問にも感謝です。
ichinose
ichinoseさん、HANAさん、ありがとうございます。
「DoEventsを二つにする」というやり方でうまく動きました。なぜ二つ必要なんでしょうかね。 ichinoseさんの、TimeValue を使うやり方はまだ試していませんが、これから勉強してみます。
ichinoseさんのおっしゃるような「 ActiveXControlとシートの相性の悪さ」というのは、 今まで知りませんでしたが、ほかにもそんなことがあるのでしょうか。
ちなみに、Userform の上にテキストボックスを二つ置いて同じことをやってみましたら、 DoEvents は一つでうまく動きました。
(とんとん)
>Userform の上にテキストボックス・・・うまく動きました。
そうですね!!ユーザーフォームでは可能なことがシートでは、うまくいかない
という比較からしても「ActiveXControlとシートの相性の悪さ」ということですねえ!!
>ほかにもそんなことがあるのでしょうか。
私が知っている事では、「ActiveXControlを作成・削除の実行で モジュールレベルの変数が初期化される」 ですね!!この動作では、他にもいくつか不具合があったと思います。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=7011;id=excel
別サイトですが、私が5年ぐらい前に質問した内容です。
あっ、でも静的に配置した場合は、良い点もたくさんありますよ!! (きめ細かい設定やイベントがある点ですよね?)
因みにシートにコマンドバー「図形描画」にあるテキストボックスでは、
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() TextBoxes(1).Text = "aaa" DoEvents Sleep (2000) TextBoxes(2).Text = "bbb" End Sub
で正常動作で文字が配置されました。 (コマンドボタンは、コントロールツールボックスのコマンドボタンです)
ichinose
ichinoseさん、ありがとうございます。
ActiveXControlとシートの相性が悪い、ということを覚えておきます。 何かのトラブルのとき、この相性の悪さかも知れない、ということに思い至れば 解決に近づけることもあろうと思います。
>因みにシートにコマンドバー「図形描画」にあるテキストボックスでは、 …… >で正常動作で文字が配置されました。
いろいろ奥が深いですね。勉強になります。
(とんとん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.