別フォームの呼び出しでエラーが発生する問題の解決方法

このQ&Aのポイント
  • VB6.0で別フォームを呼び出す際に発生するエラーを解決する方法を紹介します。
  • form2が表示されずにメッセージボックスだけが表示される問題の解決方法を説明します。
  • Call FORM.Showがエラーを引き起こす場合の対処法と、form1とform2のコードの順番について解説します。
回答を見る
  • ベストアンサー

別フォームの呼び出し

6.0でやってます。 form1からform2を呼び出す時、Command1_Clickの処理内で Set FORM = New form2 Call FORM.Show と書いて、form2が呼び出されたらYesNoメッセージボックスを表示し、 Yesを押したらform1のPublicプロシージャに飛んでからform2をUnloadし、Noだったらform2をUnloadするプログラムを作りたいのですが、クリックするとform2が表示されずに、メッセージボックスだけが表示されて、YesNoを選択した後でform2が表示されてしまいます。 それに、Call FORM.Showの処理に行くと、"既にアンロードされています"といったエラーが出ます。 書く順番がおかしいのでしょうか? *****form1のコード******* Private Sub Command1_Click() Set FORM = New form2 Call FORM.Show End Sub Public sub aaa() (処理) End Sub *****form2のコード****** Private Sub Form_Load() msg = MsgBox("戻りますか??", 4, "確認メッセージ") If msg = vbYes Then Form1.aaa Unload Me Else Unload Me End If

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.3

通常は、フォームがアクティブになることはオープン後の1回だと思います。 が、そうでない場合も想定しロード時だけ確認メッセージを表示するようにチェック。 静的変数 isActivate は 初期値=False です。 よって、フォームがロードされアクティブなれば確認メッセージを表示します。 が、この際 isActivate には True を代入しています。 当然のことですが、この値は Sub から抜け出ても保持されます。 ですから、次に 非アクティブからアクティブになって Sub がコールされても二度と問いません。 もちろん、アクティブ→非アクティブ→アクティブというフォームの制御予定がなければ冗長なコード。 Answer = Verify("戻りますか??") は、第四世代言語を模したものです。 msg = MsgBox("戻りますか??", 4, "確認メッセージ") では、他者がコードを読んだ時に直感的に理解することが困難かと思います。 この点を作法の問題として注意を喚起した次第です。 ちょっと、おせっかいでしたが、そこは還暦目前のジイ様のことです。大目に見られたし。 なお、Verify は標準モジュールに書けばいいです。

その他の回答 (2)

noname#140971
noname#140971
回答No.2

×Answer = Verify("戻りますか??", 4, "確認メッセージ") ○Answer = Verify("戻りますか??") 失礼!

noname#140971
noname#140971
回答No.1

<Form1> Option Explicit Private Sub Command1_Click()   Form2.Show End Sub Public Sub aaa()   MsgBox "aaa" End Sub <Form2> Option Explicit Private Sub Form_Activate()   Static isActivate As Boolean   Dim Answer    As Integer      If Not isActivate Then     isActivate = True     Answer = Verify("戻りますか??", 4, "確認メッセージ")     If Answer = vbYes Then       Form1.aaa       Unload Me     Else       Unload Me     End If   End If End Sub Public Function Verify(ByVal Msg As String, _             Optional ByVal DefaultButton As Integer = vbDefaultButton1) As Integer   Verify = MsgBox(Msg, vbYesNo + vbQuestion + DefaultButton, " 確認メッセージ") End Function 1、Option Explicit でコードを書くようにしたがいいです。 2、読めば判るように変数名や書き方を工夫されたがいいです。

sikimori
質問者

補足

お早い回答ありがとうございます。 少しお聞きしたいのですが、 If Not isActivate Then   isActivate = True   Answer = Verify("戻りますか??", 4, "確認メッセージ") の部分は、どういった内容の処理なのでしょうか? Verify()とは、自分で作るプロシージャでしょうか?

