🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

6110閲覧

親ユーザーフォームから子ユーザーフォームへの移行とデータのやり取り

asian-ayam

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/12/16 01:08

現在、エクセルVBAで社内で必要なマクロを作っているVBA初心者です。

(1)現在、下記のような仕様のユーザーフォームを作っておりますが、エラーが出てしまい、解決法が見つからず、難儀しています。

・メインのユーザーフォームを親ユーザーフォーム(UserForm1)としてその中には幾つかテキストボックスを設定

・親ユーザーフォームのテキストボックスの一つにtxtNameとオブジェクト名を設定して、そのテキストボックスをダブルクリックすると社員の名前を入力してリストボックスに名前の候補を出せる子ユーザーフォーム(UserForm2)が現れる

下記、UserForm1のコードの中身です

Private Sub txtName_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

UserForm2.Show

End Sub

txtNameのテキストボックスをダブルクリックすると実行時エラー '1004'でアプリケーション定義またはオブジェクト定義のエラーですとなってUserForm2が表示されません。

ユーザーフォームのオブジェクト名も正しく入力されているのですが、別途、ユーザーフォームのLoadや宣言等を行なわなければいけないのでしょうか?

(2)(1)で無事に子ユーザーフォーム(UserForm2)が表示されたとしてリストボックスの社員リストの中で"田中"と値が確定されたとして"田中"という値を親ユーザーフォームUserForm1のtxtNameのテキストボックスの中に反映させるためにはどのようなコードを記述すればよろしいでしょうか?

ご教示のほどを何卒宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

テキストボックスのダブルクリックの既定の動作と、UserForm2のUserForm_Initializeの処理がバッティングている可能性が考えられます。

下記のようにダブルクリックの既定の動作をキャンセルしたらどうでしょうか。

vba

1Private Sub txtName_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 2 Cancel = True 3 UserForm2.Show 4End Sub

追記

UserForm1とUserForm2をモードレスに設定しておいて、試してみると、
Cancel = True がないと、UserForm2 が一瞬表示されすぐにUserForm1の裏に隠れてしまいました。
Cancel = True があると、UserForm2 は前面に表示されます。

投稿2019/12/16 05:41

編集2019/12/16 05:46
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asian-ayam

2019/12/18 01:10

UserForm2に別途異なるInitializeのコードを記述したところ、スムーズにUserForm2がShowされました!なるほど、モードレスにした方が作業上もやりやすいですし、実際、Cancel=TrueとしたところUserForm2が現れる動作が安定しました!検証して下さり、有難うございました!
guest

0

ベストアンサー

(1)の回答

そのコードで問題ないはずです。
問題の切り分けのためにユーザーフォームが2つあるだけのシンプルなものを仮に作って同じ実装をするとよいでしょう。
それで問題が起きなければ他の処理に問題があるはずです。

(2)の回答

フォームを閉じるときに親フォームのテキストボックスを変更すればよいかと。
以下は仮にボタンを押したときに処理をしています。

VBA

1Private Sub CommandButton1_Click() 2 UserForm1.TextBox1 = ListBox1.Text 3 Unload Me 4End Sub

投稿2019/12/16 01:40

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asian-ayam

2019/12/16 03:24 編集

(1) テスト用のユーザーフォーム(UserForm3)を別途作り、同じコードで実行してみたところ、きちんとUserForm3が表示されました。なので連携したい子ユーザーフォーム(UserForm2)のコードの問題かと思い、UserForm2で設定していたUserForm_Initializeの箇所をコメントアウトしたところ、UserForm2が表示されました!ただ気になるのは、txtNameをダブルクリックするとUserForm2が一瞬だけ出てきてすぐに引っ込んでしまうところですね。。。恐らくこれが問題かと思われますが→https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14104536324 UserForm2に実装したい機能としては下記のリンク先の4番目の項目以降のもので予めUserForm2のInitializeに同じ仕様のマクロを記述したところ、冒頭で質問させていただいたようなエラー1004が出てしまいました。このリンクと同じようなUserForm_Initializeでのユーザーフォームのオブジェクトの設定でエラーが出てしまうのでしょうか? https://infith.com/system/excel/vba_form_find/ なお、UserForm1にもUserForm_Initializeを別途設定しています。 (2)ご回答下さり、有難うございます!
ttyp03

2019/12/16 04:09

>UserForm2が一瞬だけ出てきてすぐに引っ込んでしまう 今回の操作としてはモードレスにする必要はなくモーダルでよさそうですよね。 UserForm2.Show vbModal UserForm2を開いているときに、他の画面も触りたいなら別ですが。
asian-ayam

2019/12/16 09:43

>UserForm2が一瞬だけ出てきてすぐに引っ込んでしまう こちらの件に関しては各UserFormをShowModalをTrueにしたところ、何とか表示されるようになりました。ただ、冒頭のエラーに関してはまだ直っていないので別のイベントでUserForm2の検索ボックスの設定をやり直すことを考えています。
ttyp03

2019/12/16 10:10

UserForm2のInitializeで何をやってるかはわかりませんが、何か無茶なことをやっているんでしょうね。 もう少しっぽいのでがんばってください。
asian-ayam

2019/12/16 10:28

おっしゃる通りでして、UserForm2のInitializeでMsgBoxを表示させるというシンプルなマクロを設定したところ、問題なく動作したのでInitializeの中のマクロの設定を何とかエラーが出ないようにコードを書く必要がありそうです。暖かいお言葉、有難うございます!仕事上がりにまた格闘します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問