• ベストアンサー

コンボボックスのリストについて(エクセル、マクロ)

またお世話になります。 多分簡単な疑問だと思うのですが・・・、 ユーザーフォームのコンボボックスのRowsourceの 設定に関して可変式にしたいので以下のように マクロ(一部を抜粋)を組んでみました。 Dim b As Integer b = 2 Do b = b + 1 Loop Until Sheets(3).Cells(b, "A") = "" ComboBox1.RowSource = Range(Cells(2, "A"), Cells(b - 1, "C")) が、「型が一致しません」と出てうまくいきません。 どうしたらよいでしょうか? また、 A列   B列 C列 2005/1/1 東京 10 ・ ・ ・ のようにシートには並んでいるものを コンボボックスのリストとして取り入れたいのですが 変な5桁の数字しか現れず(たぶんこの数字は 2005/1/1を標準値化した数値なのでしょうが) 3つきれいにそろって表れません。 こちらの方も解決していただけないでしょうか?

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

>選択したものが(2005/1/1 東京 10を選択したなら2005/1/1 東京 10)と並べて表示... 3つのセルの表示文字列を連結して AddItem します。 Private Sub UserForm_Activate()      Dim lngLastRow As Long, i As Long   Dim strBuf As String      'ComboBox初期化   With Me.ComboBox1     .Clear 'クリア     .ColumnCount = 1 '1列   End With      'ComboBoxアイテムセット   With Sheets("Sheet1") 'データソースがSheet1の場合     lngLastRow = .Range("A1").End(xlDown).Row     For i = 2 To lngLastRow       strBuf = _         .Cells(i, "A").Text & vbTab & _         .Cells(i, "B").Text & vbTab & _         .Cells(i, "C").Text       Me.ComboBox1.AddItem strBuf     Next i   End With    End Sub >ちなみに教えていただいたコードを実行しますと2005/1/1 東京 10を選択した場合「東京」と表示されます。 コメントに書いておきましたが、BoundColumn プロパティーの設定によるものです。 > .BoundColumn = 1 '値として格納されるデータの列番号 2005/1/1 なら .BoundColumn = 0 となります。 ComboBox コントロールはリスト選択後、BoundColumn で指定した列が表示されます。

oyasaisanba
質問者

お礼

おかげさまでうまくいきました。 実は最初はうまくいかなかったのですがプロパティウィンドウで変に設定をいじっていたのを戻したらうまくいきました。(日付の標準値である5桁の数字が表れた原因だったのかもしれません。)

その他の回答 (5)

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

#2です。補足に対して言い訳ですみませんが・・・ >プロパティシートを出して、Textcolumnの数値をいじってみましたが、1の場合には日付の整数値、2や3の場合にはちゃんと「東京」や「10」のように表示されるのですが、単独でしか表示されず ------ それはそうですね、BoundColumnは1列しか指定させてくれないようですね。 3列指定したければ、擬似的に前もって3列結合したデータを別列に持つか、プログラムでクリックイベント後にコンボのテキストに3列結合したデータを自分でセットせざるを得ないでしょう。 >(範囲指定を)可変にしたい この点には私のは答えていません。範囲の表現方法 が(他の例を含めると)●Range()式というのと●A1:C3と指定するのとあり、 画面で指定する場合は当然前者の方式ですということを言いたかったまでです。 VBAの場合は本例では、前者(文字列)のようで2番目のセルの行数を可変(変数で指定)指定にすることになります。 ComboBox1.RowSource = Range(Cells(2・・・と 「Range」をつけておられたのが 災いしたのでしょう。 ・・ということを言いたかったのですが。 全般的には#1、#4が詳述されていますので 省略します。

oyasaisanba
質問者

お礼

了解しました。私もなかなかうまくいかずに焦っていた面もあったと思います。わざわざご丁寧に補足していただいて申し訳ないです。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

【前半部の補足】 RowSource プロパティーにはセル範囲を表す”文字列”を設定しなければなりません。つまり、 ComboBox1.RowSource = "Sheet1!A1:C100" または、 With Sheets("Sheet1")   sSource = .Name & "!" & .Range("A1:C100").Address End With ComboBox1.RowSource = sSource のようしてセル範囲を文字列で指定します。また、ちゃんとシートを指定しないとアクティブシートの A1:C100 が RowSource にセットされますので、注意が必要です。 余談ですが、最終行番号を受ける変数の型はLong型にした方が良いですね。 Dim b As Integer --> Dim b As Long 【後半部】 サンプルコードを示します。RowSource ではなく、List プロパティを使っています。試してみたのですが、RowSource では日付がシリアル値で表示されてしまいました。AddItem で 日付を文字列をして登録していくしかないかなぁと思いましたが、List プロパティでできました。理由は聞かないで下さい(...不明です) '-------- Sample -------------------------------------------------- Private Sub UserForm_Initialize()   Dim lngLastRow As Long   Dim Buf As Variant   'ComboBox初期化   With ComboBox1     .Clear 'クリア     .ColumnCount = 3 '3列     .BoundColumn = 1 '値として格納されるデータの列番号     .ColumnWidths = "80pt;40pt;40pt" '各列の表示幅   End With   'ComboBoxアイテムセット   With Sheets("Sheet1") 'データソースがSheet1の場合     '最終行番号取得     lngLastRow = .Range("A1").End(xlDown).Row     'データ範囲を配列へ     Buf = .Range("A2:C" & lngLastRow)     'ComboBoxコントロールへセット     ComboBox1.List = Buf   End With End Sub '------------------------------------------------------------------ 最後に、、えーと、ちょっとわからないのですが、、、 ひょっとして、ComboBoxのリストを選択した後に、 2005/1/1 東京 10 と並べて表示したいのですか?

