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

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

ただいまの
回答率

90.51%

  • VBA

    2296questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,566

King_of_Flies

score 299

お疲れ様です。
Takkoです。

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

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

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

実装は下記です。

Private Sub WorkSheet_Change(ByVal Target As Range) 'WorkSheet変更時のイベントを拾いません。
    If Target.Row >= 6 And Target.Column = 3 Then
        Call UserForm_Initialize
    End If
End Sub

Private Sub UserForm_Initialize()
    For i = 6 To rowsCount
        ComboBox1.AddItem Cells(i, 3).Value 'Activexで作成したコントロールですが、オブジェクトが必要ですと表示されます。
    Next i
End Sub

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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/13 13:47

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

    キャンセル

0

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

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

参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • VBA

    2296questions

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