2010年11月11日

UserFormsオブジェクト4.ComboBox

コンボボックスコントロール[ ComboBox* ]

 既に用意されているデータや、リスト化された値を表示するには、コンボボックスコントロールやリストボックスコントロールを使うと便利です。特にコンボボックスコントロールは、リストをドロップダウン表示したり、リストと照合して先読みすることができます。ワークシート上のセル範囲をリストとして指定することもできます。[ ComboBox* ]コントロールは、既定値のまま使うと、ユーザーからの値入力を受け付けてしまいます。

  • [ ComboBox1 ]をドロップダウンリストボックスとして使い、リストにセル範囲を指定
    Private Sub UserForm_Initialize()
      With ComboBox1
        .Style = fmStyleDropDownList
        .RowSource = "Sheet1!A1:C20"
      End With
    End Sub
     
    コンボボックスもリストボックスも、ワークシートのようにセルを持っていることが解ると、使い方に幅が出来ます。「セル」は「マス目」のことですが、その場所を指定するのに、[ Rangeプロパティ ]や[ Cellsプロパティ ]など、「行と列の番号」さえあれば場所を特定できるのと同じで、リスト中にも[ 多次元配列 ]という形で、データを収める事ができます。上の例では、複数列(A列からC列までの3列、1行目から20行目までのデータ)をリスト項目として指定しています。然しながら、コンボボックスもリストボックスも、既定値の状態で「枠」として見えるのは、一つしかありませんから、用意されている様々なプロパティを使って、リスト項目を表示したり、他のコントロールに渡す値を決めます。
     
  • Private Sub UserForm_Initialize()
      With ComboBox1
        .Style = fmStyleDropDownList
        .RowSource = "Sheet1!A1:C20"
        .TextColumn = 2
        .BoundColumn = 3
      End With
    End Sub
     
    Private Sub ComboBox1_Change()
      Range("D1") = ComboBox1.Value
    End Sub
     
    リストの既定値を[ TextColumn ]プロパティと[ BoundColumn ]プロパティで変更したこのVBAマクロを実行すると、リスト項目が多次元配列である事を理解できます。ドロップダウンしたリスト項目はA列のセルのデータ、選択したリスト項目はB列のデータ、選択した値はC列のデータが返されます。試しに、A列に氏名、B列に振り仮名、C列には重複しない番号を用意しておくと、[ ComboBox1 ]の[ Changeイベント ]でセルD1に入力される値は、リストで選択した人の「番号」になります。
     
  • Private Sub UserForm_Initialize()
       With ComboBox1
         .Style = fmStyleDropDownList
        .RowSource = "Sheet1!A1:C20"
        .TextColumn = 2
        .BoundColumn = 3
        .ColumnCount = 3
        .ColumnWidths = "50;50;50"
       End With
    End Sub
     
    [ ComboBox1 ]の横幅を大きめにして、上のコードを実行すると、[ RowSource ]プロパティで選択した複数列・複数行のデータ全てが、リストに表示されます。[ ColumnCount ]プロパティで、リストに表示させる列数を指定し、[ ColumnWidths ]プロパティで、その表示幅を指定します。
     
    コントロールが持つプロパティは、ユーザーフォームウィンドウでデザインする際に、予め設定しておきますが、例えば、オプションボタンコントロールと組み合わせて、リスト範囲やワークシートの切り替え後、データをあらためてリスト範囲にする場合など、マクロの中で変更できると、便利な場合もあります。
     
    リスト項目の設定には、必ずしも[ RowSource ]プロパティは必要ありません。反対に制約の多いこのプロパティは、使う機会が少ないでしょう。リストに項目を作成したり追加、変更する方法は、他にも用意されています。
     
  • リスト項目が固定値で数も少ない場合、[ Listプロパティ ]で、Array関数を使って配列を代入
      ComboBox1.List = Array("日", "月", "火", "水", "木", "金", "土")
     
  • リスト項目が変動値で、数も変わる場合、[ AddItemメソッド ]と条件式で項目を追加する
      With ThisWorkbook
        For i = 1 To .Sheets.Count
          If Left(.Sheets(i).Name, 5) = "Sheet" Then
            ComboBox1.AddItem .Sheets(i).Name
          End If
        Next
      End With
      'ブックの「Sheet*」という名前を持つシート名をリスト化する
     
  • フォルダ内にあるBMP画像の名称・作成日付・バイトサイズをリスト項目へ追加(多次元配列)
      F_Name = Dir(ThisWorkbook.Path & "\*.bmp", 0)
      i = 0
      Do While F_Name <> ""
        ComboBox1.AddItem F_Name
        With CreateObject("Scripting.FileSystemObject").GetFile(F_Name)
          ComboBox1.List(i, 1) = .DateCreated
          ComboBox1.List(i, 2) = Format(.Size, "#,##0") & "byte"
        End With
        i = i + 1
        F_Name = Dir()
      Loop
    '[ ColumnCount ]プロパティでリストに表示させる列数を指定し、[ ColumnWidths ]プロパティで、その表示幅を指定すると、ファイル名・作成日時・ファイルサイズを同時に表示できます。
     
  • 外部ファイル(CSV形式・テキスト形式・ログ形式など)のデータをリスト項目へ追加する
    外部ファイル(HTTPD.log)は、カンマ区切りでIP・日付・参照先ファイル名・転送サイズの順で、アクセスログが記録されているとします。コマンドボタンを押すことで、外部ログファイルを開き、リスト項目を作成します。
     
    Private Sub CommandButton1_Click()
      i = 0
      With CreateObject("Scripting.FileSystemObject").OpenTextFile( _
        ThisWorkbook.Path & "\HTTPD.log", 1, True, -2)
        Do While .AtEndOfLine <> True
          L_DAT = Split(.ReadLine, ",")
          With ComboBox1
            .AddItem L_DAT(0)
            .List(i, 1) = L_DAT(1)
            .List(i, 2) = L_DAT(2)
            .List(i, 3) = L_DAT(3)
          End With
          i = i + 1
        Loop
        .Close
      End With
      With ComboBox1
        .ColumnCount = 4
        .ColumnWidths = "50;50;50;50"
      End With
    End Sub
    '[ ColumnWidths ]プロパティで、表示幅を適程調整してください。
     
    上記のリスト項目の多次元配列をワークシートのセル、行、列で例えると、データを[ Split関数 ]によってカンマ毎に区切り、[ L_DAT ](1次元配列)に格納します。続いて[ AddItemメソッド ]で、行とA列を同時に追加し、[ Listプロパティ ]で、同じ行のB列・C列・D列のセルに、[ L_DAT ](1次元配列)から取り出した値を設定しています。
     
    コンボボックス・(ドロップダウン)・リストボックスのリストには、番号が割り当てられています。リスト項目の設定に、どのような関数・メソッドを使ったかで、コントロールが返す番号[ ListIndexプロパティ ]の最小値が変わります。例えば、[ ComboBox1 ]の選択結果によって返される[ ListIndexプロパティ ]によって、[ ListBox1 ]のリスト項目の基となる配列の内容を変える、というコントロール同士を連携させるときなどは、[ Option Base ステートメント ]を使って配列の添字の最小値を指定することで、エラーを未然に防ぐことにもなります。
posted by くきお at 11:11| Comment(0) | UserFormオブジェクト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。