質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

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

Q&A

解決済

2回答

597閲覧

Initializeでのユーザーフォームへのコントロールの設置

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2020/10/10 11:57

ユーザーフォームへの初期設定(Initialize)で、コマンドボタンを設置する場合として以下の様なコードを作成しました。

Private Sub TestForm_Initialize() Dim A As CommandButton Set A = TestForm.Controls.Add("Forms.CommandButton.1", "TEST", True) With A .Top = 24 .Left = 10 .Height = 20 .Width = 50 .Caption = "テスト" End With End Sub Private Sub TEST_Click() MsgBox "成功" End Sub

これを実行するとフォームに何も表示されません。
不足しているコード等有りましたらご教授ください。

上記のコードでは、「Top」や「Left」などの配置場所が一定ですが、ここに変数が入る予定であり、且つ条件式の中に入れ込む予定となっており、「動的」なボタンとなっております。
※静的なボタンは既にツールボックスから挿入しております。

ユーザーフォームでのボタン配置ではなく、Initializeで設定した場合のご回答をいただければ嬉しく思います。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

イベントプロシージャを付けたいなら、
WithEvents をつけてモジュールレベルで宣言してください。

vba

1Option Explicit 2Dim WithEvents A As CommandButton 3 4Private Sub UserForm_Initialize() 5 6 Set A = UserForm1.Controls.Add("Forms.CommandButton.1", "TEST", True) 7 8 With A 9 .Top = 24 10 .Left = 10 11 .Height = 20 12 .Width = 50 13 .Caption = "テスト" 14 End With 15 16End Sub 17 18Private Sub a_Click() 19 MsgBox "成功" 20End Sub

Initializeで一個のボタンを生成するぐらいなら、静的に追加すればいいことなので、たぶん何かに関連付けて複数のボタンを動的に追加したいのだと思われますが、だとしたら、WithEvents付きのコントロール変数は配列にできないのでクラスモジュールを使う必要が出てきます。

その辺の説明を追記するか、複雑なことなら、これはいったん解決済みにして、別に新規に質問を立てたほうがいいかもです。

投稿2020/10/10 13:02

編集2020/10/10 13:27
hatena19

総合スコア34075

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

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

ice930

2020/10/10 14:10

ありがとうございます! おっしゃる通りの事がやりたかったです(笑) 一旦頭を整理してコードを作り、また質問させていただきます!
hatena19

2020/10/10 14:14

クラスモジュールはかなり敷居が高いので、 予想される最大数のコマンドボタンを非表示で配置しておいて、必要に応じて表示させるという方法も検討してもいいかと思います。
hatena19

2020/10/10 14:46

ice930さんの過去の質問を見てみると、クラスモジュール関連でいろいろ質問してますが、最終目的を出さずに、今回のように部分的な処理の質問だったり、中途半端な質問のため、過去のいきさつを知らない回答者がそれぞれの立場で回答しているため(これは回答者の責任ではないです。いちいち過去の質問の内容まで確認して回答するなんてとてもできないので)、微妙に異なる回答になり、かつ、理解が不十分なまま解決済みにして新たに中途半端な質問をする。その質問に対しては適切なものだとしても、全体から見たら目的とは合わないものだったりてし、結局、どんどん混乱の深みにはまっているように見えます。 まずはクラスから離れて、最初から複数のコントロールを配置しておいて、それで目的のものを作成してみてください。それができたら、この部分が繰り返しが多いので共通化できないか、というような形で質問したほうがいいように思います。
ice930

2020/10/11 09:50

ご指摘ごもっともと思います。 過去の質問を読み返し、「さすがに伝わらないだろう」という質問文の書き方や、「捉え方によっては失礼では?」というコメントも見受けられました。 今後は、「最終目的」や「経緯」「困っている事」を明確にし、必要に応じて画像を張り付けるなど、回答しやすい文章となる様心がけます。
guest

0

下記コードを試したところ問題なく動作しました。 ※他のボタン等は配置していません

VBA

1Private Sub UserForm_Initialize() 2 3 Dim A As CommandButton 4 Set A = UserForm1.Controls.Add("Forms.CommandButton.1", "TEST", True) 5 6 With A 7 .Top = 24 8 .Left = 10 9 .Height = 20 10 .Width = 50 11 .Caption = "テスト" 12 End With 13 14End Sub

投稿2020/10/10 12:14

meg_

総合スコア10760

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

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

ice930

2020/10/10 12:55

ありがとうございます!「Private Sub UserForm_Initialize()」をPrivate Sub TestForm_Initialize()にしていました。 ちなみにイベントを「Private Sub TEST_Click()」と記載したのですが、クリックしても「MsgBox "成功"」が表示されません。 どの様な原因が考えられるでしょうか。
meg_

2020/10/10 13:29

hatena19さんの回答が適切です。 ちなみにツールボックスでボタン等を配置した後、UserForm_Initialize()内で配置位置を変えることも出来ます。(ボタンの数が事前に決まっていればこちらの方法でも良いでしょう)
ice930

2020/10/10 14:06

位置が変わるだけの物については、そのやり方を使わせていただきます! とても参考になりました ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問