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

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

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

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

Q&A

解決済

3回答

2589閲覧

コード中で生成されたコマンドボタンの処理の指定

ice930

総合スコア99

VBA

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

1グッド

0クリップ

投稿2020/09/01 04:43

プラットフォームに表示されたURLの左のボタンをクリックした時に、URLをクリップボードにコピーするものが作りたく,必要な数だけコマンドボタン、URLを記載したラベルを生成するコードを作成しました。
イメージ説明

コード中でこ必要な数だけコマンドボタンを作成しているのですが、コマンドボタンを押された時の処理は、Private Sub actButton_Click()~end sub と記憶しています。
それぞれのコマンドボタンのコピー先は異なっており、コマンドボタン毎にプロージャを呼び出す場合、各行のプロージャを作成しなければならず、膨大な量になってしまいます。

コマンドボタン作成部分に処理を入力することはできないでしょうか。
以下がコードです。

Sub UserForm_Initialize() '質問用 With UserForm2 Row = ActiveCell.Row '行番号取得 For n = 1 To 5 With .Controls.Add("Forms.Label.1", "url" & n, True) .Top = 34 * n 'Top位置(表示位置を移動する) .Left = 70 'Left位置 .Height = 20 '高さ .Width = 250 '幅 .BorderStyle = fmBorderStyleSingle '枠線 .BackColor = RGB(128, 128, 128) '背景色 .ForeColor = RGB(255, 255, 255) '文字色 .Font.Name = "メイリオ" 'テキストのスタイル .TextAlign = 2 'テキストの位置 .FontSize = 16 'テキストのサイズ .Caption = Cells(Row, 5) '''ここにパスワードの題名を付ける End With With .Controls.Add("Forms.CommandButton.1", "url" & n, True)’ここに処理を入力したいです! .Top = 34 * n .Left = 10 .Height = 20 .Width = 50 .Caption = "copy" End With Row = Row + 1 Next End With End Sub

コマンドボタンの部位に「ここに処理を入力したいです!」と書かせていただきました。
よろしくお願いします。

radames1000👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

イベントであればこんな感じです。
Classモジュール名:EventButtonClass

VBA

1'(Test_Sample_Miniature) 2Private Const MAX_CONTROL_NUMBER = 100 3Private ctrlBtn(1 To MAX_CONTROL_NUMBER) As New EventButtonClass 4Sub UserForm_Initialize() '質問用 5 With UserForm2 6 Row = ActiveCell.Row '行番号取得 7 For n = 1 To 5 8 With .Controls.Add("Forms.Label.1", "url" & n, True) 9 .Top = 34 * n 'Top位置(表示位置を移動する) 10 .Left = 70 'Left位置 11 .Height = 20 '高さ 12 .Width = 250 '幅 13 .BorderStyle = fmBorderStyleSingle '枠線 14 .BackColor = RGB(128, 128, 128) '背景色 15 .ForeColor = RGB(255, 255, 255) '文字色 16 .Font.Name = "メイリオ" 'テキストのスタイル 17 .TextAlign = 2 'テキストの位置 18 .FontSize = 16 'テキストのサイズ 19 .Caption = Cells(Row, 5) '''ここにパスワードの題名を付ける 20 End With 21 22 Dim NewB As CommandButton 23 Set NewB = UserForm2.Controls.Add("Forms.CommandButton.1", "url" & n, True) 24 Call ctrlBtn(n).SetCtrl(NewB) 25 NewB.Top = 34 * n 26 NewB.Left = 10 27 NewB.Height = 20 28 NewB.Width = 50 29 NewB.Caption = "copy" 30 Row = Row + 1 31 Next 32 End With 33End Sub

Class

1Private WithEvents tgtCtrl As MSForms.CommandButton 2Public Sub SetCtrl(new_ctrl As MSForms.CommandButton) 3 Set tgtCtrl = new_ctrl 4End Sub 5Private Sub tgtCtrl_Click() 6 MsgBox "コントロール名: " & tgtCtrl.Name 7End Sub

投稿2020/09/01 06:05

編集2020/09/01 06:19
tosi

総合スコア553

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

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

ice930

2020/09/02 04:15

ご回答ありがとうございます。 理解を深めるため、各行の意味を確認しながら打っているのですが、 Private Const MAX_CONTROL_NUMBER = 100 の部分がわかりません。 単に For分の中に数字の100を第入した場合や、数値を50にした場合の影響などご教授いただけると幸いです。
tosi

2020/09/02 04:42 編集

Private Const MAX_CONTROL_NUMBER = 100 はクラスから作成されるオブジェクト最大可能数です。 画面ではCopyボタンが5ケありますので、100でなく5でも構いませんし、 または、 Private ctrlBtn(1 To 5)の固定値でも良いです。 または、 Private ctrlBtn1 As New EventButtonClass Private ctrlBtn2 As New EventButtonClass Private ctrlBtn3 As New EventButtonClass Private ctrlBtn4 As New EventButtonClass Private ctrlBtn5 As New EventButtonClass とCopyボタン用に5ケ準備してそれぞれを割り当てても良いです。
ice930

