フォームInitialize時のUnloadについて

解決


mm  2005-03-10 04:59:47  No: 120145

VBAでフォーム起動時に「ある条件の時はフォームを表示しないで閉じる。」
としたいので"UserForm_Initialize"イベント内に"Unload Me"を記述したの
ですが、その条件の時に"Unload Me"した後"UserForm_Initialize"イベント
の"END  Sub"のところで、「オブジェクト変数または With ブロック変数が
設定されていません。(Error 91)」というエラーが出ます。
フォームの呼び出しをShowメソッドではなく、Loadステートメントで読み込
んでも同じエラーが出ます。

Initialize時にはまだロードされていないからなのかな?とも思うのですが、
"Unload Me"は通ってその後の"END  Sub"でエラーになるというのはどういう
ことでしょうか?

また、そういう場合はどのように書けばよいのでしょうか?
宜しくお願い致します。

'ユーザフォームの呼び出し
Private Sub CommandButton1_Click()
    UserForm1.Show
End Sub

'ユーザフォーム起動時の処理
Private Sub UserForm_Initialize()
    If MsgBox("終了しますか?", vbYesNo) = vbYes Then
        Unload Me
    End If
End Sub


さるべーじ  2005-03-10 05:43:57  No: 120146

こーいぅのは、呼ばれる側でなく呼ぶ側で確認するのが普通です。ので、

'ユーザフォームの呼び出し
Private Sub CommandButton1_Click()
    If MsgBox("起動しますか?", vbYesNo) = vbYes Then
        UserForm1.Show
    End If
End Sub

で済むのではないかと思います。


mm  2005-03-10 06:17:18  No: 120147

さるべーじさんレスありがとうございます。
通常は呼ぶ側でチェックするのですね。
実は"Unload Me"する「ある条件」というのが上記のようなものではなく、
フォームのテキストボックスと関連があったため呼ばれる側で処理しよう
と思っていました。(その場合でも呼ぶ側でのチェックは可能のようでした)

それと、過去ログに似たようなものがありました。
http://madia.world.coocan.jp/vb/vb_bbs2/200303_03030005.html

FormのLoadイベント内でUnload Meは出来ないのですね。。
ということで、フォームのLoadをした後にShowメソッドでフォームを呼び
出して"Unload Me"したところ期待していた動きになりました。
このような書き方はあまりしないでしょうか・・

ユーザフォームの呼び出し
Private Sub CommandButton1_Click()
    Load UserForm1
    UserForm1.Show
End Sub

'ユーザフォームがアクティブになった時の処理
Private Sub UserForm_Activate()    
    If MsgBox("終了しますか?", vbYesNo) = vbYes Then
        Unload Me
    End If
End Sub


さるべーじ  2005-03-10 07:25:06  No: 120148

> フォームのテキストボックスと関連があったため

TextBoxの色や大きさに関連があるとは考えにくいので、
格納されるデータと関連があるのでしょうか。
であれば、「そのFormでなければ格納されるデータがわからない」ということは
ありえませんので、あらかじめそのデータのチェックは可能なはずです。

もしその「データを確定するロジック」がFormモジュールの中にあるのであれば、
呼び元からも呼び出し元からもCallできるような関数として独立させましょう。

時間のかかる処理であれば、FormのLoadの前にデータを用意し、
内容を検証し、Formを起動する条件を満たしたらそのデータをFormに
引き渡すことで処理の重複は回避できます。

ActivateイベントでLoad直後に実行させたい処理を行う手法は
あちこちで目にしますが、Windowsの特性などから必ずしもイベントが発生しない
場合があった自分の過去の経験から、私としてはお勧めはしません。


mm  2005-03-10 22:45:03  No: 120149

さるべーじさん、丁寧にご説明頂きありがとうございました。
私の環境でもActivateイベントが発生しない場合がありました。。
おっしゃるように、フォームLoad前にデータをチェックするようにしました。

ありがとうございました。


mm  2005-03-10 22:45:49  No: 120150

解決しました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加