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

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

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

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

Q&A

解決済

2回答

10313閲覧

VBA 動的コンボボックスの作成

King_of_Flies

総合スコア382

VBA

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

0グッド

0クリップ

投稿2017/10/12 01:39

編集2017/10/12 03:00

お疲れ様です。
Takkoです。

VBAである列にデータが入力されたら動的にコンボボックスに
そのデータを配列として収めたいです。
今のところ
「列にデータ挿入した」をトリガーとしてコンボボックスに配列を挿入する方法がわかっておらず、仮作成の段階になっています。

また、列データを取得する動作はできているのですが、
それをコンボボックスのオブジェクトへの挿入ができていません。

フォーム上のオブジェクトは
=EMBED("Forms.ComboBox.1","")
となっていて、

実装は下記です。

VBA

1 2Private Sub WorkSheet_Change(ByVal Target As Range) 'WorkSheet変更時のイベントを拾いません。 3 If Target.Row >= 6 And Target.Column = 3 Then 4 Call UserForm_Initialize 5 End If 6End Sub 7 8Private Sub UserForm_Initialize() 9 For i = 6 To rowsCount 10 ComboBox1.AddItem Cells(i, 3).Value 'Activexで作成したコントロールですが、オブジェクトが必要ですと表示されます。 11 Next i 12End Sub

実データとしては、C6セルからデータ入力され、
C6~CXXXXまでの行にデータが入っています。

知りたいことを纏めますと、下記二点です。

1.
「セルにデータを入れた」というアクションをトリガーとして、
プロシージャを呼び出し、UserForm_Initialize()を呼び出す方法。

2.
コンボボックスのオブジェクトに選択枝を入れ込む方法

以上、よろしくお願いします。

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

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

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

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

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

guest

回答2

0

もし、コンボボックスが該当列データのリスト、というのであれば、
名前の定義を使えばプログラムで処理しなくても対応できますね。

名前の定義、動的、で検索すればサンプルが出てくると思います。
(参照範囲に例えば=Offset(A1,0,0,Counta(A:A))

参考まで。

投稿2017/10/13 05:02

ExcelVBAer

総合スコア1175

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

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

0

ベストアンサー

まず確認したい点が2点あります。

確認1:
>フォーム上のオブジェクトは =EMBED("Forms.ComboBox.1","") となっていて
とのことですが、コンボボックスを貼り付けたのはユーザーフォームですか?
=EMBED("Forms.ComboBox.1","")という記述があることから、シート上に貼り付けたのではないかと思うのですが、どうでしょうか?

確認2:
コンボボックスに値を追加する関数名がUserForm_Initialize()となっていますが、これはユーザーフォームの初期化イベントでしょうか?

確認1とも関連しますが、シート上に貼り付けたコンボボックスを操作するのならそのシートの関数内でしかオブジェクトを見つけられません。
※もしユーザーフォームの初期化時にシート上のコンボボックスを制御したいのなら、Sheet1.ComboBox1のようにシートを明示する必要があります。
コード中のコメントにオブジェクトが認識できていないような記載がされているのは、このためではないかと思います。

例えばSheet1に設置したコンボボックスを制御するのなら、Sheet1シートの関数として実装しましょう。
設置したシート外から制御する場合は、対象シートを明示しましょう。

①「セルにデータを入れた」というアクションをトリガー

続いて知りたいこととして記載いただいた2点について。
セル値を変更を受けてイベント処理する方法は、提示いただいたコードのWorksheet_Change関数で動作するはずです。

この記述をしていて、セル変更時に処理されていないのであれば、
(1)コードの実装箇所が対象のシートでない。
(2)コンボボックスコントロールを貼り付けた時にデザインモードのままになっている
といったあたりが可能性として考えられます。

②コンボボックスのオブジェクトに選択枝を入れ込む方法

コンボボックスへの値の追加は、コンボボックスを設置したシートの関数として記述しているのならComboBox1.AddItem Cells(i, 3).Valueという記述で可能です。
他シートや標準モジュール、ユーザーフォームから操作する場合は、前述のとおり設置したシートも明示する必要があります。

ただ記述いただいたコードでは値の追加しかしていないため、セルの値を変更するたびに選択候補が増殖していってしまいます。
選択候補を追加する前にコンボボックスをクリアする必要があると思います。

サンプル

以下は上記を踏まえたサンプルコードです。

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row >= 6 And Target.Column = 3 Then Call MakeCombo() End If End Sub Private Sub MakeCombo() Dim iRow As Integer Dim rowsCount As Integer rowsCount = 100 '暫定で100行としています。 'コンボボックスの初期化 Me.ComboBox1.Clear For iRow = 6 To rowsCount 'セルの値が空でなければコンボに追加(これ以外にも重複チェックなどもあった方がいいかもしれません。) If Cells(iRow, 3).Value <> "" Then ComboBox1.AddItem Cells(iRow, 3).Value End If Next End Sub

関数名を変えた程度でほとんど提示いただいた内容と同じですが、全てコンボボックスを設置したシートの関数として記述する、というところが注意点です。

参考になれば幸いです。

投稿2017/10/12 09:55

jawa

総合スコア3013

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

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

King_of_Flies

2017/10/13 04:47

わかりやすい回答ありがとうございます。 前日、コンボボックスの初期化処理はが必要ということに思い至ったので、 その処理についてはおっしゃる通りで、初期化処理を追加いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問