2020/09/02 14:07

ありがとうございます! 理解できました! 他でも応用できそうです!
guest

0

こちらの記事を参考にしてみてください。
クラスを作って、そちらでイベントを拾う形になります。
全てのボタンが同じクラスのイベントに飛んでくるので、何かで識別しないといけません。
クラス内にメンバ変数を用意し番号や何かを入れておいてもいいですし、ボタン自体のプロパティで判定してもよいかもしれません。
Tagプロパティに情報を持たせるのはよくやる手です。

VBA

1 With .Controls.Add("Forms.CommandButton.1", "url" & n, True) 2 .Top = 34 * n 3 .Left = 10 4 .Height = 20 5 .Width = 50 6 .Caption = "copy" 7 .Tag = n ' Tagに番号を入れておく

クラス側で拾える。

VBA

1Private Sub myCmdBtn_Click() 2 MsgBox myCmdBtn.Tag 3End Sub 4

投稿2020/09/01 05:41

編集2020/09/01 05:42
ttyp03

総合スコア17000

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

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

0

クラスモジュールを使ってイベントの共通化ができます。

「VBA クラスモジュール イベント 共通化」で検索するとサンプルコードはいろいろ見つかります。

VBA クラスモジュール イベント共通 - Google 検索


この質問の場合、コマンドボタンとラベルがワンセットなので、クラスモジュールもその2つをセットにしたものにするといいでしょう。

クラスモジュール CmdBtnWithLabel

vba

1Option Explicit 2 3Private WithEvents myCmdBtn As MSForms.CommandButton 4Private myLabel As MSForms.Label 5 6Private Sub myCmdBtn_Click() 7 If myLabel.Caption = "" Then Exit Sub 8 9 With New MSForms.DataObject 10 .SetText myLabel.Caption 'ラベルのCaptionをDataObjectに格納する 11 .PutInClipboard 'DataObjectのデータをクリップボードに格納する 12 End With 13 14 MsgBox "URLをクリップボードにコピーしました。" 15End Sub 16 17Public Sub setBtnLbl(Cmdbtn As MSForms.CommandButton, lbl As MSForms.Label) 18 Set myCmdBtn = Cmdbtn 19 Set myLabel = lbl 20End Sub

UserForm2 モジュール

vba

1Option Explicit 2 3Dim myCol As Collection 4Dim myBtnLbl As CmdBtnWithLabel 5 6Sub UserForm_Initialize() 7 Set myCol = New Collection 8 9 Dim row As Long 10 row = ActiveCell.row '行番号取得 11 12 With Me 13 Dim n As Long 14 For n = 1 To 5 15 Dim lbl As MSForms.Label 16 Set lbl = .Controls.Add("Forms.Label.1", "url" & n, True) 17 With lbl 18 .Top = 34 * n 'Top位置(表示位置を移動する) 19 .Left = 70 'Left位置 20 .Height = 20 '高さ 21 .Width = 250 '幅 22 .BorderStyle = fmBorderStyleSingle '枠線 23 .BackColor = RGB(128, 128, 128) '背景色 24 .ForeColor = RGB(255, 255, 255) '文字色 25 .Font.Name = "メイリオ" 'テキストのスタイル 26 .TextAlign = 2 'テキストの位置 27 .FontSize = 16 'テキストのサイズ 28 .Caption = Cells(row, 5) '''ここにパスワードの題名を付ける 29 End With 30 31 Dim btn As MSForms.CommandButton 32 Set btn = .Controls.Add("Forms.CommandButton.1", "url" & n, True) 33 With btn 34 .Top = 34 * n 35 .Left = 10 36 .Height = 20 37 .Width = 50 38 .Caption = "copy" 39 End With 40 41 Set myBtnLbl = New CmdBtnWithLabel 42 myBtnLbl.setBtnLbl btn, lbl 43 myCol.Add myBtnLbl 44 45 row = row + 1 46 Next 47 48 End With 49End Sub

投稿2020/09/01 05:36

編集2020/09/01 06:33
hatena19

総合スコア34075

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

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

ice930

2020/09/02 04:05

ご回答ありがとうございます。 ユーザーフォームからステップインで実行すると、CmdBtnWithLabelのところで、「ユーザー定義型はていぎされていません」と表示されます。 解決策としてツール→参照設定 からライブラリファイルを追加しようかと思ったのですが、何を追加していいかわかりません・・・。 もしご存じでしたら必要なライブラリファイルの名称と、このような時に何のライブラリが必要か知る方法をご教授いただけるとありがたいです。
radames1000

2020/09/02 04:11

横からですが。クラスモジュールを作ってオブジェクト名を「CmdBtnWithLabel」にしてくださいね。
hatena19

2020/09/03 21:17

radames1000さん、フォローありがとうございます。 作成したクラスモジュールの名前を「CmdBtnWithLabel」にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問