Excel VBA質問箱 IV

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

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


9307 / 13646 ツリー ←次へ | 前へ→

【28027】「呼び出し先は消失し、利用できません。... わさび 05/8/26(金) 19:46 質問[未読]
【28085】Re:「呼び出し先は消失し、利用できません... Hirofumi 05/8/28(日) 13:25 発言[未読]
【28098】Re:「呼び出し先は消失し、利用できません... Hirofumi 05/8/28(日) 17:58 回答[未読]
【28108】Re:「呼び出し先は消失し、利用できません... わさび 05/8/29(月) 10:38 お礼[未読]
【28135】Re:「呼び出し先は消失し、利用できません... Hirofumi 05/8/29(月) 19:25 回答[未読]
【28136】Re:「呼び出し先は消失し、利用できません... わさび 05/8/29(月) 19:30 お礼[未読]

【28027】「呼び出し先は消失し、利用できません。...
質問  わさび  - 05/8/26(金) 19:46 -

引用なし
パスワード
   根本的にわかっていないがゆえに、見当違いな考え方をしているのだと思うのですが、

----
実行時エラー '-2147418105 (80010007)':

オートメーションエラーです。
呼び出し先(サーバーアプリケーションではなく、サーバー)は消失し、利用できません。すべての接続先は無効です。呼び出しが実行されている可能性があります。
---

というエラーが出てしまい、原因がよくわかりません。
どこをどう考えればよいのか、どうかご指南ください。


<仕様>----------------------------------------------------------------
今、A,B,Cというユーザーフォームがあり、
Aにはふたつのコマンドボタンbとcがあり、
同様にBにはaとc、Cにはaとbというコマンドボタンがあります。

[Ctrl]+[Alt]+[F12]を押すと、変数MY_windowに格納されたフォームを表示します。
コマンドボタンをクリックすることでMY_windowに新たに格納、
すなわち次に表示するフォームを指示し、そのフォームを閉じます。
またフォーム右上の[×]をクリックすると、MY_windowにはそのフォームが格納され、
再び同じフォームが表示されるようにしたいです。
------------------------------------------------------------------------


<ThisBook>----------

Private Sub Workbook_Open()

  Call SCkey
  
  Set MY_window = A_window

End Sub
----------------------


<フォーム:A_window>----------

Private Sub B_dush_Click()

  Unload Me
  Set MY_window = B_window

End Sub
---

Private Sub C_dush_Click()

  Unload Me
  Set MY_window = C_window

End Sub
---

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then Set MY_window = A_window

End Sub
-------------------------------

<フォーム:B_window>----------

Private Sub A_project_Click()

  Unload Me
  Set MY_window = A_window

End Sub
---

Private Sub C_projecr_Click()

  Unload Me
  Set MY_window = C_window

End Sub
---

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then Set MY_window = B_window

End Sub
-------------------------------

<フォーム:C_window>----------

Private Sub A_cat_Click()

  Unload Me
  Set MY_window = A_window

End Sub
---

Private Sub B_cat_Click()

  Unload Me
  Set MY_window = B_window

End Sub
---

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then Set MY_window = C_window

End Sub
-------------------------------


<標準モジュール>----------

Option Explicit

  Public MY_window As Object
---  

Sub SCkey()

  Application.OnKey "%^{F12}", "MYshow"

End Sub
---

Sub MYshow()

  MY_window.Show

End Sub
---------------------------


以上になります。
フォームと、変数の有効範囲の関係が全くわかっていないのだと思いますが、
どうかよろしくお願いします。

【28085】Re:「呼び出し先は消失し、利用できませ...
発言  Hirofumi  - 05/8/28(日) 13:25 -

引用なし
パスワード
   レス付かないのでもう見て居ないかな?
やった事が無いので、少し試して見ました
多分こんな事だろう程度で申し訳有りませんが、
気が付いた事が有りましたので書いて置きます

  Set MY_window = A_window

は、A_windowがLoadされ、Object変数MY_windowに参照が代入されます
其処で、自身以外の場合は善いのですが、「UserForm_QueryClose」で
「CloseMode = vbFormControlMenu」の時、自身の参照をMY_windowに代入しても
其の後、自身がUnloadされるのでMY_windowが不定?に成るので起こると思われます
因って、「CloseMode = vbFormControlMenu」の時は、
「UserForm_QueryClose」をキャンセルし、自分自身をHideにすれば善いと思われます
以下に、修正して見たたコードを載せます

'<ThisBook>----------

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  Dim i As Long
  
  With UserForms
    For i = 0 To UserForms.Count - 1
      'コレクションから削除されるので、
      '繰り上がりの為常に.Item(0)
      Unload .Item(0)
    Next i
  End With
  
  Set MY_window = Nothing
  
End Sub

