エクセルVBAでフォームへ動的に貼り付けたボタンのクリックイベントを検知する方法

このQ&Aのポイント
  • Excel VBAを使用して、フォームに動的に貼り付けたボタンのクリックイベントを検知する方法を教えてください。
  • Excel VBAでフォームを作成し、ボタンを「push me!」というキャプションで表示します。
  • ボタンをクリックしたときにメッセージボックスが表示されるようにカスタマイズします。
回答を見る
  • ベストアンサー

エクセルVBA フォームへ動的に貼り付けたボタンのクリックイベントを検知する方法を教えてください

(1)excel97にのVBAでフォームを作成します。 デフォルトの場合はUserForm1という名前がつきます。 (2)標準モジュールとして下記のコードを作成します。 Sub ボタンを付けて表示() Dim btn As Control  With UserForm1       ’ボタンを"button"という名前で作成します   Set btn = .Controls.Add("Forms.CommandButton.1", "button")   ’ボタンの設定をします   With btn    .Top = 5    .Left = 5    .Height = 20    .Width = 200    .Caption = "push me!"   End With   ’フォームの設定をし、表示します   .Height = 60   .Width = 220   .Show  End With End Sub (3)マクロを実行するとフォームが表示されます。 そこでこのボタン("push me!"と表示されています)をクリックします。 このクリックを検知してマクロを動かしたいのですが可能でしょうか? なおUserForm1に下記のコードを付けてみたのですがクリックは検知できませんでした。 Private Sub button_Click()  MsgBox "You click the button." End Sub

  • tamo
  • お礼率82% (43/52)

質問者が選んだベストアンサー

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

クラスモジュールを使用すると出来るのではないでしょうか。 ----- 標準モジュール --------- Dim NewBtn As New Class1 ' <------ 追加 Sub ボタンを付けて表示() Dim btn As Control With UserForm1   Set btn = .Controls.Add("Forms.CommandButton.1", "button")   With btn     .Top = 5     .Left = 5     .Height = 20     .Width = 100     .Caption = "push me!"   End With   .Height = 60   .Width = 220   Set NewBtn.button = btn ' <---- 追加   .Show End With End Sub ---- ↓ クラスモジュールに記述します。 Public WithEvents button As CommandButton Private Sub button_Click()   MsgBox "You click the button." End Sub

tamo
質問者

お礼

完璧です。ありがとうございます。 クラスモジュールとイベントのトラップは使用したことがなかったのでこれから勉強します。 また何かあったらお願いします

その他の回答 (1)

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

Private Sub button_Click() ではなく Private Sub CommandButton1_Click() か Private Sub Forms.CommandButton1_Click() とかにしてみたらどうでしょうか?

tamo
質問者

お礼

早速試してみましたができませんでした(*_*)

