• ベストアンサー

Excel VBA ユーザーフォームのコンボボックスに表示する値の入力方法

Excel Xを使用して、VBAのユーザフォームにコンボボックスを作りましたが、どうしてもコンボボックス内に表示する値の入力方法が分かりません。 WEBや本などで「これ」と思われるものを実験していますが、どれも表示することができません。 できるだけ詳しく教えていただけませんか? したいことは、  cbocenter というコンボボックスに値を出します。  値は List シートの A2 から A18 に入力済みです。  それと値から選択した値を data シートの J列 に  表示させたいのです。(行の指定はできています) 本当に困ってます。よろしくお願いします。

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

  • ベストアンサー
noname#27115
noname#27115
回答No.7

#2です。 全容が見えないので何とも言えないのですが、現在アクティブのCellがJ上にある場合、次のコードで放り込めます。 VBAがそこそこわかっておられるようなので、このヒントで組みこんでもらえるのでないでしょうか? Excelの場合、コンボボックスに1列しか表示できないので、とりあえず、その値を放り込んで残りの値(shinsei hizuke bangou)はlookup関係の関数を用いれば、引っ張ってこられると思います。Accessのコンボだと、コンボに列方向にも値を持たせられるんですが、、、Excel For Macにこれが採用されているなら、これを利用した方が簡単かと思います。 Private Sub ComboCenter_Change() 'Private Sub ComboCenter_Click() ← Click イベントでもいいかも Dim Num As Integer Num = ComboCenter.ListIndex If ActiveCell.Column = 10 Then ActiveCell = Worksheets("List").Cells(Num + 2, 1) End If End Sub

39call
質問者

お礼

本当にたびたびありがとうございました。 教えていただいた上記の記述は結局どうしていいか分からなかったのですが、「次へ」で他のテキストボックスをクリアにする記述をしたら、なんと次々にデータを入力してもちゃんと次の新しい行に転記されるようになりました。(なんでだろ、不思議...) というわけで、最後の難問だったコンボボックスが解決できて、完成でしました。本当に長々おつきあいいただき、ありがとうございます!!

その他の回答 (6)

noname#27115
noname#27115
回答No.6

#2です。 > UserFormのGeneralの中で上記の構文を入力して こういう質問をされると言うことは、WinとMacで仕様が違うのかな? とりあえず、下のコードをまんま貼ってもらうと ---------------------------------------------------------------------- Private Sub UserForm_Initialize() Dim i As Long For i = 2 To 18 ComboCenter.AddItem Sheets("List").Cells(i, 1) Next i End Sub ---------------------------------------------------------------------- ってな感じで 仕切られて表示されないですか?こうなっていればそれで動くと思います。 一度、デバッグのステップインでどんな値が Sheets("List").Cells(i, 1) に入っているか見てもらえませんか? それとうっかりしていましたが、、UserFormを使うとUserForm起動時にフォーカスがワークシートの方へ移れないので、2つ目からのデータ入力位置のCellが指定できませんね。規則性があるのならコードで制御できますが、任意の場所へとなるとその都度、UserFormを閉じないといけません。 このあたり、どうされますでしょうか? それを考えると コントロールツールボックスのコンボボックス の方が現実的な感じがします。

39call
質問者

補足

いえいえ、単に私が分かっていないだけなんです、すいません! ユーザーフォームに「次へ(tsugi)」というコマンドボタンを作ってありまして、コード欄には、tsugi-Click でテキストボックスやオプションボタンの内容をdataシートに転記するようにしてあります。以下のような感じです。 ここに教えていただいたコードを貼ったところ、無事コンボボックス内に項目が表示されました!! で...、コンボボックスで選択した内容を data シートの J列に表示させるにはどうしたら良いのでしょう? 本当にお手間を撮らせてしまってすいません。 ----------------------------------------------------- Private Sub tsugi_Click() Worksheets("date").Select Range("A65536").End(xlUp).Offset(1, 0).Select With ActiveCell .Offset(0, 0) = txtshinsei.Text .Offset(0, 1) = txthizuke.Text .Offset(0, 4) = txtbangou.Text If touroku.Value = True Then .Offset(0, 2) = "登録" ElseIf sakujyo.Value = True Then .Offset(0, 2) = "削除" ElseIf henkou.Value = True Then .Offset(0, 2) = "変更" End If

noname#27115
noname#27115
回答No.5