関連するQ&A

  • フォームのアクティブと非アクティブ表示について

    Form1からForm2を表示するという処理を以下のようにコーディングしてみました。 **Form1.frm*** Private Sub Command1_Click() Form1.Hide Form1.vbModal Form1.Show End Sub **Form2.frm*** Private Sub Command1_Click() Unlaod Me End Sub 画面にエクスプローラ等のウィンドウが表示されているときに、Form2を表示させようとすると非アクティブ状態で表示されてしまいます。 また、Form2をUnloadするとForm1が表示されるのですが、その際に、Form1のタイトルと、タスクバーに表示されているボタンが反転した後非アクティブ状態になってしまいます。 フォームは常にアクティブで表示させたいのですが、どうすればよいのでしょうか?

  • VB2010 フォームのリロード

    今までVB6.0でプログラミングをしていた者で、最近VB2010に開発環境を変えました。さっそくソフトを開発しているのですが、フォームのリロードが必要なところがあったためそこのプログラムをネットなどで参考にして書いてみたのですがどうしてもエラーがでます。 今までVB6.0ではその部分を Private Sub Command1_Click() Set Form1 = Nothing Call Unload(Me) Form1.Show End Sub と、記載していました。これをVB2010のコードに書き換えるとどのようになるのでしょうか。 ご回答よろしくお願いいたします。

  • [VB6] フォームを閉じる方法について

    お世話になります。 VB6で別フォームを起動する際の親フォームの閉じ方について 質問させてください。 呼び出し元フォームからShowメソッドで別フォームを起動すると、 呼び出し先のフォームでマウスのカーソルが砂時計表示になってしまいます。 (呼び出し元のフォームはUnload Meで閉じています。) [Form1の処理] Private Sub Button1_Click() Form2.Show Unload Me End Sub ※Form1は呼び出し元。Form2は呼び出し先。 原因について、どなたかご存知の方がいらっしゃいましたら、 ご教授願えますか?

  • Picture1.Printとしてもpicture1には何も表示されません

    Private Sub Form_Load() Call kansu End sub --------------------------- Private Sub kansu() a="文字" Picture1.Print a End sub --------------------------- のように、pictureコントロールに 文字を入れる処理をする関数を呼んでいるのですが、 Formが表示されてもpicture1には何も表示されません。 Msgboxを入れておくとメッセージボックスが出るので 呼び出されてはいるようなのです。 この関数をCommand1_Click()などから呼ぶとpicture1コントロールに ちゃんと表示されます。 どうすればよいのでしょうか?

  • 【VB6.0】 あるフォームから他のフォームへ値を受け渡したい

    タイトルの通り、あるフォームから他のフォームに値の受け渡しを行いたいのですが、どのようにしたらよいのでしょうか?? 以下のようなコードできんのかなぁ~~って、やったみだけど、 むりでした。。サンプルコード内でいうParamsのような値を 受け渡しさせたいのですが・・・。ご存知の方、申し訳ないですが 教えて頂けると非常にありがたいです。それと、、私はVB初心者です。 ---FormA--- Public Params as new Params Private sub Command1_Click() Call Me.Hide FormB.Show vbModeless, Me End sub ---FormB--- Private Sub Form_Load() 'Owner.Paramsのような形で参照できるかと思ったができませんでした。 End sub

  • VB2005 フォームの再表示

    プログラムを終了する時、“プログラムを終了しますか?”というメッセージを表示し“はい”ボタンを押すとプログラムを終了、“いいえ”ボタンを押すとプログラムを終了しないようにしたいのですが、“いいえ”ボタンを押すとフォームが消えてしまいます。この時プログラムは終了していません。消えているフォームを再度表示したいのですが、どうしたら良いのか分かりません。Me.Show()、Me.Refresh()とかを使用しても表示されません。現在のコードを記載しますのでどなたか教えて下さい。よろしくお願いします。 Private Sub MainDisp_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed Dim resources As System.ComponentModel.ComponentResourceManager _ = New System.ComponentModel.ComponentResourceManager(GetType(MainDisp)) Dim msg As String Dim ret As String Beep() msg = My.Resources.msg001 resources.ApplyResources(msg, "msg") ret = MsgBox(msg, MsgBoxStyle.YesNo + MsgBoxStyle.Question, My.Resources.msg002) If ret = vbYes Then End Else Me.Show() Me.Refresh() End If End Sub

  • 最小化したフォームを元に戻す

    VB2005Expressにて開発を行っています。 最小化したフォームを元に戻せなくて困っています。 どなたかご存知の方がいらっしゃいましたらご教授願います。 下記の動作を実現したいと思っています。 ・Form1でボタンが押されたらForm2を表示する ・この際にForm1を最小化する ・Form2を閉じる ・この際にForm1を元に戻す(手前に表示する) 以下が作成したプログラムです。 ---モジュールにて下記を宣言 Module Module1 'オブジェクトの宣言 Public f1 As New Form1 Public f2 As New Form2 End Module ---Form1でForm2を開くボタンを押した場合の処理 Private Sub Button1_Click(ByVal sender~ 'Form2を表示 If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 End If f2.Show() 'Form1を最小化する Me.WindowState = FormWindowState.Minimized End Sub ---Form2にて閉じるボタンを押した場合 Private Sub Button4_Click(ByVal sender~ f1.WindowState = FormWindowState.Normal ↑コレで実現できるかと思ったのですが、最小化されたままです・・・ End Sub

  • ユーザーフォームの呼び出しでエラー

    環境:WindowsXP,Excel2000 入力ファイルを1行ずつ読み込んで ある条件の場合は、“AAAForm”を呼び出します。 ----- Public Sub 処理()   ~(略)~   ' ファイルのEOF(End of File)まで繰り返す   Do Until EOF(intFF)     ~(略)~     Load AAAForm     AAAForm.Show     Unload AAAForm     ~(略)~   Loop   ~(略)~ End Sub ----- 1回目は成功して、 制御がフォームに移ります。 OKボタンを押したら ----- Private Sub OK_Click()   Me.Hide End Sub ----- として、制御が“処理()”に戻り “AAAForm”はメモリから削除されます。 入力ファイルから入力レコードを繰り返し読み込んで また、同条件の場合は、“AAAForm”を呼び出したいのですが、 2回目の“AAAForm”の呼び出しは失敗して“処理()”の 下記の位置で止まります。     load AAAForm エラーメッセージは下記の通り ----- 実行時エラー '5': プロシージャの呼び出し、または引数が不正です。 ----- 考えられる原因が何か、お解かりになる方はご教授ください。 お願いします。

  • フォームを表示してからメッセージボックスを表示する

    メッセージボックスが表示される前に、フォームを表示させたいです。アクセスです。 ナビゲーションウインドウからフォームをダブルクリックしてフォームを開くのですが、 今のままだとメッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを表示してからメッセージボックスを表示するにはどうすればいいでしょう? Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" End Sub だと、先ほど述べたように、メッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを開いたときのイベントは複数あるようで、 Private Sub Form_Activate() MsgBox "Form_Activate" Debug.Print "Form_Activate" End Sub Private Sub Form_Current() MsgBox "Form_Current" Debug.Print "Form_Current" End Sub Private Sub Form_GotFocus() MsgBox "Form_GotFocus" Debug.Print "Form_GotFocus" End Sub Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" Debug.Print "Form_Open" End Sub Private Sub Form_Load() MsgBox "Form_Load" Debug.Print "Form_Load" End Sub をすると、 ・Form_Load ・Form_Activate ・Form_GotFocus ・Form_Open ・Form_Current の順に開きますが、やはりフォームが最後に表示されてしまいます。 どうにかして先にフォームを表示させる方法はないでしょうか? ご回答よろしくお願いします。

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

専門家に質問してみよう