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

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

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

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

Q&A

解決済

3回答

901閲覧

コマンドボタンの.Tagに配列を入れ込みたい

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2020/09/03 13:51

複数のコマンドボタンを作り、それぞれのボタンから関連データを表示させたいので、Controls.Add.Tagに複数のデータを登録したく、配列Dataを作成しましたが、「型が一致しません」とエラーが表示され処理されません。
1、Tagに配列は入れられないでしょうか。
2 Tagに配列が入らない場合、複数の数値を入れる方法は内でしょうか。

以下が対象コードです。「''ここに配列を追加しました。」と「 '''配列をここに飛ばしたいです。」のコメントを入れさせていただきました。
よろしくお願いします。

Private Const MAX_CONTROL_NUMBER = 100 Private ctrlbtn(1 To MAX_CONTROL_NUMBER) As New EventButtonClass Sub UserForm_Initialize() Set myCol = New Collection Dim row As Long row = ActiveCell.row '行番号取得 With Me Dim n As Long For n = 1 To 5 Dim lbl As MSForms.Label Set lbl = .Controls.Add("Forms.Label.1", "url" & n, True) With lbl .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 Dim NewB As CommandButton Dim Data(1 To 2) ''ここに配列を追加しました。 Data(1) = row Data(2) = n Set NewB = UserForm2.Controls.Add("Forms.CommandButton.1", "url" & n, True) Call ctrlbtn(n).SetCtrl(NewB) With NewB .Top = 34 * n .Left = 10 .Height = 20 .Width = 50 .Caption = "関連データ" .Tag = Data ''ここに配列を追加しました。 End With row = row + 1 Next End With End Sub

クラスのコード

Private WithEvents tgtCtrl As MSForms.CommandButton Public Sub SetCtrl(new_ctrl As MSForms.CommandButton) Set tgtCtrl = new_ctrl End Sub Private Sub tgtCtrl_Click() Dim intRow As Long Dim intcol As Long intRow = tgtCtrl.Tag(1) '''配列をここに飛ばしたいです。 intcol = tgtCtrl.Tag(2) End Sub

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

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

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

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

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

guest

回答3

0

hatena19様の言われているクラスにセルも格納は下記の様な感じと思います。

VBA

1 Call ctrlBtn(n).SetCtrl(NewB, Cells(Row, n))

Class

1Private WithEvents tgtCtrl As MSForms.CommandButton 2Private tgtRange As Range 3 4Public Sub SetCtrl(new_ctrl As MSForms.CommandButton, new_Range As Range) 5 Set tgtCtrl = new_ctrl 6 Set tgtRange = new_Range 7End Sub 8 9Private Sub tgtCtrl_Click() 10 MsgBox "コントロール名: " & tgtCtrl.Name & " - " & tgtRange.Row & " - " & tgtRange.Column 11 Dim intRow As Long 12 Dim intcol As Long 13 intRow = tgtRange.Row 14 intcol = tgtRange.Column 15End Sub

(追記)
Publicを使ってこれにセットする方法もあると思います。(好んで使っています)

VBA

1 Call ctrlbtn(n).SetCtrl(NewB) 2 Set ctrlbtn(n).tgtRange = Cells(row, n)

Class

1Private WithEvents tgtCtrl As MSForms.CommandButton 2Public tgtRange As Range 3Public Sub SetCtrl(new_ctrl As MSForms.CommandButton) 4 Set tgtCtrl = new_ctrl 5End Sub 6Private Sub tgtCtrl_Click() 7 MsgBox "コントロール名: " & tgtCtrl.Name & " - " & tgtRange.row & " - " & tgtRange.Column 8 Dim intRow As Long 9 Dim intcol As Long 10 intRow = tgtRange.row 11 intcol = tgtRange.Column 12End Sub

投稿2020/09/03 23:21

編集2020/09/04 00:30
tosi

総合スコア553

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

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

ice930

2020/09/06 10:43

セルの格納もできるんですね! ありがとうございます! 早速使わせていただきます!
guest

0

ベストアンサー

下記のような感じでしょうか。

vba

1 .Tag = Join(Data, ",") ''ここに配列を追加しました。

vba

1 intRow = Split(tgtCtrl.Tag,",")(0) '''配列をここに飛ばしたいです。 2 intcol = Split(tgtCtrl.Tag,",")(1) ''''インデックスは0起点になる

Join でカンマ区切り文字列に変換してTagに格納。
SPlit でカンマで分割した配列に変換

VBA - コード中で生成されたコマンドボタンの処理の指定|teratail
上記の質問の続きですね。
たぶん、セットになるラベルコントロールとセルの参照に使うのだと思いますが、
せっかくクラスを使うのならクラスにラベルコントロールとセルも格納するようにした方が読みやすいコードになると思います。

投稿2020/09/03 21:11

編集2020/09/03 21:13
hatena19

総合スコア34075

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

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

ice930

2020/09/06 10:48

joinで文字列を作り、SPlitで配列に変更するんですね! クラスにセルも格納することにしました! ありがとうございました!
guest

0

>1、Tagに配列は入れられないでしょうか。
はい、String型ですので、文字列しか入りません。

>2 Tagに配列が入らない場合、複数の数値を入れる方法は内でしょうか。
カンマ区切りで入れるとか。

投稿2020/09/03 14:01

iruyas

総合スコア1067

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問