#2です。 ' もし、値がプロパティーで設定できなかったら、 ' 次のコードで設定してください。 ' イベントは別のイベントでも可能です。 Private Sub UserForm_Initialize() Dim i As Long For i = 2 To 18 ComboCenter.AddItem Sheets("List").Cells(i, 1) Next i End Sub

39call
質問者

補足

ありがとうございます、UserFormのGeneralの中で上記の構文を入力して、実際に選択した値を表示するシート(data)のworksheet-SelectionChangeに、Public pRow As Long...以下の構文を書けば良いのでしょうか。 試してみたのですが、やはりコンボボックスに値が表示されないのです。 他に方法はありませんか? よろしくお願いします。

noname#27115
noname#27115
回答No.4

#2です。 > できるだけ詳しく教えていただけませんか? ということでしたので。。。 Listの値は単にプロパティーで設定すれば、どちらの場合でもOKです。 で、、どの行かの指定は #2にあるように Worksheet_SelectionChange が発生した時に その Row(行)の値をPublic 変数(myRow)に代入してあげるのです。そうしてやれば、どこからでも利用できます。 で、、後、コンボボックスで値を取得した後、Cells(myRow + 修正値,10) の位置に目的の値を表示してやればいいのです。 今回の場合は。。。 表示先 = Worksheets("list").Cells(myRow, 10) 取得先 = Worksheets("list").Cells(Num + 2, 1) となります。 Numはコンボボックスの選択された値のIndex値です。 後はコントロールボックスのコンボボックスなら#2のコード通り、#1さんの言うフォームのコンボボックスであれば、そのコンボボックスのChageかGotFocusのイベントに先のコードを書けばいいと思います。

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

良くお判かりのようですが、下記では、どこが質問を満たさないか、あれば補足してください。 dataシートにおいて、メニューバーの余白部でクリック。コントロールツールボックスをクリックし コンボボックスのアイコンをクリックし コンボボックスを貼りつけます。 その中で右クリックして出てくるウインドウで、プロパ ティをクリック。 ListFillRangeの項目行を探し右欄に LIST!A2:A18といれてウインドウを閉じます。 そのコンボボックスの中でダブルクリックし Private Sub ComboBox1_Change() End Sub が出てきます。 その中間に ActiveCell = ComboBox1.List(ComboBox1.ListIndex) を入れて、デザインモードを脱します。 dataシートにおいて、コンボの▼をクリックしてその中の1つをクリックすると、アクチブセルに、選んだアイテムがセットで来ます。

noname#27115
noname#27115
回答No.2

' 反対にコントロールツールボックスのコンボボックス の方だとしたら ' コンボボックスの編集が可能な状態にします。 ' コンボボックス右クリック ' ListFillRange に 表示したい値のあるシート名とCell範囲を指定します。 ' 例:List!A2:A18 ' そして、VBAエディターを開いて対象シートに次のコードをコピペしてください。 Public myRow As Long '''Public myCol As Long Private Sub combocenter_Change() Dim Num As Integer Num = combocenter.ListIndex Worksheets("list").Cells(myRow, 10) = _ Worksheets("list").Cells(Num + 2, 1) End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) myRow = Target.Row '''myCol = Target.Column End Sub

39call
質問者

補足

ありがとうございます、使用しているのはユーザーフォームのツールボックスにあるコンボボックスです。 やはりプロパティには「ListFillRange」欄はないので、コードで書くしかないようなのです。 よろしくお願いします。

回答No.1

コントロールツールボックスのコンボボックスではなく、フォームのコンボボックスですね? それなら作成したコンボボックスを右クリック。 コントロールの書式設定 「コントロール」タブ 「入力範囲」 にListのシートのA2からA18を指定。 (このセル範囲の値が、ドロップダウン ボックスに表示されます。) 「リンクするセル」に一覧で選択された項目を示す値が返されるセルを指定します。 仮に3番目を指定すると3がかえります。 数式でこの数値を使って、一覧で選択された項目に基づいた結果を返すことができます。 なお「ドロップダウン リストの行数」でドロップダウン リストに表示される行数を表します。 お役に立ちましたか?

39call
質問者

補足

ありがとうございます、プロパティ内のRowSourseのことですね。残念ながらMac版にはおっしゃる欄がないので悩んでいたのです。

関連するQ&A

専門家に質問してみよう