• ベストアンサー

Visual BasicのUserFormが閉じづらい

Excel2000,VisualBasicのUserFormの閉じ方で困っています。 マクロ起動中にUserForm1.Show,UserForm1.Hide,UserForm2.Show,UserForm2.Hideを 何度も繰り返していると、同じUserFormが重複してメモリーに残っている 状態で、閉じるために「×」を何度もクリックしています。 作業を長時間するとフリーズ状態もしくはエラーになります。 尚、Load.Unloadでも同じ結果になりました。 どなたか解決方法を教えてください、宜しくお願いします。

  • Stoki
  • お礼率50% (2/4)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 このメッセージは、論理的には、本来は、0 で、1 というカウントが出れば、別の常駐しているUserForm が終了になるので、都合、+1 で、  i = UserForm.Count + 1  ということになりますが、そのままにしておきます。 UserForm モジュールに入れてください。 メッセージは分かりやすくするためで、本来は必要ありません。 ------------------------------------------ Private Sub UserForm_Terminate()   Dim uf As UserForm   Dim i As Integer   i = UserForms.Count   MsgBox UserForms.Count & "個のユーザーフォームを終了させます。", 64   For Each uf In UserForms     Unload uf   Next uf End Sub

Stoki
質問者

補足

ご丁寧に有難うございます。 とても解りやすく,説明頂き助かりました。 早速、使わせて頂きます。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

こんにちは XL2000で諸々テストしてみましたが UserForm1.Show vbModeless じゃないと、おかしなことになりますね 仮に UserForm1.Show vbModal ' (またはプロパティーウィンドウのShowModalがTrueの状態で ' UserForm1.Show ) UserForm1.Hide の2行をループさせると、 .Hide の行頭にブレイクポイントを置いたが如く UserFormの×ボタンを待ち続けることになるようです。 つまり、ループの回数だけ×ボタンを押さないと抜けられない。 という話ではないのでしょうか .Show vbModelessにしても.Show .Hideだけの処理で、 ループが深いと描画が追い付かず (環境にもよって)何かとトラブルが起こるようです Tempフォルダの掃除や再起動などしておいた方が良いかも知れませんね 具体的に何か処理するという話ではなく 実験的な話であろうと解して書きました

Stoki
質問者

お礼

ご返事早速有難うございました。 ご指摘の通りの状態です、今回はForm1.Hideにせずに、Form2.Show をループすることでトラブル回避することにします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#2 の補足訂正 分かりにくいので、訂正しておきます。少しは、意味が通るようになったと思います。 # このメッセージは、論理的には、本来は、0 で、1 というカウントが出れば、別の常駐しているUserForm が終了になるので、都合、+1 で、     ↓ --------------------- 赤い「×」をクリックすると、以下のプログラムのMsgBox の戻り値のメッセージで、「0」 となれば、現在のUserForm のみが終わる状態を表し、「1」 が出ると、常駐状態になっている、他のUserForm を終わらせようとしています。したがって、本来のUserForm の数は、  i = UserForm.Count + 1  ということになりますが、そのままにしておきます。 --------------------- ということです。

回答No.1

ユーザーフォームをshowする時、どうやってshowしてますか? UserForm1.Show みたいな方法なら、既に開いれいれば、重複して開く事は無いと思います。 ただ、 Dim uf As New UserForm1 uf.Show みたいな方法なら、毎回新しいUserForm1を作って、それをshowします。

Stoki
質問者

お礼

ご回答の方法は使っていません、ただ UserForm1.Show UserForm1.Hide等の単純繰り返しを Do Until~Loop内で開いていますが、それが原因でしょうか? Hide にしてもメモリーが開放されないとも聞きましたが、 とにかく、早速のご返事有難うございました。

