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

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

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

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

Q&A

解決済

1回答

3674閲覧

コマンドボタンのコントロールをクラスに格納したい。

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2020/09/15 00:16

編集2020/09/15 01:12

基本的なクラスの使い方について質問です。
commandボタンのコントロールをクラスに格納する時の手順(コードの書き方)として以下のように記憶していました。

【ユーザーフォーム:上部】 Private コントロール名 As New クラス名(クラスの題名) 【ユーザーフォーム:下部】 Dim ボタン名 As CommandButton Set ボタン名 = フォーム名.Controls.Add("Forms.CommandButton.1", オブジェクト名, True) Call コントロール名(ボタン名) フォーム名.Controls.Add("Forms.CommandButton.1", オブジェクト名, True).Top ...省略(以下ボタンのプロパティ) End Sub 【クラスモジュール:上部】 Private WithEvents コントロール名 As MSForms.CommandButton 【クラスモジュール:下部】 Private Sub ボタン名_Click() ~処理~ End Sub

これをふまえ、以下の様なコードを作成しましたが、「変数ではなくプロシージャを指定してください。」というエラーが発生してしまいます。
(問題個所にコメントで「※ここです」と記載しました。)
フォーム

Private ctrlhenk As New Class1 Sub UserForm_Initialize() With UserForm1 Dim henbtn As CommandButton Set henbtn = .Controls.Add("Forms.CommandButton.1", "HEN", True) Call ctrlhenk(henbtn)※ここです。 With henbtn .Top = Top + 50 .Left = 230 .Height = 20 .Width = 100 .Caption = "変更" End With End With End Sub

クラス

Private WithEvents ctrlhenk As MSForms.CommandButton Private Sub ctrlhenk_Click() MsgBox "データ飛びました" End Sub

以前「クラスの使い方を理解していない」というようなご指摘をいただき、自分なりに整理した結果上記のコードが出来たので、「〇〇を▽▽したい。」というような質問ではないですが、解決法はもちろん、「勘違いしてそうなところ」や「質問の仕方」、コツについてもご助言いただければ幸いです。

よろしくお願いします。

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

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

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

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

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

m.ts10806

2020/09/15 00:29

あまり細かいところなんですが、半角カナはあまり使われない方が良いかと。 文章中だと読みづらいですし、プログラムだと思わぬバグを生むこともあります(特殊な規格ですし)
ice930

2020/09/15 00:35

特殊な規格でバグの原因にもなるんですね! 幅を使わず文章書けるのであまり気にせず使っていました 今後は全角カナを利用します!
m.ts10806

2020/09/15 00:57

質問は編集できますので。 >幅を使わず 読むのは他人なので。
ice930

2020/09/15 01:14

お手数かけ申し訳ありませんでした。 今後気を付けます。 編集ボタンから編集しましたので、ご助言等ありましたらおよろしく願いします。
m.ts10806

2020/09/15 02:00

できれば、タイトルも…。
ice930

2020/09/15 07:24

解決したので、次回の質問タイトルから全角カナで行うようにします。 回答ありがとうございました。
guest

回答1

0

ベストアンサー

最初のコード例が間違ってますね。
下記のような雛形になります。(一つの例です。)

ユーザフォーム

vba

1Private クラス変数 As New クラス名 2 3Sub UserForm_Initialize() 4 5 Dim ボタン変数 As CommandButton 6 Set ボタン変数 = Me.Controls.Add("Forms.CommandButton.1", オブジェクト名, True) 7 Call クラス変数.SetCtrl(ボタン変数) 8 With ボタン変数 9 .Top = 100 10 ...省略(以下ボタンのプロパティ設定) 11 End With 12End Sub

クラスモジュール【クラス名】

Private WithEvents コントロール変数 As MSForms.CommandButton 'クラスにコントロールを登録するメソッド Public Sub SetCtrl(new_ctrl As CommandButton) Set コントロール変数 = new_ctrl End Sub Private Sub コントロール変数 _Click() ~処理~ End Sub

機能(処理)が異なるコントロールは、それぞれ別にクラスを作成します。

投稿2020/09/15 00:46

hatena19

総合スコア34075

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

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

ice930

2020/09/15 01:05

hatena19さんいつもありがとうございます! 処理が異なるコントロールは、「一つのクラスモジュール」に格納する。という理解でいいでしょうか。 クラスモジュールには、最上部に「定義」(何の変数なのか)を記載し、 その下に「クラスにコントロールを登録する」プロシージャと、 「コントロールが起動された時のプロシージャ」を記載する。 という覚え方で間違いないでしょうか?
hatena19

2020/09/15 03:49

> 処理が異なるコントロールは、「一つのクラスモジュール」に格納する。 処理が異なるコントロールは、それぞれ別のクラスモジュールを作成して、そこに格納するということです。 逆に一つの処理に複数のコントロールが関連している場合は、一つの処理にその複数のコントロールを格納する場合もあります。また、その処理にセル(Range)やデータが関係するならそれも格納します。 > クラスモジュールには、最上部に「定義」(何の変数なのか)を記載し、 > その下に「クラスにコントロールを登録する」プロシージャと、 > 「コントロールが起動された時のプロシージャ」を記載する。 だいたいあってますが、「コントロールが起動された時のプロシージャ」は正しく「コントロールのイベントプロシージャ」ですね。イベントは、クリックイベントとか変更時イベントとかありますが、起動時というイベントはコントロールにはないです。
ice930

2020/09/15 07:24

同じ変数をつかったり、同じような処理の無いときは、新しいクラスモジュールを作成して管理するようにします! クリック、ダブルクリックをイベントプロシージャと言うんですね! 今後質問する時などはその様に使います。 いつもご回答ありがとうございます!助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問