oyasaisanba
質問者

補足

>余談ですが、最終行番号を受ける変数の型はLong型にした方が良いですね。 これは意外に重要な指摘ですね。ありがとうございます。 >ひょっとして、ComboBoxのリストを選択した後に、 2005/1/1 東京 10と並べて表示したいのですか? ユーザーフォーム内でコンボボックスのリストから特定のものを選択した際、コンボボックスのテキストボックス部分みたいなところに選択したものが(2005/1/1 東京 10を選択したなら2005/1/1 東京 10)と並べて表示できるようにしたいのです。ひょっとしてこれは無理なことなのでしょうか?ちなみに教えていただいたコードを実行しますと2005/1/1 東京 10を選択した場合「東京」と表示されます。

回答No.3

No.1です。 私のPCではちゃんと日付の形式で表示されるのですが。。。(Excel2000、Win2000です) セルの属性はどうなっているのでしょうか?無理やりですが、セルの属性をテキストにして、日付をテキストとして入力すると表示できるかもしれません。

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

>変な5桁の数字しか現れず(たぶんこの数字は 2005/1/1を標準値化した数値なのでしょうが エクセルでは日付は日付シリアル値といって1900年初からの日数を整数値で持っているのは有名な話です。昨日も似た質問さありました。 「標準値化した数」でなく、本来は整数のこちらが本筋で、見た目の日付は書式で帰られた飾られた姿です。 こうすることで日数計算が単純になります。 後半の質問は UserForm1をデザインモードにして、コンボボックスのプロパティシートを出すと、Textcolumnがあるから、これを1,2,3に順次変えてみて、ボックスに値の現れ方(どの列が現れるか)納得してください。 前半の質問も、RowSourceはA1:C4のようにプロパティウインドウで指定することを考えてください。 VB,アクセスVBA、エクセルVBAで微妙に違うようで混乱します。

oyasaisanba
質問者

補足

うーん、よく分からないのですがプロパティウインドウで指定すると「A1」などのようにセルを明示しないといけないのではないですか?元にするリストが変わったときにも対応させるようにしたいのです。 プロパティシートを出して、Textcolumnの数値をいじってみましたが、1の場合には日付の整数値、2や3の場合にはちゃんと「東京」や「10」のように表示されるのですが、単独でしか表示されず、やはり「2005/1/1 東京 10」のように並んで表示されません。なんとかならないものですかね。

回答No.1

こんな風にしてみてはどうでしょうか? Dim b As Integer b = 2 Do b = b + 1 Loop Until Sheets(3).Cells(b, "A") = "" ComboBox1.RowSource = "A1:C" & b End Sub

oyasaisanba
質問者

お礼

なるほど! 言われてみたら単純にその通りですね。 前半部はこれでバッチリです! あとはどなたか後半部について答えていただけると幸いなのですが・・・。

関連するQ&A

  • EXCEL VBA ユーザーフォームコンボボックスのRowSourceの設定方法について

    EXCEL VBAのユーザーフォーム内のコンボボックスのRowSourceの設定方法について質問があります。 基本的な質問かもしれませんが、うまく検索できませんでした。 「リスト一覧」シートに     A1  B1   C1 1行 りんご ばなな ぶどう 2行 100円  200円 300円 3行 110円  210円 310円 という値を入れる。 ユーザーフォーム内にコンボボックスを2つ設置し、 コンボボックス1の値が「リスト一覧」シートの1行の値と同じときに コンボボックス2のRowSourceを同じ列の2行、3行に設定する。 Private Sub ComboBox1_Change() Dim i As Integer  i = 1   Do Until Sheets("リスト一覧").Cells(1, i) = ComboBox1.Value    i = i + 1   Loop ComboBox2.RowSource = i列の2行目及び3行目.Address End Sub というコードになると思うのですが、うまくいきません。 どうぞよろしくお願いいたします。

  • EXCEL VBAのコンボボックスに取り込むリストについて

    すいません、EXCEL VBAのコンボボックスにデータを取り込む方法について教えていただきたいことがあります。 (1)「シート1」のA列にデータが入力されている (2)ユーザーフォームにコンボボックスを設置し、このA列のデータを取り込む。 このときにA列に入っているデータの数だけ取り組むにはどうしたらいいのでしょうか。 シート1    A列 1行 11 2行 21 3行 31  ・   ・  ・   ・ Private Sub UserForm_Initialize() ComboBox1.RowSource = Sheets("シート1").Range("?") End Sub ?の部分がわかりません。End(xlup)のようなものを使ってデータが入っている最後の行を調べるのかと思いましたが、どうもうまくいきませんでした。 よろしくお願いします。

  • VBAを使用しコンボボックスにリストを設定する方法

    いつもお世話になっております。 現在コンボボックスにリストを設定する方法について悩んでいます。 バージョンはExcel2003です。 コンボボックスに指定したい列がA列とB列なら通常下記のようにすると思います。     With ComboBox1       .ColumnCount = 2       .ColumnWidths = "50;50"       .RowSource = "Sheet1!A2:B5"     End With ただ今回はA列とC列をリストに設定したいと思い、下記のような設定にしたのですがうまく設定できません。     With ComboBox1       .ColumnCount = 2       .ColumnWidths = "50;50"       .RowSource = "Sheet1!A2:A5;C2:C5"     End With そもそもRowSource は連続的なデータを設定する場合のプロパティだと思うのですが、このように飛んだ列のデータを効率的に指定するにはどのようにするのが一番いいのでしょうか? 分かる方がいっらしゃいましたらご教授願います。

  • excelのコンボボックスでの階層リスト表示

    (すいません、再投稿します) excelのコンボボックスで、階層にわけてリスト表示させたいのですが、うまくいきません。 数日悩んでまして、どなたか教えてもらえませんか。 シート1:会社名    1列目:会社名  2列目:ID シート2:事業部名   1列目:事業部名 2列目:ID シート3:部門名     1列目:部門名  2列目:ID シート4:担当名     1列目:担当名  2列目:ID ユーザーフォームにそれぞれのコンボボックスを作っています。 ComboBox1:会社名     TextBox1:ID ComboBox2:事業部名    TextBox2:ID ComboBox3:部門名     TextBox3:ID ComboBox4:担当名     TextBox4:ID   たとえば会社名がAのときは、ComboBox2ではAの事業部だけが表示される、というようなかんじです。 同時に隣のIDももってこないといけない為に、苦戦しています。助けてください。。。。 下記記述は3番、まではうまくいくのですが、”4番TextBox2の値代入”がうまくいきません。 -------- Option Explicit Dim シート名 As String Dim 行 As Long Dim 範囲 As String Dim 事業部範囲 As String '-1---ComboBox1------------------- Private Sub ComboBox1_DropButtonClick() シート名 = "会社名" Worksheets(シート名).Activate 'ワークシートをアクティブにする Range("A1").CurrentRegion.Select 'アクティブセル領域を選択する With Selection 行 = .Rows.Count '同上領域の行数を取得する 範囲 = .Cells(1, 1).Address & ":" & .Cells(行, 1).Address '同上領域のアドレスを変数に End With ComboBox1.RowSource = シート名 & "!" & 範囲 'コンボボックスのリストのソースを設定する End Sub '-2----ComboBox1------------------- Private Sub ComboBox1_Click() 'コンボボックス上でクリックされると実行される シート名 = "会社名" 行 = ComboBox1.ListIndex + 1 'コンボボックスで選択された行 + 1 TextBox1.Text = Worksheets(シート名).Cells(行, 2) '対応するセルの値をテキストボックスに End Sub '-3----ComboBox2------------------- Private Sub ComboBox1_Change() ' ComboBox1 が変化した時の処理 シート名 = "事業部名" Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox1.ListIndex ' ComboBox1 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容 Worksheets(シート名).Activate Range("A1:A6").CurrentRegion.Select With Selection 事業部範囲 = .Cells(1, 1).Address & ":" & .Cells(6, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 1 Worksheets(シート名).Activate Range("A7:A11").CurrentRegion.Select With Selection 事業部範囲 = .Cells(7, 1).Address & ":" & .Cells(11, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 2 Worksheets(シート名).Activate Range("A12:A15").CurrentRegion.Select With Selection 事業部範囲 = .Cells(12, 1).Address & ":" & .Cells(15, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 3 Worksheets(シート名).Activate Range("A16:A25").CurrentRegion.Select With Selection 事業部範囲 = .Cells(16, 1).Address & ":" & .Cells(25, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 End Select End With End Sub '---4--TextBox2に値代入-------------------- Private Sub ComboBox2_Click() Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox2.ListIndex ' ComboBox2 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容 Range("A1:A6") シート名 = "事業部名" Worksheets(シート名).Activate Range("A1:B6").CurrentRegion.Select With Selection 事業部範囲 = .Cells(1, 2).Address & ":" & .Cells(6, 2).Address End With '行 = ComboBox2.ListIndex + 1 TextBox2.Text = Worksheets(シート名).Cells(事業部範囲, 2) Case 1 Case 2 Case 3 End Select End With End Sub '----5-Close-------------------- Private Sub UserForm_Deacti Unload UserForm1 End Sub

  • VBA コンボボックスのリストをセルから取得

    VBAでのコンボボックスのリストをセルD7~セルの中にデータが空になっている所まで、セルから取得しコンボボックスに入れたいのですが・・ Dim celJ As Integer  celJ = 4  Do Until Cells(7,celJ).Value = ""   ComboBox1.AddItem (Worksheets("表").Cells(7, celJ).Value)   celJ = celJ + 1 Loop これでは失敗するのですが、どうすればいいでしょうか? 最初D7には何もデータが入っていません。どんどんD7~からデータを書き込んでいき、コンボボックスにも反映させていきたいのですがアドバイスお願い致します。

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • エクセルVBAでコンボボックスを使いシートのデータをリストアップする方法

    VBAの詳しい方教えて下さい。 ConboBox1でSheets1のA列に入ってるデータをピックアップします。 そのピックアップされたのがAAなら 次のConboBox2でSheets2のA列に入ってるデータをピックアップして BBならSheets3のA列に入ってるデータをピックアップたいのですが、どのようにすれば良いのでしょうか。 ComboBox1.RowSource = Sheets("Sheets1").Range("A1:A2").Address もしComboBox1にAAが入ったら ComboBox2.RowSource = Sheets("Sheets2").Range("A1:A2").Address そして また もし ComboBox1にBBが入ったら ComboBox2.RowSource = Sheets("Sheets3").Range("A1:A2").Address これをひとつのUserFormで行いたいのです。 得意先別・商品別・単価をピックアップしたいのです。 教えて下さい。 宜しくお願い致します。

  • 同じコンボボックス、リストボックスを使うには?

    よろしくお願いします。 今、ユーザーフォームを使って製造計画表を作っています。 コンボボックスで会社名、リストボックスで会社ごとの製品名を選択させるとこまで出来ました。 1日に3つの製品を作ることが出来るので、同じ中身のコンボボックス、リストボックスを使って3つ作りたいと思っています。 ユーザーフォームの形的にはこのような感じですが。 1. コンボボックス  リストボックス 2. コンボボックス  リストボックス 3. コンボボックス  リストボックス 今は、1.のとこだけは出来たのですが、2.3.は1.と同じコードをコピーして必要と思われるとこだけをコンボボックス2と変えたりしてみたのですが、上手くいきませんでした。こんなコードですが。 Private Sub UserForm_initialize() 'ComboBox1セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("Sheet1") Do While .Cells(1, ico) <> "" Me.ComboBox1.AddItem .Cells(1, ico).Value ico = ico + 1 Loop End With Me.ComboBox1.SetFocus End Sub Private Sub ComboBox1_Change() 'ListBox1セット Dim ico As Long 'Me.ListBox1.Clear ico = Me.ComboBox1.ListIndex + 1 With ThisWorkbook.Worksheets("Sheet1") Me.ListBox1.List = .Range(.Cells(2, ico), _ .Cells(.Cells(Rows.Count, ico).End(xlUp).Row, ico)).Value End With End Sub VBAも初めたばかりで質問の内容もわかりづらいとも思いますが、よろしくお願いします。

  • VB2005 コンボボックスのリスト

    csvファイルをdatagridview1に読み込みました。 datagridview1の指定列のデータからコンボボックスに値を追加したいと考えました。 do loop でdatagridview1の行数分リスト追加しました。 コンボボックス.items.add(指定列の内容) 作成されたリストは A A A B B B C C ・・・・・ となりました。 これを A B C にしたいのですが・・・・ どういう方法がよろしいでしょうか?

  • win7 コンボボックス複数配置

    VBA初心者です。 ユ-ザ-フォ-ムにてコンボボックスを3箇所配置し、それぞれ別シ-トを参照しA列にコンボ1、B列にコンボ2、C列にコンボ3にするにはどうしたらいいでしょうか、教えてください。 Private Sub UserForm_Initialize() Dim i As Integer combobox1.Clear For i = 1 To Worksheets("項目デ-タ").Cells(Rows.Count, 1).End(xlUp).Row combobox1.AddItem Worksheets("項目デ-タ").Cells(i + 2, 1).Value Next End Sub この文章は1つはできますが2つ3つ・・・の文章がわかりません。お願いします。 エクセル2010を使用してます。

専門家に質問してみよう