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

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

ただいまの
回答率

88.05%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 832

score 72

基本的なクラスの使い方について質問です。
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


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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ice930

    2020/09/15 10:14

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

    キャンセル

  • m.ts10806

    2020/09/15 11:00

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

    キャンセル

  • ice930

    2020/09/15 16:24

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

    キャンセル

回答 1

checkベストアンサー

+1

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

ユーザフォーム

Private クラス変数 As New クラス名

Sub UserForm_Initialize()

   Dim ボタン変数 As CommandButton
   Set ボタン変数 = Me.Controls.Add("Forms.CommandButton.1", オブジェクト名, True)
   Call クラス変数.SetCtrl(ボタン変数) 
   With ボタン変数 
       .Top = 100
       ...省略(以下ボタンのプロパティ設定)
   End With
End 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 10:05

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

    キャンセル

  • 2020/09/15 12:49

    > 処理が異なるコントロールは、「一つのクラスモジュール」に格納する。

    処理が異なるコントロールは、それぞれ別のクラスモジュールを作成して、そこに格納するということです。

    逆に一つの処理に複数のコントロールが関連している場合は、一つの処理にその複数のコントロールを格納する場合もあります。また、その処理にセル(Range)やデータが関係するならそれも格納します。

    > クラスモジュールには、最上部に「定義」(何の変数なのか)を記載し、
    > その下に「クラスにコントロールを登録する」プロシージャと、
    > 「コントロールが起動された時のプロシージャ」を記載する。

    だいたいあってますが、「コントロールが起動された時のプロシージャ」は正しく「コントロールのイベントプロシージャ」ですね。イベントは、クリックイベントとか変更時イベントとかありますが、起動時というイベントはコントロールにはないです。

    キャンセル

  • 2020/09/15 16:24

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

    キャンセル

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る