関連するQ&A

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • エクセルVBA、ユーザーフォーム[×]活用法?

    いま、VBAでマクロを作成中なのですが、 ユーザーフォームの右上に存在する×ボタンの使い方がよくわかりません。 マクロのイメージは以下のとおりです。 ユーザーフォーム・オブジェクト ┌─────────────┐ │              【×】  │←この×ボタンです │                   │ │  ┌───────┐    │ │  │ Button1     │    │ Private sub Button1_Click()   ・      ・ If Button_×_click Exit sub Else ・        ・ End If End Sub ×ボタンをコマンドボタンのように動作させるイベントマクロを作成するにはどのように コーディングしたらよいのかさっぱりわからずこまっています。 どうかご回答のほどよろしくおねがいもうしあげますm( _ _ )m

  • VBAでユーザーフォームのcaption表示

    VBAを初めたばかりです。 VBAでユーザーフォームを作成したのですが ユーザーフォームプロパティのcaptionで入力しても 下記プログラムで入力しても表示されません。 VBA作成時の画面にはしっかりと「項目」と 表示されていますが、プログラムを実行してユーザーフォームを 呼び出すと何も表示されていません。 ご教授ください。 Private Sub UserForm_Initialize() UserForm1.Caption = "項目" With ListBox1 .AddItem "1" .AddItem "2" End With End Sub

  • VBAのUserformのボタンからwebクエリ

    VBAのUserformのボタンを押すことによってwebクエリを取得という形を希望しているのですが、 以下のようにコードを設定した場合、Button1をクリックしただけではずっと”取得中”という文字が表示されるだけで何も動きはありません。 そこで、フォーム自体を×ボタンで消すと、その直後にwebクエリのデータが指定のシートに反映されます。 Private Sub CommandButton1_Click() 'Webクエリ作成 'WebSelectionType = xlAllTables With ActiveSheet.QueryTables.Add( _ Connection:="URL;http://www.yahoo.co.jp", _ Destination:=Worksheets("abc").Cells(1, 1)) .WebSelectionType = xlAllTables '既定値 .Refresh End With End Sub なぜフォームを消さないとシートに反映されないのでしょうか? ボタンを押すだけで即座に反映され、その後も作業を続けられるようにしたいので、方法を教えてください。 よろしくお願いします。

  • エクセルのユーザーフォームでご教授ください

    マクロの知識はほぼなく、調べながらエクセルの入力用のユーザーフォームを作りましたが、うまく作動しません。 UserForm1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() Me.Show End Sub Private Sub Button_cxl_Click() Me.Hide End Sub Private Sub ok_Click() Dim RowNum As Long Dim Ctrl As Control RowNum = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(RowNum, 1).Value = Me.txt_date Cells(RowNum, 2).Value = Me.txt_guest Cells(RowNum, 3).Value = Me.txt_person Cells(RowNum, 4).Value = Me.txt_begin Cells(RowNum, 5).Value = Me.txt_finish For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" RowNum = 0 End If Next Ctrl Me.Hide ReleaseCapture UserForm2.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm2 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() End Sub Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub Private Sub ButtonNext_Click() Unload Me ReleaseCapture UserForm1.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ Module1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Sub ユーザーフォーム() UserForm1.Show End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm1を開き、Button_cxlで閉じず、もう一度Button_cxlをクリックで閉じる。 UserForm1を開き、Button_okでUserForm2を出し、ButtonEndをクリックでUserForm1にもどる(1と2を数度行き来しても同じ) UserForm1を開き、Button_okでUserForm2を出しButtonNextをクリックでUserForm1にもどりButton_cxlをクリックで閉じず、もう一度クリックしても閉じず、三回目で閉じる。 現状、エクセルを開いた直後のみで発生してます。 一度ユーザーフォームを出し、閉じたあとは意図通り動き、再度エクセルを開くまで発生しません。 ちなみにUserForm2の Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub 部分の、UserForm1.HideをUnload UserForm1にすると、「オブジェクト変数または With ブロック変数が設定されていません」と出てデバックでModule1の UserForm1.Show が黄色になります。 どこが悪いか教えてください。

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

  • フォーム上の任意のコントロール上でのイベントをまとめてハンドリングする方法

    .NETにおいて、フォーム上に配置されたコントロールで発生したイベントを、各コントロールごとではなくて、まとめてハンドルする方法はないでしょうか。 例えば次のようなフォームがあります。 (Button1, Button2, Button3は、フォームに配置されたボタンとします) Public Class MyForm   Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click   End Sub End Class ボタンが3つ程度の場合はこれで良いと思うのですが、例えば(極端に言えば)ボタンが100個ある場合、 Handles Button1.Click, Button2.Click, (途中省略.....) Button100.Click と書くしかないのでしょうか。 後で対象コントロールが増えたり減ったりした場合に間違いが起こりそうなので、このような書き方は避けたいです。 フォーム上のどのコントロールでも構わないからとにかくクリックイベントが発生したことを知るための方法はないでしょうか。 例えば次のようなかんじでハンドリングできないでしょうか。 Private Sub All_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォーム上の任意のコントロールでのClickイベント End Sub (環境はVB.NET2005です)

  • VBAでコマンドボタンを作成~実行するには

    いつもお世話になっております。 今回やりたいことは、 1 ワークシートからユーザーフォームのチェックボックス作成(多数変動) 2 「1」が数に変動があるため、最下段にコマンドボタン作成 3 「2」で作成したボタン実行で、チェック=Trueを印刷 です。 現在、3の手順で止まっています。 まず、 Private Sub UserForm_Initialize() 内で、 Set CMD = Me.Controls.Add("Forms.CommandButton.1") With CMD .name = PrintStart .Height = 30 .Width = Me.Width - 20 .Left = 10 .Top = 230 .Caption = "印刷する" End With としてボタンを作成しています。 次に Private Sub PrintStart_Click() 内で、先にテストがしたかったので、  for i = 1 to end  '(end = 変数)    name = Me.Controls("CheckBox" & i).Caption '(name = string変数) MsgBox (name) Next i としているのですが、ここで動作してくれない状況です。 ちなみにフォーム自体の大きさも、その時の行数に応じて自動生成にしているのですが、それをやめて、 あらかじめ縦になが~いフォームに固定しておいてボタンを置いておき、 そのボタン(CommandButton1)で上記のコードを実行すると、うまくいきました。 ただ、プログラマのみなさんなら分かってくれると思いますが、見た目ってこだわりたいですよね?ね? よろしくお願いします。

  • VBAのボタン操作について。

    For i=0 to 3 with Range("A" & (i+1)) with ActiveSheet.Buttons.Add(.Left,.Top,.Width,.Height) .caption="テストボタン" .OnAction="テストアクション" End with End wirh Sub テストアクション() MsgBox "あなたがクリックしたボタンは上から○番目のボタンです。" End sub 上記マクロを実行すると、セルA1,A2,A3にテストボタンが配置されます。 3つのボタンのどれかをクリックしたとき、テストアクションが実行されますが、 ○番目の○を求めるにはどうすればよいのでしょうか?

  • エクセルユーザーフォームで困ってます。

    エクセル初心者です。 自分のユーザーフォーム(住所、商品登録)を作りたくて大変困ってます。 下記は、ネットなどをみて貼り付けたのですが、上手くいきません。 まずTOPページを作り、ユーザーフォームを呼び出すボタンを作り、クリックすると フォームが出るようにしてあります。 そこに、自分の入力したいものをユーザーフォームにテキストでつくり、シート9に 登録ボタンを作りクリックしたら、シートに反映させたいと思ってます。 登録ボタンを押したら、入力画面はクリアにしたいです。 他にいろいろやりたい事もあるのですが、入力した順番に001・002・003と顧客番号をつけたり 検索ボタンを作って、名前や、顧客番号を入れると情報を呼び出したり、請求書用のプリントシートや、封筒シートに簡単に反映できればと思っています。 しかし、まだまだそこまではいかず、最初でつまずいてます。 現状は、フォームを呼び出すときに実行時エラーがでます。 どうしても、自分の使い勝手のいいものを作りたいので どうか、助けてください。大変まいってます。 長文になりますが、どうかよろしくお願いします。 下記の入力中のものをみていただけて、いろいろ意見をいただけるとありがたいです。 Sub FormShow() UserForm1.Show End Sub 'Sheet9へ書き込む Private Sub 登録_Click() Dim i As Integer With Worksheets(9) 'テキストボックスの値を書き出し For i = 1 To 80 .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text Next End With End Sub 'Formを呼び出したとき、Sheet9から読み込む Private Sub UserForm_Initialize() Dim i As Integer With Worksheets(9) 'テキストボックスの値を読み込み For i = 1 To 80 UserForm1.Controls("TextBox" & i).Text = .Range("B" & i) Next End With End Sub '終了ボタン Private Sub CommandButton2_Click() Unload Me End Sub

専門家に質問してみよう