• 締切済み

全てのコンボボックスに同じchangeイベント

VBA初心者です。お知恵を貸してください。 UserForm上にある全てのコンボボックス(1つを除く)に同じchangeイベントを適応させたいです。 【動き】 1.UserForm起動 2.フォーム上のSheetComboBoxからシートを選択 3.選択したシートを参照し、フォーム上にシートにある行数分ComboBoxi(変数)_1〜3、TextBoxi(変数)を作成。ComboBoxにシートの値を参照した「文字列 数値」をセット。TextBoxは空欄。 4.ComboBoxi_1〜3が変更されるごとに、TextBoxiにComboBoxの内容の数値部分を計上する。 5.登録ボタンをクリックしてComboBoxi_1〜3の内容をシートの特定列に転記。 3までは作成することができましたが、4で行き詰まってしまいました。 コンボボックスのコントロール名は動的なので、どのようにchangeイベントを書けばいいのか、また、コンボボックスの量が多い(1行3つ*行数分)ので、すべてに対して書かなければならないのか…ということです。 何か一括でchangeできるような方法をご存知の方は教えていただけないでしょうか。どうぞよろしくお願いいたします。

みんなの回答

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.4

No.1の追加です。 動的にchangeイベントを作成する単純な一例です。 UserForm3やClass3及び"ComboBox" & iなどは実際のものに変更してください。 コンボボックスが変更されたらコンボボックスのオブジェクト名をメッセージで出します。 3個コンボボックスが動的に作成されたとして1 To 3にしてます。 フォームのコード Private mComboBox() As Class3 Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 3 Call Make_Event(i) Next End Sub Function Make_Event(ByVal i As Long) ReDim Preserve mComboBox(i) Set mComboBox(i) = New Class3 mComboBox(i).SetCtrl Me.Controls("ComboBox" & i), i End Function Class3のコード Private WithEvents Target As MSForms.ComboBox Private i As Long '新しくイベントを作成する Public Sub SetCtrl(New_Ctrl As MSForms.ComboBox, ByVal ix As Long) Set Target = New_Ctrl i = ix End Sub '各コンボボックスに設定される共通Changeイベント Private Sub Target_Change() MsgBox UserForm3.Controls("ComboBox" & i).Name End Sub

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.3

No.1の訂正です。 > それぞれのコンボボックスに対応した「文字列 数値」をセットができる ではなくて 4.ComboBoxi_1〜3が変更されるごとに、TextBoxiにComboBoxの内容の数値部分を計上する。 ができるでした。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

言いたいことは、「「Excel vba 複数 コントロール イベント 」などでGoogle照会して記事を選び、勉強するしかないでしょう。」ということ。  役立たなくてごめん。解説するとなると文章作成に時間がかかって大変。 ーー これはVBAでは上級の課題です。でもよくあるニーズとは思います。 こんなところへ質問するのは、質問者はそういうことも知らないレベルらしいが。 回答文章よりも、WEB記事の方が詳しい解説に出くわすのは間違いないだろう。理解もしたい(必要だろう)なら。コピペで済むコード作製(丸投げ)を要求をしないという前提ではね。 「Excel vba vba 複数 イベント まとめる 」などでGoogle照会して、記事を選び、勉強するしかないでしょう。 小生もWEB記事などを探して、下記(1)の方法を何度も挑戦しているが、時々やるせいもあって、 未だにスラスラ再現できない。 (1)クラスの仕組みの利用 (2)クラスの仕組みの利用以外の方法 のうち、(2)はよく判りません。ほぼ無いのでしょう。 ーー  とりあえず急ぐなら、コントロールごとのイベントルーチンを、コントロールの 数だけコピペして、多少コードを修正して、作る方法を勧めます。  泥臭くて、プライドを傷つける方法だが、結果的には当面では、速い方法だと思う。 (https://blog.goo.ne.jp/pc_college/e/9ca2b0c452e9e691cad1dbd2783868cf の、「複数のコントロールのイベントを一つのプロシージャにまとめる(ExcelVBA)」の 前半の出発点の方法です) WEBの記事は探せば相当数あるが、読み解くのは難しい(個人経験)。 ーー コードを記述する場所が複数個所にわたりバラバラで、初学者に理解が難しいと思う面はある。 関係するのが複数あり、関連性を読み解くことに戸惑う。 (1)クラスモジュールでのコード作製 (2)フォームのモジュール (3)標準モジュール この(1)が、JavaなどからVBAに入って、普通にクラスのことを経験している人には有利だと思うが、 VBAでは、あまり「クラスを使う使い道」のニーズを感じることはない。また解説本も極く少ない。 それだけ、一般人は本格的に使っていないということかも。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.1

動的にイベントを作成すればいけると思います。 以下は動的にコマンドボタンのクリックイベントを作成するという方法ですが、同じ方法でchangeイベントを作成すればいけるのではないでしょうか。 ユーザフォームのボタンにハイパーリンクを割当てたい https://okwave.jp/qa/q9797632.html changeイベントで引数付きのサブプロシージャを呼び出すようにすれば、それぞれのコンボボックスに対応した「文字列 数値」をセットができると思います。

関連するQ&A