|
▼kazu さん、▼困ってます さん、こんばんは。
>
>こんばんは。
>
>Bを起動する際フォームを開きます。
>このフォームというのは、Aに存在するUSER FORMですか?
>Bに存在するFORMでしょうか?
>
>感覚的に、Bを起動する際というところからAにあるのかなぁ・・・と思ったのですがどうでしょう?
私は、Userformは、Bにあるとおもったのですが・・・・。
つまり、Bを呼び出した後、RunメッソドかWorkbook_Openイベントで
ブックBのUserformを表示させていると言う事ですが・・・・。
Public変数が初期化されるというのは問題現象ですから、
Excelのバージョンや再現性のあるコードを載せて下さいネ!!
特に不具合の場合は、ExcelバージョンやWindowsのバージョン情報は大事ですよ!!
で、まず再現コードです。
ブックAに該当するものをCallmain.xlsとします。
ブックBに該当するものをtestcaller.xlsとします。
二つは、同じフォルダ内に保存します。
callmain.xlsは、コードだけ。
標準モジュールに
'========================================================
Public aaa As Long
'========================================================
Sub test()
aaa = 12121
Set bk = Workbooks.Open(ThisWorkbook.Path & "\testcaller.xls")
Application.Run "testcaller.xls!main"
MsgBox aaa
End Sub
'==============================================================
Sub test2()
MsgBox aaa
End Sub
次にtestcaller.xlsについてです。
このブックには、
ユーザーフォームを作成します。(Userform1)
コマンドボタンをひとつ配置します(Commandbutton1)。
標準モジュールに
'=======================================================
Public aaa
Public Sub main()
aaa = 1
UserForm1.Show
End Sub
Userform1のモジュールに
'===========================
Private Sub CommandButton1_Click()
Unload Me
ThisWorkbook.Close False
End Sub
というようにコマンドボタンのクリックイベントだけ。
本当は、ユーザーフォームも関係ないんですが・・・。
これで一度、testcaller.xlsを閉じた後に
callmain.xlsのtestを実行してみて下さい。
aaaは、初期化されてしまいます。
試して見ればわかると思いますが、
testプロシジャーの
Msgbox aaa
を実行していません。
たぶん、testcaller.xlsが閉じてしまっているので
戻ってこれないのではないか?と推測しています。
よって、エラーにはならないけど、エラー発生時と同様に変数が初期化されてしまう
↑この辺りは、全部推測ですが・・・。
それで、callmain.xlsのコード内で開いたら、閉じるのもこのブック内で行ってみました。
callmain.xlsの標準モジュールを以下に変更
'=======================================================
Public aaa As Long
'==========================================================
Sub test()
aaa = 12121
Set bk = Workbooks.Open(ThisWorkbook.Path & "\testcaller.xls")
Application.Run "testcaller.xls!main"
doevents 'これ入れないとVBEを開いた状態だとI/Oエラーが発生したので
'原因は不明です
bk.Close False
MsgBox aaa
End Sub
'=============================================================
Sub testtest()
MsgBox aaa
End Sub
次にtestcaller.xlsの標準モジュールを
'===========================================================
Public aaa
'============================================================
Public Sub main()
aaa = 1
UserForm1.Show
End Sub
userform1のモジュールを
'=========================================================
Private Sub CommandButton1_Click()
aaa = 1
Unload Me
End Sub
と変更して同じようにcallmain.xlsのtestを実行してみて下さい。
今度は、値が保持されていると思います。
確認してみて下さい。
以上は、Win98、Excel2000 SP-3で確認しました。
|
|