Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10317 / 13644 ツリー ←次へ | 前へ→

【22487】グローバル変数がクリアされてしまいます 困ってます 05/2/22(火) 20:08 質問[未読]
【22498】Re:グローバル変数がクリアされてしまいます kazu 05/2/22(火) 22:34 発言[未読]
【22505】Re:グローバル変数がクリアされてしまいます ichinose 05/2/23(水) 0:02 発言[未読]
【22511】Re:グローバル変数がクリアされてしまい... 困ってます 05/2/23(水) 9:02 お礼[未読]

【22487】グローバル変数がクリアされてしまいます
質問  困ってます  - 05/2/22(火) 20:08 -

引用なし
パスワード
   どなたかご存知の方、教えてください。

2つのExcelファイル(AからBを呼び出すとします)があります。
呼出し元のAには、グローバル変数があります。
AからBのファイルを呼び出して「ある処理」を行い、Bを終了すると
なぜかAのグローバル変数の値がクリアされています。

「ある処理」というのは、Bを起動する際フォームを開きます。
そこでフォームをキャンセルすると、Aのグローバル変数が
クリアされてしまうのです。

ちなみに、フォームのキャンセル処理(キャンセルボタンを
押したら)は
 Unload Me
 ThisWorkBook.Close False
と書かれています。

あと、Bのファイル内でもグローバル変数が宣言されて
いて、(偶然?)Aで使用しているのと同じ変数名です。
このへんも関係あるのでしょうか。。。

初歩的な質問なのかもしれませんが、よろしくお願いします。

【22498】Re:グローバル変数がクリアされてしまい...
発言  kazu  - 05/2/22(火) 22:34 -

引用なし
パスワード
   ▼困ってます さん:

こんばんは。

Bを起動する際フォームを開きます。
このフォームというのは、Aに存在するUSER FORMですか?
Bに存在するFORMでしょうか?

感覚的に、Bを起動する際というところからAにあるのかなぁ・・・と思ったのですがどうでしょう?


ちなみに、フォームのキャンセル処理(キャンセルボタンを
押したら)は
 Unload Me
 ThisWorkBook.Close False
と書かれています。

仮に、AにFORMがあるとした場合、ThisWorkBook.Close した時点で変数も初期化される様に感じますが・・・。

いかがでしょうか?

【22505】Re:グローバル変数がクリアされてしまい...
発言  ichinose  - 05/2/23(水) 0:02 -

引用なし
パスワード
   ▼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で確認しました。

【22511】Re:グローバル変数がクリアされてしまい...
お礼  困ってます  - 05/2/23(水) 9:02 -

引用なし
パスワード
   ★ichinose さん
★kazu さん

早速のお返事ありがとうございます。

自分自身、原因の検討がついていないために
抽象的な表現しかできなかったにも関わらず、
いろいろ教えてくださってありがとうございます。

2つのBookとFormの状態はichinoseさんの
おっしゃっている通りです。
呼び出される方のExcelをOpenする際に、その
中のUserFormを開いています。

ichinoseさんの書いて下さった内容を読み
直して、確認してみようと思っています。

もう少し次回は具体的に質問させてください。
確認結果は数日中にまた投稿します!

本当にありがとうございますm(__)m

10317 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free