Page 207 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼複数ユーザーフォームの最前表示指定 会社員 02/10/10(木) 12:08 ┗Re:複数ユーザーフォームの最前表示指定 ichinose 02/10/10(木) 17:31 ┗Re:複数ユーザーフォームの最前表示指定 会社員 02/10/10(木) 17:50 ┗Re:複数ユーザーフォームの最前表示指定 ichinose 02/10/10(木) 22:47 ┗Re:複数ユーザーフォームの最前表示指定 会社員 02/10/11(金) 11:41 ┗Re:複数ユーザーフォームの最前表示指定 ichinose 02/10/11(金) 11:58 ┗Re:時間があるときで結構ですので... 会社員 02/10/11(金) 13:14 ┗Re:時間があるときで結構ですので... ichinose 02/10/12(土) 11:13 ┗ご親切にありがとうございました。◎です! 会社員 02/10/15(火) 22:01 ─────────────────────────────────────── ■題名 : 複数ユーザーフォームの最前表示指定 ■名前 : 会社員 ■日付 : 02/10/10(木) 12:08 -------------------------------------------------------------------------
はじめまして VBAの勉強を始めました。 ちょっと分からなくなってしいましたので、 おたずねします。 複数のユーザーフォームを表示したいと思っています。 メインのユーザーフォーム(1)のコマンドボタンをClickして、 別のフォーム(2)を開いた時(フォーム(2).Show) なぜかフォーム(1)の背面にフォーム(2)が隠れてしまいます。 フォーム(2)をアクティブ(最前面)にするコードを教えてください。 宜しくお願いします。 |
▼会社員 さん: こんばんは。 >VBAの勉強を始めました。 > >ちょっと分からなくなってしいましたので、 >おたずねします。 > >複数のユーザーフォームを表示したいと思っています。 >メインのユーザーフォーム(1)のコマンドボタンをClickして、 >別のフォーム(2)を開いた時(フォーム(2).Show) >なぜかフォーム(1)の背面にフォーム(2)が隠れてしまいます。 >フォーム(2)をアクティブ(最前面)にするコードを教えてください。 通常、フォーム1とフォーム2が同じ大きさだったばあい、フォーム1が隠れて見えなくなってしまうんですが・・・、コードを見せていただけますか? |
▼ichinose さん: こんばんは。 同じ職場の123がお世話になっています。 私も始めてみました。 以下のコードは、データ入力というユーザーフォームにある 品名というTextBoxの記述と、ActivesheetのActiveCell(品名)の 内容が違う場合に品名修正というユーザーフォームが立ち上がる というものです。 (以下のコードはデータ入力というユーザーフォームに書いてあるものです) Private Sub T_品名_Exit(ByVal Cancel As MSForms.ReturnBoolean) If ActiveCell.Value <> T_品名 Then 氏名修正.Show With 品名修正 .T_修正前品名.Value = ActiveCell.Value .T_修正後品名.Value = データ入力.T_品名.Value .T_修正後品名.SetFocus End With End If End Sub * フォーム1は「.Hide」をしないことにしています。 如何なものでしょうか? >通常、フォーム1とフォーム2が同じ大きさだったばあい、フォーム1が隠れて見えなくなってしまうんですが・・・、コードを見せていただけますか? |
▼会社員 さん: こんばんは。 >以下のコードは、データ入力というユーザーフォームにある >品名というTextBoxの記述と、ActivesheetのActiveCell(品名)の >内容が違う場合に品名修正というユーザーフォームが立ち上がる >というものです。 >(以下のコードはデータ入力というユーザーフォームに書いてあるものです) > >Private Sub T_品名_Exit(ByVal Cancel As MSForms.ReturnBoolean) >If ActiveCell.Value <> T_品名 Then >氏名修正.Show 'これ、品名修正.showですね。 > With 品名修正 > .T_修正前品名.Value = ActiveCell.Value > .T_修正後品名.Value = データ入力.T_品名.Value > .T_修正後品名.SetFocus > End With cancel=true >End If >End Sub モーダレスモードでフォーム(品名修正)を表示していますよね?コード指定ではないとしたら、フォームのプロパティのShowModalがFalseになっていませんか? 品名修正というフォームをどうしてもモーダレスモードでの表示でなければ仕様上、問題があるのですか?上記の問題の簡単解決はモーダルモードで品名修正というフォームを表示させることですが・・・。 モーダレスでどうしてもというなら、上記のCancel=Trueで前面に表示はされるはずですが、全体を把握していないので、はっきりしたことは言えませんが、 テキストボックスのExitイベントでの上記のコードの場合、ここで仮に前面表示が実現できても「データ入力」というユーザーフォームを非表示(終了)にするときなど工夫が必要かもしれません。 |
▼ichinose さん: おはようございます。 ご察しの通り、品名修正(フォーム)プロパティでモーダレスモードです。 データ入力のT_品名.Valueを品名修正(フォーム)の修正後品名にもってこようと しています。⇒ モーダレスモードじゃないとできないみたいです。 結局、ichinoseさん言われた「Cancel=True」を入れることにしました。 現状では特に問題はありません。 ありがとうございました。 それと、あつかましいお願いなのですが、 Cancel=True の意味を教えていただけませんでしょうか。 宜しくお願いします。 >>Private Sub T_品名_Exit(ByVal Cancel As MSForms.ReturnBoolean) >>If ActiveCell.Value <> T_品名 Then >>氏名修正.Show >'これ、品名修正.showですね。 >> With 品名修正 >> .T_修正前品名.Value = ActiveCell.Value >> .T_修正後品名.Value = データ入力.T_品名.Value >> .T_修正後品名.SetFocus >> End With > cancel=true >>End If >>End Sub >モーダレスモードでフォーム(品名修正)を表示していますよね?コード指定ではないとしたら、フォームのプロパティのShowModalがFalseになっていませんか? >品名修正というフォームをどうしてもモーダレスモードでの表示でなければ仕様上、問題があるのですか?上記の問題の簡単解決はモーダルモードで品名修正というフォームを表示させることですが・・・。 >モーダレスでどうしてもというなら、上記のCancel=Trueで前面に表示はされるはずですが、全体を把握していないので、はっきりしたことは言えませんが、 >テキストボックスのExitイベントでの上記のコードの場合、ここで仮に前面表示が実現できても「データ入力」というユーザーフォームを非表示(終了)にするときなど工夫が必要かもしれません。 |
▼会社員 さん: >ご察しの通り、品名修正(フォーム)プロパティでモーダレスモードです。 >データ入力のT_品名.Valueを品名修正(フォーム)の修正後品名にもってこようと >しています。⇒ モーダレスモードじゃないとできないみたいです。 そんなことないと思いますよ。ごめんなさい、本日、時間がないため、コード載せられませんが、入力データ(最初に表示している)フォームにPublic変数を設定すれば可能だと思いますが・・・。 >結局、ichinoseさん言われた「Cancel=True」を入れることにしました。 >現状では特に問題はありません。 > >ありがとうございました。 > >それと、あつかましいお願いなのですが、 >Cancel=True の意味を教えていただけませんでしょうか。 >宜しくお願いします。 Cancel=True により、このTexboxからの別のコントロールにフォーカスを移すことを キャンセルします。 >>>Private Sub T_品名_Exit(ByVal Cancel As MSForms.ReturnBoolean) >>>If ActiveCell.Value <> T_品名 Then >>>氏名修正.Show >>'これ、品名修正.showですね。 >>> With 品名修正 >>> .T_修正前品名.Value = ActiveCell.Value >>> .T_修正後品名.Value = データ入力.T_品名.Value >>> .T_修正後品名.SetFocus >>> End With >> cancel=true >>>End If >>>End Sub >>モーダレスモードでフォーム(品名修正)を表示していますよね?コード指定ではないとしたら、フォームのプロパティのShowModalがFalseになっていませんか? >>品名修正というフォームをどうしてもモーダレスモードでの表示でなければ仕様上、問題があるのですか?上記の問題の簡単解決はモーダルモードで品名修正というフォームを表示させることですが・・・。 >>モーダレスでどうしてもというなら、上記のCancel=Trueで前面に表示はされるはずですが、全体を把握していないので、はっきりしたことは言えませんが、 >>テキストボックスのExitイベントでの上記のコードの場合、ここで仮に前面表示が実現できても「データ入力」というユーザーフォームを非表示(終了)にするときなど工夫が必要かもしれません。 |
▼ichinose さん: こんにちは。 >そんなことないと思いますよ。ごめんなさい、本日、時間がないため、コード載せられませんが、入力データ(最初に表示している)フォームにPublic変数を設定すれば可能だと思いますが・・・。 すみません 時間があるときで結構ですので、教えて頂けますでしょうか。 まだ、言われていることが、理解できないでいます。 (お恥ずかしい話ですが、参考書を読んでも、応用する要領が分かりません。) >>それと、あつかましいお願いなのですが、 >>Cancel=True の意味を教えていただけませんでしょうか。 >>宜しくお願いします。 >Cancel=True により、このTexboxからの別のコントロールにフォーカスを移すことを >キャンセルします。 なるほど、ありがとうございました。 |
▼会社員 さん: こんにちは。 >>そんなことないと思いますよ。ごめんなさい、本日、時間がないため、コード載せられませんが、入力データ(最初に表示している)フォームにPublic変数を設定すれば可能だと思いますが・・・。 と、申し上げましたが、他にも方法は色々あると思いますし、変数を使用しなくても処理によっては可能な場合もあります。 今回は、変数を使った場合で記述しましたが、「フォームにPublic変数」ではなく、標準モジュールに配置しました。 全体が見えないので、私のほうで勝手な仕様にしてみましたので・・。 1.「入力データ」フォームは、モーダレスモード 2.「品名修正」フォームは、モーダルモード 2.1 品名修正フォームのコントロール T_修正前品名 テキストボックス(TabstopプロパティをFalseに設定) T_修正後品名 テキストボックス CommandButton1 コマンドボタン(このボタンを押されたときのみ、T_修正後品名の内容を「入力データ」フォームのT_品名(テキストボックス)に反映させる) 標準モジュールで、 '============================================================ Public Type 修正内容 func As Integer '0:修正キャンセル '1:修正確定 修正前 As String 修正後 As String End Type Public ment_inf As 修正内容 '本当は、↑「入力データ」フォームに宣言したいのですが、ユーザー定義が許可されないので・・ '============================================================= Sub test() 入力データ.Show End Sub 「入力データ」フォームモジュールで、 '============================================================= Private Sub T_品名_Exit(ByVal Cancel As MSForms.ReturnBoolean) If ActiveCell.Value <> T_品名 Then With ment_inf .func = 0 .修正前 = ActiveCell.Value .修正後 = T_品名.Text 品名修正.Show If .func = 1 Then T_品名.Text = .修正後 End If End With End If End Sub 「品名修正」フォームモジュールで、 '====================================================================== Private Sub CommandButton1_Click() With ment_inf .修正後 = T_修正後品名.Text .func = 1 End With Unload Me End Sub '====================================================================== Private Sub UserForm_Initialize() With ment_inf T_修正前品名.Text = .修正前 T_修正後品名.Text = .修正後 End With End Sub これだと、モーダルモードでも修正内容を「入力データ」フォームのT_品名に更新できますが・・・。 |
▼ichinose さん: こんにちは。 お忙しいのに 本当にありがとうございました。 出来ました。◎です。 私には 未だ記述の意味が良く分かりませんが、 とりあえず引用させていただきました。 本当に本当にありがとうございました。 |