1

SolidWorks から VBA マクロを実行しています。このフォームは、2 種類のドキュメントの入力としても機能します。サブルーチンでは、開いているドキュメントの種類に応じてUserForm.InitializeUserForm の名前を変更しています。Captionただし、これを行うたびに、プログラムが再UserForm.Initialize実行され、すべてが完了すると、終了した場所から続行され、事実上 2 回実行されます。

この奇妙な動作を回避する方法を知っている人はいますか? コマンドを独自の Sub に入れてみましたが、結果は同じです。FormName.Caption

どうもありがとう。

4

2 に答える 2

5

問題を再現できません。また、SolidWorks が何かもわかりません。それが何か関係している可能性があります。おそらく、Initialize が 2 回呼び出されていることを示す作成例を投稿できます。

私の推測では、自動インスタンス化変数に関連していると思います。UserForm1 を使用すると、UserForm1 とも呼ばれるオブジェクトを指す UserForm1 というオブジェクト変数をインスタンス化します。Dim ステートメントで New キーワードを使用するのと似ています。UserForm1 (変数) を定義したことはありませんが、VBA は定義しており、初めて使用すると、自動的にインスタンス化されます。

ユーザー フォーム クラス モジュール内で作業する場合は、Me キーワードを使用するようにしてください (ユーザー フォームは、ユーザー インターフェイス要素があることを除いて、他のオブジェクトと同様のクラスです)。Initialize イベントで、次のように言います。

Me.Caption = "blah"

それ以外の

UserForm1.Caption = "blah"

Caption プロパティを変更するまでに、「私は実際のインスタンスを指している」と言うように設定されたフラグが設定されていない可能性があります (私が証明できなかった理論にすぎません)。自動インスタンス化変数 UserForm1 を使用すると、別のインスタンス化が強制されます。

さらに良いことに、自動インスタンス化変数は便利ですが使用しないでください (また、Dim ステートメントで New キーワードを使用しないでください)。変数をいつ作成および破棄するかを制御できます。これはベスト プラクティスです。標準モジュールでこのようなもの

Sub uftst()

    Dim uf As UserForm1

    Set uf = New UserForm1 'you control instantiation here

    'Now you can change properties before you show it
    uf.Caption = "blech"
    uf.Show

    Set uf = Nothing 'overkill, but you control destruction here

End Sub

ShowModal プロパティが False に設定されている場合、コードは引き続き実行されるため、モードレスで実行している場合は変数を破棄しないでください。

于 2012-07-25T17:53:33.957 に答える
1

Dick が示唆したように、Userform1.caption の代わりに me.caption を使用することで、この動作を停止できるはずです。

興味のある方のために、問題を再現する方法を次に示します。

ユーザーフォーム (Userform1) を作成し、ShowModal を false に設定していることを確認してください。そうしないと、これが表示されません。

モジュールに以下を追加します。

Option Explicit
Sub ShowUserForm()
    Dim uf As UserForm1
    Set uf = New UserForm1
End Sub

UserForm1 に次のコードをリストします。

Option Explicit
Private Sub UserForm_Initialize()
    UserForm1.Caption = "I'm UserForm1!" 'This will call the Initialize method of Userform1 not Me.
    Me.Caption = "I'm Me!" 
    Me.Show
End Sub

ShowUserForm を実行します。これで、キャプションが異なる 2 つのユーザーフォームが作成されました。

ちなみに、私が表示したような Initialize メソッドがある場合Set uf = Nothing、ShowUserForm サブシステムに追加すると、実際にはどちらのフォームも閉じることができません。

于 2012-07-26T03:37:20.793 に答える