2012-04-02 21 views
3

ユーザーが3つのフィールドに入力する必要があるユーザーフォームを作成しました。マクロは、UserForm_Initialize()イベントでこれらのフィールドの値を自動検出し、見つかった値を3つのフィールドに表示しますが、ユーザーはそれらを変更できます。ただし、自動検出には数秒かかり、ユーザーフォームの表示が遅れます。私は、自動検出プロシージャの前にフィールドを空白で表示するUserFormをしたいと思います。そして、自動検出プロシージャがフィールドを自動的に埋めるようにしてください。これを行う最善の方法は何でしょうか?ユーザーフォームを非モーダルにすると、ユーザーの入力を待たずにマクロが実行されるため、問題があります。私は "自動検出"ボタンを持っていたくない:これは自動的に行われなければならない。ユーザーフォームが描画された後に自動的にコードを実行します。

答えて

9

Initialize() :)

Private Sub UserForm_Activate() 

End Sub 

フォロー

感謝の代わりにActivate()イベントを使用してください!それは動作しますが、バグがあるようです。マクロが完了するまで、ダイアログはすべて白く描画されます。スクリーンショット

いいえこれを試してみてください:)バグではありません(ダイアログが灰色でなければなりません)。以下に示すようにDoeventsを追加します。

Private Sub UserForm_Activate() 
    UserForm1.ProgressBar1.Value = 0 
    starttime = Timer 
    While Timer - starttime < 1 
     UserForm1.ProgressBar1.Value = (Timer - starttime) * 100 
     DoEvents 
    Wend 
End Sub 

HTH

シド

+0

ありがとう!それは動作しますが、バグがあるようです。マクロが完了するまで、ダイアログはすべて白く描画されます。 [screenshot](http://i.imgur.com/DbN70.jpg)(ダイアログは灰色でなければなりません)。 – Cutter

+0

使用しているコードを表示してください。 –

+0

[Pastebin](http://pastebin.com/aEkKPbCN)(コメントにコードを投稿する方法を理解できませんでした)これは現時点でのテスト用です。 – Cutter

0

私はタイマーを使用することをお勧めします。入力フィールドが無効で空の状態でフォームを開き、タイマーを数百ミリ秒以内に起動するように設定します。これにより、フォームがすぐに表示されるはずです。タイマーのティックイベント内で自動検出を行い(最初にタイマーを無効にする)、フィールドを有効にして検出された値を入力します。

0

これを行うための簡単な方法があります...あなたのユーザーフォームに

1)あなたが希望するマクロを実行します新しい「コマンドボタン」を作成トリガーする。受信します

2)これは、「目に見えない」コマンドボタンを作成します...ボタンは「のTabIndex」パラメータが0であることを確認してください)の高さと

3~0ボタンの幅を設定します。フォームが開くとすぐにフォーカスします。どのように動作する「Application.SendKeys 『〜』」

...

コマンドボタン作成 - ユーザーフォームがラインに入る「ショーは」ことがすぐにコマンドの前に呼び出すルーチンでは

4)、 in(1)は、他のwxceptと同じように有効なコントロールであり、マウスボタンで表示またはクリックすることはできません。 'SendKeys'コマンドは、キーボードバッファに保存されている左マウスのキーのクリックを複製し、フォームが読み込まれるまで表示します。これは、マウスのクリックとまったく同じ効果があり、必要なマクロを実行します。

複数の場所からマクロを呼び出していて、呼び出し元に応じて異なるアクションを実行する場合は、複数の「不可視」ボタンを追加し、その前に「{Tab}」を追加することができます"〜"文字を使用して、使用可能なコントロールにフォーカスを移動します。例えば'Application.SendKeys "{Tab} {Tab}〜"' 'は、' TabIndex 'パラメータを1に設定してボタンをアクティブにします。 'TabIndex'パラメータは4などに設定されます。

RF

関連する問題