Private Sub Workbook_Open()
  
  SCkey
  
  Set MY_window = A_window

End Sub

'<フォーム:A_window>----------

Option Explicit

Private Sub B_dush_Click()

  Set MY_window = B_window
  Unload Me

End Sub

Private Sub C_dush_Click()

  Set MY_window = C_window
  Unload Me

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then
    Set MY_window = Me
    Cancel = True
    Me.Hide
  End If

End Sub

'<フォーム:B_window>----------

Option Explicit

Private Sub A_project_Click()

  Set MY_window = A_window
  Unload Me

End Sub

Private Sub C_projecr_Click()

  Set MY_window = C_window
  Unload Me

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then
    Set MY_window = Me
    Cancel = True
    Me.Hide
  End If

End Sub

'<フォーム:C_window>----------

Option Explicit

Private Sub A_cat_Click()

  Set MY_window = A_window
  Unload Me

End Sub

Private Sub B_cat_Click()

  Set MY_window = B_window
  Unload Me

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then
    Set MY_window = Me
    Cancel = True
    Me.Hide
  End If

End Sub

'<標準モジュール>----------

Option Explicit

Public MY_window As Object

Sub SCkey()

  Application.OnKey "%^{F12}", "MYshow"

End Sub

Sub MYshow()

  MY_window.Show

End Sub

【28098】Re:「呼び出し先は消失し、利用できませ...
回答  Hirofumi  - 05/8/28(日) 17:58 -

引用なし
パスワード
   難しく考えないで、この方が簡単見たい?

'<ThisBook>----------

Option Explicit

Private Sub Workbook_Open()
  
  SCkey
  
End Sub

'<フォーム:A_window>----------

Option Explicit

Private Sub B_dush_Click()

  lngSelect = 1
  Unload Me

End Sub

Private Sub C_dush_Click()

  lngSelect = 2
  Unload Me

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then
    lngSelect = 0
  End If

End Sub

'<フォーム:B_window>----------

Option Explicit

Private Sub A_project_Click()

  lngSelect = 0
  Unload Me

End Sub

Private Sub C_projecr_Click()

  lngSelect = 2
  Unload Me

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then
    lngSelect = 1
  End If

End Sub

'<フォーム:C_window>----------

Option Explicit

Private Sub A_cat_Click()

  lngSelect = 0
  Unload Me

End Sub

Private Sub B_cat_Click()

  lngSelect = 1
  Unload Me

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  If CloseMode = vbFormControlMenu Then
    lngSelect = 2
  End If

End Sub

'<標準モジュール>----------

Option Explicit

Public lngSelect As Long

Sub SCkey()

  Application.OnKey "%^{F12}", "MYshow"

End Sub

Sub MYshow()

  Select Case lngSelect
    Case 0
      A_window.Show
    Case 1
      B_window.Show
    Case 2
      C_window.Show
  End Select
      
End Sub

【28108】Re:「呼び出し先は消失し、利用できませ...
お礼  わさび  - 05/8/29(月) 10:38 -

引用なし
パスワード
   Hirofumiさん、ありがとうございます!
Hideにしてしまえばいいんだということ、
またもっともっと簡単なプログラムにすることができるということ、
目からボロボロと鱗が落ちる思いです。

ひとつ質問があります。
簡単化されたプログラムでは、
ブックオープン時に、「lngSelect = 0」を特に指定しなくても、
MsgBoxで確認したらちゃんと「lngSelect = 0」になっているのですが、
これはどこが作用しているのですか?
なんか変な質問ですみません。

【28135】Re:「呼び出し先は消失し、利用できませ...
回答  Hirofumi  - 05/8/29(月) 19:25 -

引用なし
パスワード
   >ひとつ質問があります。
>簡単化されたプログラムでは、
>ブックオープン時に、「lngSelect = 0」を特に指定しなくても、
>MsgBoxで確認したらちゃんと「lngSelect = 0」になっているのですが、
>これはどこが作用しているのですか?
>なんか変な質問ですみません。

変数は、変数を宣言し、使う時点で、各変数型に拠り初期値が入ります
整数型(Long型、Integer型)は、初期値が0
Variant型はEmpty、String型は""だったと思います
因って、今回の場合、lngSelectは長整数(Long型)なので初期値は0ですので、
特に0を代入していません
また、今回の場合、小さな利点ですが、VBAがリセット(変数もリセット)されても
初期値が0ですので、エラーに成らずに続けられると思います

【28136】Re:「呼び出し先は消失し、利用できませ...
お礼  わさび  - 05/8/29(月) 19:30 -

引用なし
パスワード
   なるほど、そうだったんですか。
またひとつ知識が増えてうれしいです。
とても有益な情報をありがとうございました。
今後も精進してまいりますが、
また何かありましたら、何卒よろしくお願い致します。

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