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

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

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

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

Q&A

解決済

1回答

1302閲覧

UserForm_Initializeでコマンドボタンにコントロールを登録する

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2020/10/07 09:17

以前質問させていただいた際に、コマンドボタンへのコントロールの登録ををすべで「クラス」で登録しており、初心者のうちは、「マクロ登録」から行う様にアドバイスをいただきました。
今回、「データがある場合は表示されるボタン」がありましたので、UserForm_Initializeで「データがあった場合はボタンを表示させて」コントロールも登録する。
といった動作を行いたく質問いたしました。
私が今まで登録していた方法「クラス」を使った方法は、

Private コントロール名 As New URLButtonClass 'プロシージャ最上部 Dim ボタン名 As CommandButton Set ボタン名 = .Controls.Add("Forms.CommandButton.1", オブジェクト名, True) Call コントロール名.クラスにプロパティを登録するプロシージャ(SetCtrl)(ボタン名) ~ボタンプロパティ~

という形で登録していました。

クラスを使わずにコントロールを登録する場合は、プロシージャ上部の「Private コントロール名 As New URLButtonClass」は挿入せずに

Dim ボタン名 As CommandButton Set ボタン名 = .Controls.Add("Forms.CommandButton.1", オブジェクト名, True) Call .コントロール名(ボタン名)

で問題無いでしょうか。
上記で問題ない場合、コントロール側のプロシージャの題名(?)は

Private Sub コントロール名_Click() 処理 End Sub

で良いのでしょうか。

初歩中の初歩の質問かもしれませんがご教授いただけると幸いです。
よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コマンドボタンへのコントロールの登録

これでは意味不明な言葉の言い回しです。
それも回答が付かない一因でしょう。

コマンドボタンへのコントロールの登録


・クラスにコマンドボタンを登録する。
・クラスにコマンドボタンのコントロールオブジェクトを登録する。
・コマンドボタン用のクラスモジュールにコントロールオブジェクトを登録する。
~~~~~~~~~~~~~~~~~~~~

可変データに応じて、1データ単位の「コントロールのグループ」を
・表示/非表示(Visible=True/False) または
・操作可/不可(Enabled=True/Flase)
という処理でコントロール数を可変にするという場合、
使用するコントロールはUserFormデザイン時に静的に配置するものです。

予めフォーム内に格納可能な最大でコントロールを配置して、
Visible or Enabled にて可変にします。
Control.Add で動的にコントロールを作成する必要性は全くありません。
寧ろ邪魔です。『労多くして益なし』の典型でしょう。

静的にコントロールを配置すれば、クラスモジュールを使わなくても
UserForm内に普通にイベントプロシジャーを記述できます。
共通処理があれば、UserFormモジュール内に共通サブルーチンを用意して、
それを Call するようにすれば済む話です。

コントロールの名前をデザイン時に「Cmd1A,Txt1A,Txt1B,Txt1C/
Cmd2A,Txt2A,Txt2B,Txt2C/・・・」等とすれば、コントロール名から
何行目のコントロールグループなのかは容易に判断できます。

過去質問で、最初に動的コントロール作成の回答を貰って、
『動的コントロール』に固執し過ぎているように見えますね。

初心者であるというならば、尚更、先ずは基本の
「デザイン時にコントロールを静的配置」
&「標準のUserForm内イベントプロシジャーでプログラミングする」
という事をお薦めします。

今一度、基本に立ち返って、設計を見直してみることをお薦めします。

投稿2020/10/08 00:39

編集2020/10/08 00:42
AddinBoxTsunoda

総合スコア51

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

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

ice930

2020/10/08 02:12

質問文の内容についてのご指摘ありがとうございます! 専門用語など調べながら適切に質問するよう心がけます。 表示/非表示( またはVisible=True/False) の設定で事前に設定可能なのですね! ボタンのプロパティの所に条件式を入れればいいのでしょうか「True/False」の選択式しか入れられないと認識しておりました。(解除、入力方法など有りましたらご教授ください。) ワークシートのセルをクリックすると、データの有る列数応じて表示されるものですので、毎回ボタンが表示される場所も変わってきます。 プロパティで位置を表すTopに式などを入力すると「プロパティが不正です」と表示されてしまいます。 この場合、違う項目の操作なども必要でしょうか。
AddinBoxTsunoda

2020/10/08 03:28

> ボタンのプロパティの所に条件式を入れればいいのでしょうか UserFormを表示する際(Initialize イベント)に 『データ数に応じて、対応するコントロールの Visible プロパティに True or False を設定する』 というマクロコードを作成するという事です。 > データの有る列数応じて表示されるものですので、 > 毎回ボタンが表示される場所も変わってきます。 > プロパティで位置を表すTopに > 式などを入力すると「プロパティが不正です」 UserFromがどういうレイアウトになっているのかは知りませんが、 「データが1列あれば、1列分のコントロール」 「データが3列あれば、3列分のコントロール」 を用意するという事なのでしょう? UserForm上に仮に10列分のコントロールまで配置可能なのであれば、 VBEのUserFormウィンドウで、予め10列分のコントロールを 全て静的に配置しておくという事です。 その上で、例えば 『セルをクリックした時に、データが2列分ある』ならば、 Initializeイベントにて、 2列分のコントロールのみ Visible=True を設定して有効にし、 残りのコントロールには Visible=False を設定して隠す、 というマクロにするという事です。 > プロパティで位置を表すTopに式などを入力すると UserFromのデザインウィンドウで、マウス操作で配置するのですから、 プロパティウィンドウのTop等に入力する必要はないでしょう? 「位置の微調整で Top 等の数値を修正する」等はありますけど。 あくまでも、私の話は『フォームデザイン時にコントロールを 全て静的に配置する』という前提で、動的配置に対する話では ありませんので、お間違いの無いように・・・
AddinBoxTsunoda

2020/10/08 03:38

> 「データがある場合は表示されるボタン」がありましたので これの意味するところも曖昧で回答側としては迷います。 > シートにデータが入力されていると、 > そのデータ(セル)の近く(つまりシート上に)にボタンが現れる という意味にも読み取れるのです。
ice930

2020/10/14 13:08

返信遅くなり申し訳ありません。 ご丁寧な回答ありがとうございます。 ご指摘の通り、基本に立ち返りつつ学習しなおしたいと思います。 また、質問内容などについて注意したいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問