アプリ版:「スタンプのみでお礼する」機能のリリースについて

ユーザフォーム FormA を表示するのに FormA.Show で行っています。
UserForm_Initialize()は、その前に実行されると思っていましたが、 FormAが表示されているかどうかを確認する下記のステートメントでも実行されるようです。
 If (FormA.Visible = True) Then …
これは、仕様でしょうか?
また、UserForm_Initialize() の実行を回避して、ユーザフォームの表示確認を行う方法があればご教示お願いします。

A 回答 (3件)

No2です。



>FormAはModelessで表示しています。
であれば、
>If (FormA.Visible = True) Then
によって、表示状態であれば初期状態に戻ることはないはずです。

>Initialize() の実行は、Visible属性の参照では実行されないものとロジックを
>組み立てていたので、その変更を余儀なくされていて~~
ですので、ロジック自体には問題ないと思いますし、フォーム上のコントロールの値を取得することも可能です。

ただし、No2にも記したようにそのタイミングが難しいと思います。
勝手に、想像するところでは、ユーザが入力等の操作をする前に値を取得しようとしていませんか?
そのあたりの制御をどのようになさっているのか不明ですけれど・・
    • good
    • 0

こんにちは



試してみましたが、フォームが非表示の場合には、Visible属性を参照すると Initialize() が実行されているようです。

しかしながら、
>If (FormA.Visible = True) Then
で確認する必要があるということは、フォームをModelessで表示しているということですよね?
その場合であれば(表示されていれば) Initialize() は実行されないようです。
ですので、ご質問のケースの場合「表示されていれば」の処理のようですので、問題にはならないと想像しますけれど・・?

一方で、Modeless表示の場合は、VBAはそのまま処理を続けますので、普通にベタに記述しているのならば、フォーム内の値を取ろうとしても、表示した際の初期値が返ってくることになるでしょう。

ユーザの入力を検知する等の処理を行いたいのであれば、フォームのプロシージャに記載するか、あるいは入力が済むのを待ってから実行を継続するなり、別の処理として実行するなりにしておかないと入力値を取得するのは難しいと思われます。
    • good
    • 1
この回答へのお礼

サポートありがとうございます。
FormAはModelessで表示しています。
Initialize() の実行は、Visible属性の参照では実行されないものとロジックを組み立てていたので、その変更を余儀なくされていて、質問さてている頂いている次第です。
よろしくお願いします。

お礼日時:2023/06/16 00:19

こんにちは


仕様のようですが・・・素朴な疑問として
FormA.Visible が通ると言う事は 対象のユーザーフォームがあるブックで実行すると言う事でしょうか、FormA.Showで表示されている時にFormAのコントロールから実行するのかな・・・そんな事ないですよね

何処から If (FormA.Visible = True) Then を実行するのかしら・・

実行トリガーはともかくとして 例えば 同じブックから実行するのなら
Dim fm As UserForm
For Each fm In UserForms
If TypeOf fm Is FormA Then
MsgBox "表示済み"
End If
Next
こんなので取得できそうかな
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
本件、同じブックのことです。
示して頂きましたフォームの有無判定の方法は、使用させて頂きたいと思います。
ありがとうございます。

お礼日時:2023/06/16 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています