• ベストアンサー

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

またお世話になります。 多分簡単な疑問だと思うのですが・・・、 ユーザーフォームのコンボボックスの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/17069)
回答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/17069)
回答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

専門家に質問してみよう