関連するQ&A

  • エクセルのマクロでUserForm1を作って下記のようなコードを実行す

    エクセルのマクロでUserForm1を作って下記のようなコードを実行すると UserForm1を一瞬だけ表示して消えるのかと思ったのですが、表示されたまま消えません。 Unload UserForm1のところを UserForm1.Hideにしても同じです。 表示されたUserForm1を閉じるにはどうしたらよいですか。 Sub test() UserForm1.Show Unload UserForm1 End Sub

  • 2つのユーザーフォームの表示切替(Excel2002VBA)

    Excel2002VBAを使用しています。 UserForm1 に CommandButton1 を配置したものと UserForm2 に CommandButton2 を配置したもの があります。 UserForm1が表示されている時、CommandButton1 を クリックすると、UserForm2 が表示され UserForm1 が非表示になり、 UserForm2 が表示されている時  CommandButton2 をクリックすると UserForm1 が 表示され UserForm2 が非表示になる というように 画面上にどちらか一方だけユーザーフォームを表示 させたいのですが上手くいきません。 CommandButton1 の Clickイベントに UserForm2.show vbmodeless Unload UserForm1 CommandButton2 の Clickイベントに UserForm1.show vbmodeless Unload UserForm2 と記述したのですが、実行すると、 ”このオブジェクトは、ロードまたはアンロード することはできません。”とエラー表示が出てき ます。 何とぞご教授よろしくお願いいたします。

  • Powerpoint 2003 でのVBA UserFormの表示方法

    いつもPowerpoint用のマクロを一つのファイルにまとめ、ツールバーに実行用のボタンを追加して使用しています。マクロファイルは閉じたままにしています。 このたびUserFormをModalからModelessに修正し、マクロを実行しましたらFormが表示されませんでした。マクロファイルを開いたまま実行するときちんと表示されます。また、UserFormがModalの時はマクロファイルを閉じたままでもきちんと表示されていました。 マクロが保存されているファイルを閉じたままでもModelessでUserFormを表示する方法がありましたら教えてください。 ちなみに、現在はこのようなスクリプトになっています。 Load frmXXX frmXXX.Show vbModeless (frmXXX.Showだけの時はきちんと表示されていました) ご回答お待ちしております。

  • Personal.xlsでUserFormを開く

    Personal.xlsに登録したマクロでBookのUserFormを開くには? 環境:EXCEL2000 Windows7 Book1.xlsにUserForm1を作りました。 Book2.xlsにもUserForm1を作りました。 (Book1のUserForm1とBook2のUserForm1は異なるForm) Personal.xlsに次のSubを追加しました Public Sub DispForm1() ActiveWorkbook.UserForm1.Show vbModeless End Sub ツールバーに釦を追加しマクロ「DispForm1」を登録しました やりたい事 (1)Book1を開き釦を押すとBook1のUserForm1を表示する (2)Book2を開き釦を押すとBook2のUserForm1を表示する 問題点 釦を押すと 「オブジェクトは、このプロパティまたはメソッドをサポートしていません」 のエラーがでる アドバイスよろしくお願いいたします。

  • エクセルのユーザーフォームでご教授ください

    マクロの知識はほぼなく、調べながらエクセルの入力用のユーザーフォームを作りましたが、うまく作動しません。 UserForm1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() Me.Show End Sub Private Sub Button_cxl_Click() Me.Hide End Sub Private Sub ok_Click() Dim RowNum As Long Dim Ctrl As Control RowNum = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(RowNum, 1).Value = Me.txt_date Cells(RowNum, 2).Value = Me.txt_guest Cells(RowNum, 3).Value = Me.txt_person Cells(RowNum, 4).Value = Me.txt_begin Cells(RowNum, 5).Value = Me.txt_finish For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" RowNum = 0 End If Next Ctrl Me.Hide ReleaseCapture UserForm2.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm2 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() End Sub Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub Private Sub ButtonNext_Click() Unload Me ReleaseCapture UserForm1.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ Module1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Sub ユーザーフォーム() UserForm1.Show End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm1を開き、Button_cxlで閉じず、もう一度Button_cxlをクリックで閉じる。 UserForm1を開き、Button_okでUserForm2を出し、ButtonEndをクリックでUserForm1にもどる(1と2を数度行き来しても同じ) UserForm1を開き、Button_okでUserForm2を出しButtonNextをクリックでUserForm1にもどりButton_cxlをクリックで閉じず、もう一度クリックしても閉じず、三回目で閉じる。 現状、エクセルを開いた直後のみで発生してます。 一度ユーザーフォームを出し、閉じたあとは意図通り動き、再度エクセルを開くまで発生しません。 ちなみにUserForm2の Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub 部分の、UserForm1.HideをUnload UserForm1にすると、「オブジェクト変数または With ブロック変数が設定されていません」と出てデバックでModule1の UserForm1.Show が黄色になります。 どこが悪いか教えてください。

  • エクセル UserForm 呼び出しでフリーズしてしまいます

    エクセルでタイムカード?退勤時間管理表を作成しています。 UserFormの使用は初めてです・・・ UserForm1が「出勤」「退勤」「休憩入り・戻り」などをボタンで作って入力させるのはうまくいきました。 ところが、UserForm2に、各従業員のタイムカード(出勤退勤休憩を記録しているシート部分)を表示したくなったのでUserForm2に、ListBox1を貼り付けてマクロでRowSourceを書き換えて表示させたかったのですが・・・ 作成中はうまく表示しているのですが、実際にUserForm2.Showとやって呼び出すとUserForm2は表示されるのですが、エクセルすべてが全く反応なくなってしまいます。UserForm2も閉じれません。 ListBox1でいじったプロパティは、RowSourceとColumnCountのみです。 RowSourceは、'名 前'!A1:H32 ColumnCountは、8 UserForm2には、ListBox1しかありません。 UserForm1にも、ListBoxはあるのですが全く問題なしです。(1行のみのものですが) 時計のリアルタイム表示マクロやUserFormに最小化ボタンを付けるマクロを付けていたのでそれが原因かとも思い削除してみたのですが、UserForm2を表示するとフリーズしてしまいます。 何が原因のでしょうか? 教えてください。よろしくお願いします。 エクセルは、2007です。

  • EXCEL2000でTextBox1にフォーカスをあてたい

    いつもお世話になります。 OSはWin XP Home EXCEL2000です。 現在以下の現象で悩んでおります。 EXCEL2000のVBAでUserform1(シート上ではない方です)を作り、そこにTextbox1(TabIndex = 0)とCommandButton1(TabIndex = 1)を配置しました。 UserFormを初回に表示した時、及びフォームの右上の「X」で閉じた後は問題ないのですが、以下のコードでUserForm1を閉じた後に再び他のマクロからUserForm1.showとやると、どこにもフォーカスがない状態でUserForm1が立ち上がります。 Private Sub CommandButton1_Click() UserForm1.TextBox1.SetFocus UserForm1.Hide End Sub 一方他のマクロから UserForm1.show UserForm1.textbox1.SetFocus とやってみても期待通りにフォーカスはあたりません。 どのような場合でもUserFormが表示されたときにはtextbox1にフォーカスをあてるようにしたいのです。 尚、この現象はEXCEL2002だと同じコードでも問題なくフォーカスがあたります。 以上よろしくお願いします。

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

    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

  • EXCEL VBA----ユーザーフォームの表示で・・・

    こんにちは、お知恵をお貸し下さいませ。 Userform1のCommandbutton1をクリック ↓ Userform1を隠して(hide)Userform2を表示させる ↓ Userform2に必要な項目を入力後(Userform2の)Commandbutton1をクリック ↓ (処理) ↓ (処理終了後)Userform2を閉じてからUserform1を表示させる 上記の処理をしたいのですが、最後の(処理終了後)の所で Userform2が表示されたままで、Userform1が表示されてしまいます。 Userform2.hide と Userform1.show の間に waitメソッドを置いても同様です。 Application.ScreenUpdating=False を使用しないとうまく行くのですが・・・。 とてもわかりづらい説明で申し訳ありませんが、どうぞよろしくお願い致します。

  • VBA フォームを閉じたとき、MSIMEがOFFになってしまう

    こんにちは。 ExcelVBAでマクロを組んでいます。 Excelシートにボタンを配置し、フォームを表示させた後、フォームを閉じるとMSIMEがOFFになってしまいます。手動でONにしようとしたのですが、グレーがかっていてクリックしても反応しません。 Excelを全て閉じて再度開きなおすと復活します。 また、メールやWebページに切り替えると復活し、Excelに戻るとまたOFFになってしまうのです。 フォームの表示はUserForm1.show、閉じる場合は、Unload UserForm1としています。 何か問題がありますでしょうか?

専門家に質問してみよう