[[20081212225700]] 『時間をおいて表示したい』(とんとん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『時間をおいて表示したい』(とんとん)

 シートにテキストボックスを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.