VBAユーザーフォームでのComboBoxの使用方法

このQ&Aのポイント
  • VBAユーザーフォームでのComboBoxの使用方法を解説します。
  • 指定した数のコンボボックスを自動的に作成し、値を使用する方法について説明します。
  • VBAユーザーフォームでのComboBoxを活用するテクニックを紹介します。
回答を見る
  • ベストアンサー

VBA ユーザーフォーム

VBAにおけるユーザーフォームの件 今,下記の様なプログラムを組んでいるのですが,「myComboBox」に入った?値をこの後で使用したいのですが, どうすればいいのかわからなくて困っています. これで何がしたいかというと,ある個数分のコンボボックスを自動で作成して使用しようとしているのです. Private Sub UserForm_Initialize() Dim a As String Dim jj As Long Dim s As Integer Dim myComboBox As Control N = InputBox("抜き出したいデータ数は?") EffectiveRow = Range("A65536").End(xlUp).Row Effectivecolumn = Cells(2, 16384).End(xlToLeft).Column For s = 1 To N Set myComboBox = Me.Controls.Add("Forms.ComboBox.1") With myComboBox .Height = 20 .Width = 150 .Left = 120 .Top = (s - 1) * .Height + 10 End With For jj = 1 To Effectivecolumn myComboBox.AddItem Worksheets(1).Cells(1, jj).Value Next jj a = myComboBox.Value Worksheets(2).Cells(1, 1) = a Next s End Sub

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

まず、 >For jj = 1 To Effectivecolumn >myComboBox.AddItem Worksheets(1).Cells(1, jj).Value >Next jj ここはLoopしなくてもColumnプロパティを使って myComboBox.Column = Worksheets(1).Cells(1).Resize(, Effectivecolumn).Value ..とセットできます。 ただ、 Worksheets(1).Cells(1).Resize.. これだと複数のComboBoxの場合でも同じデータがセットされてしまいます。 そういう仕様なのでしょうか? 1行ずつズラすなら Worksheets(1).Cells(s, 1).. などとする必要があるのでは。 >「myComboBox」に入った?値をこの後で使用したいのですが, この後とはどんなタイミングなのでしょう? 例えば Private Sub CommandButton1_Click()   MsgBox Me.Controls("combobox1").Value End Sub こういう使い方でしょうか。 セットした値の全てを配列に取得したいならListプロパティを使って Dim ary ary = Me.Controls("combobox1").List MsgBox ary(3, 0) ..ともできます。 が、その場合は元のセルを参照すれば済みますから 前者のMe.Controls("combobox1").Value..のほうですか。

Ashgin
質問者

お礼

end-uさん 早速の回答ありがとうございます. 早速なのですが, For jj = 1 To Effectivecolumn myComboBox.AddItem Worksheets(1).Cells(1, jj).Value Next jj これは,1行目の文字列を集めてコンボボックスで表示・選択するようにしています. 簡単に書くのであれば, dim a as string a=combobox1.value if a=・・・ という風にコンボボックスで選択した値を使用できますが,今回はset関数を使用しコンボボックスを大量に自動で作成して,このような操作を行いたいのですが,それぞれのコンボボックスを定義して使用する方法がわからないのです. わかりににくいかもしれませんが,よろしくお願いいたします.

その他の回答 (2)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

re:#1の内容は質問に書かれている事と変わりなく、それについては回答してるつもりです。 動的にComboBoxを追加してるので Me.ComboBox1.Value..と書けないって事ですよね。 だから Me.Controls("combobox1").Value..のように名前で指定してあげれば良いです。 >この後とはどんなタイミングなのでしょう? のお応えがないので推測8割ですが Option Explicit Private N As Long Private Sub CommandButton1_Click()   Dim i As Long   For i = 1 To N     Worksheets(2).Cells(i, 1).Value = Me.Controls("combobox" & i).Value   Next End Sub Private Sub UserForm_Initialize()   Dim i As Long   Dim Effectivecolumn As Long   N = Application.InputBox("抜き出したいデータ数は?", Type:=1)   If (N < 1) Or (N > 10) Then Exit Sub   Effectivecolumn = Worksheets(1).Cells(2, 16384).End(xlToLeft).Column   If Effectivecolumn = 1 Then Effectivecolumn = 2   For i = 1 To N     With Me.Controls.Add("Forms.ComboBox.1")       .Height = 20       .Width = 150       .Left = 120       .Top = .Height * i - 10       .Column = Worksheets(1).Cells(i, 1).Resize(, Effectivecolumn).Value     End With   Next End Sub こんな感じなのでしょうか。 提示コードはUserForm_Initialize..ユーザーフォーム初期化イベントの中で >a = myComboBox.Value >Worksheets(2).Cells(1, 1) = a とされてますが、ユーザー操作の前なのでComboBox.Valueには何もはいっていません。 ユーザー操作後、例えばCommandButton1_Clickのタイミングで Me.Controls("combobox" & i).Value..などのように名前指定で取り出せば良いです。 動的に追加されるから Me.Controls("combobox1") Me.Controls("combobox2") Me.Controls("combobox3") : のような名前になるでしょう。 または、仕様の話になりますが、 ComboBoxを際限なく作るわけではないでしょうから、 上限個数のComboBoxを作りVisibleをFalseにしておいて、 使用時にN個のみVisible = Trueで対処する.. ..という事も考えられなくはないです。 For i = 1 To N   With Me.Controls("combobox" & i)     .Visible = True     .Column = Worksheets(1).Cells(i, 1).Resize(, Effectivecolumn).Value   End With Next

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

まず読者回答者のために、簡単にして、シートのデータ実例を挙げて質問すること。 実際は多数列(行)あるのかもしれないが、少数に簡略化して掲出質問すること。 また何がしたいのか、文章で説明すること。(初心者は考え方 取り掛かり方そのものが適当でない・珍奇なことも多い) コードだけコピペして、読み解けというのは、読者のことを考えてない。 この文書での説明能力が無いということは、疑問点が明確になってない証拠だ。 質問者は、WEBかなんかのプログラムによる、多数のコントロール作成のコードを 見つけてきて、少し、いじくっただけではないのか。 普通エクセルVBAの大部700ページぐらいの解説書でも、プログラムによる コントロールの作成例は載っていないだろう。エクセルでは、そこまで皆が 使うとしてないのだと思う。10-20ぐらいを、手動操作でフォーム上に作る 前提だと思う。 初心者には過ぎたやり方だと思う。 本質問では何列ぐらいのデータを扱うのか? ーー そもそも、コンボボックスとはどういうことのためにあるのか? 人間・使用者がコンボの項目のうち、適当な項目を選択して、その選択内容でその後 処理したり、エクセルではセルの値にセットするものでしよう。 人間の選択判断が必要だから、この仕組みを使うはず。その点の認識が薄いのでは。 ーー コンボを利用するには 1.フォームにコンボを作成 2.実行(結果として、ユーザーフォームが表示される) 3.人間がコンボの項目を選択 4.その後本当にやりたい処理(メイン処理を)する これらは別々の作業単位に作成され1,2の時間と、3,4の時間は 切り離している。 それをつなぐのがコントロールのイベントでしょう。 質問者のコードではこれ(イベント)が現れてないのでは。 自動的に2,3、が走らされると、選択の機会が無いか、適当時間を置くとしても 操車者はおちおち選択も出来ない。 自動で走らせられるなら、わざわざコンボを使うことは無いでしょう。 本件は全コンボの選択が終わったら、コマンドボタン(これを前もって作っておく)をクリック させて、それで本当にやりたいメインの処理が走るようにすべきでは。 コンボのクリック(イベント)も処理確定のキッカケになりうるが、 本質問では、1行多列のデータになるようだが、コンボボックスがすべて選択し終わった 段階で、ボタンをクリックさせて、シートの1行に選択データをセットする、 仕組みにしては。 ーー ただしイベントモジュールとコントロール作成のモジュール間の変数の データの受け渡しなどが難しくなるかも。 ーー たぶん質問者のやりたいことのコードは出来たが、一部納得できない 点があって、ここへ掲出しませんが、上記の点を、質問者がよく考えてください。 ーー 他にわからない点 (1)Cells(2, 16384 の 16384 2007移行の許容最大列数か。 エクセルバージョンも質問に書いてますか (2)a = myComboBox.Value Worksheets(2).Cells(1, 1) = a は何をやりたいのか Cells(1, 1)はA1セルだけのことだが。

関連するQ&A

  • EXCEL VBA 多種のコンボボックス操作

    こんばんは。 現在ユーザーフォーム上に10個のコンボボックスを配置しています。 1-8は共通リストを、9と10は別々のリストを表示させたいのですが・・ Private Sub UserForm_Initialize() Dim X, No, Y As Integer With UserForm2 For No = 1 To 8 For X = 0 To 7 .Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next For Y = 0 To 7 .ComboBox9.AddItem Worksheets("Letter").Cells(Y + 1, 11).Value .ComboBox10.AddItem Worksheets("Letter").Cells(Y + 1,12).Value Next End With End Sub 上記のコードですが、エラーが出てどうにも行き詰っています。 Private Sub UserForm_Initialize() Dim X, No As Integer For No = 1 To 8 For X = 0 To 7 UserForm2.Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next End Sub ↑だと1-8まで問題なく動くのですが・・・ すみませんが、アドバイスお願いいたします。

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

  • Excel VBA ユーザフォームの検索について

    添付の画像のようなユーザフォームを作っています。 TextBox1に検索ワードを入力して、CommandButton1をクリックすると、下のComboBox1に一覧が出るようにしたいと思い、ほかのサイトから下記のコードを見つけて、作ってみました。参照先のsheet2を表示しているときは大丈夫なのですが、別のシートを選んでいるとエラーになります。 sheetは3つあり、それぞれ違うリストが入力されています。今回はsheet2のリストを参照したいのですが、最初はsheet1が表示されている状態で実行したいです。 エラーの内容は 実行時エラー9 インデックスが有効範囲にありません。 コチラがコードです。 Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i With ComboBox1 .List() = tbl() End With End Sub Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 With ThisWorkbook.Worksheets("sheet2") imax = .Cells(Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(.Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = Range("A" & i).Value ←この部分がエラーになる End If Next i End With With ComboBox1 .List() = tbl() End With End Sub どこを直せば良いか、教えてください。 よろしくお願いします。

  • VBA ユーザーフォーム

    VBA初心者です。以下の様なソースを見つけました。この場合は、文字を検索するとD1 にその該当番号が表示されます。 ※A列には番号、B列には文字列 そうではなく、そのクリックした行のA列にセルが移動し、ユーザーフォームが閉じられる様にできますでしょうか? よろしくお願い致します。 Private Sub ListBox1_Click() Sheets("Sheet1").Range("D1").Value = ListBox1.Value End Sub Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Dim v() As Variant Dim c As Range Dim k As Long ListBox1.Clear With Sheets("Sheet1") With .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) ReDim v(1 To 2, 1 To .Rows.Count) For Each c In .Cells If c.Offset(, 1).Value Like TextBox1.Value & "*" Then k = k + 1 v(1, k) = c.Value v(2, k) = c.Offset(, 1).Value End If Next If k = 0 Then MsgBox "指定の値は存在しません" Else ReDim Preserve v(1 To 2, 1 To k) ListBox1.List = WorksheetFunction.Transpose(v) End If End With End With End Sub

  • vba ユーザーフォームについて

    勉強のためにvb勉強中です。エクセルのユーザーフォームについて質問です。 コンボボックス 01 02 のどちらかを選択すると、テキストに入力した数字は、01を選択したら11行、02を選択したら12行に転記できるようにしたいのですが、if文を使うのだろうと思うのですが、教えていただけないでしょうか。 私が途中まで作成した載せておきます。よろしくお願い申し上げます。 Private Sub CommandButton1_Click() Dim rc As Long Dim retu As Long Dim Ctrl As Control If Me.txtComboBox1.Value = "" Then MsgBox "社員名を選択してください!", vbOKOnly Me.txtComboBox1.SetFocus Exit Sub End If rc = MsgBox("件数を入力しますか?", vbYesNo) If rc = vbYes Then MsgBox "実行する" Else MsgBox "中止しました" Exit Sub End If retu = Cells(3, Columns.Count).End(xlToLeft).Column + 1 Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value  ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value  ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value   ←売れた件数 For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next Ctrl End Sub また、テキストボックスに数字だけ入力して、プルダウン選択してないとエラ~メッセージも出るようにしたいです...

  • ユーザーフォームをWorkSheet(1)に固定

    ●質問の主旨 WorkSheet(1)(「柴田8月分」)にユーザーフォームを固定的に 表示させつつ、WorkSheet(1)以降のWorkSheet(2)、 WorkSheet(3)、WorkSheet(4)の表を参照しながら ComboBox1、ComboBox2、ComboBox3にリストを 選択して、データベースに入力したいと考えています。 以下のコードをどのように書き換えれば良いでしょうか? ご教示のほどよろしくお願い申し上げます。 ●質問の補足 現在のコードでは、ComboBox1、ComboBox2、ComboBox3を それぞれ選択しているとユーザーフォームがそれぞれ WorkSheet(2)、WorkSheet(1)(顧客リスト)、WorkSheet(3)(社員名)、 WorkSheet(4)(大分類)にとんでしまいます。 転記入力が終了すると、また手作業でWorkSheet(1)に戻らなければなりません。 その手作業を回避したいと考えています。 なお添付画像はComboBox1の選択前なのでWorkSheet(1) に留まってくれています。 ●コード Option Explicit 'ユーザーフォームの初期化 Private Sub UserForm_Initialize() Dim r As Range Dim n As Range Dim d As Range With Worksheets(2) Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox1 .ColumnCount = 2 .ColumnWidths = ";0" .List = r.Value End With With Worksheets(3) Set n = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox2 .ColumnCount = 2 .ColumnWidths = ";0" .List = n.Value End With With Worksheets(4) Set d = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox3 .ColumnCount = 2 .ColumnWidths = ";0" .List = d.Value End With Set r = Nothing Set n = Nothing Set d = Nothing TextBox3.Value = Worksheets(1).Range("A2").Value + 1 txtdate = Date OptionButton1.Value = True End Sub 'ComboBox1をクリックしたときの処理 Private Sub ComboBox1_Click() Worksheets(2).Select With Me.ComboBox1 Me.Label19.Caption = .List(.ListIndex, 1) Worksheets(2).Select Replace:=False End With End Sub 'ComboBox2をクリックしたときの処理 Private Sub ComboBox2_Click() Worksheets(3).Select With Me.ComboBox2 Me.Label20.Caption = .List(.ListIndex, 1) Worksheets(3).Select Replace:=False End With End Sub 'フォームからデータベースへの転記 Private Sub CommandButton3_Click() Dim Rowpos As Long Dim ColPos As Long Rowpos = Worksheets("柴田8月分").Range("a10000").End(xlUp).Row ColPos = 1 Rowpos = Rowpos + 1 With Worksheets("柴田8月分") .Cells(Rowpos, ColPos) = TextBox3.Value .Cells(Rowpos, ColPos + 1) = txtdate.Value .Cells(Rowpos, ColPos + 2) = Label19.Caption .Cells(Rowpos, ColPos + 3) = ComboBox1.Text .Cells(Rowpos, ColPos + 4) = ComboBox2.Text .Cells(Rowpos, ColPos + 5) = Label20.Caption .Cells(Rowpos, ColPos + 6) = ComboBox3.Text End With 'Noの加算 Dim i As Long For i = 1 To 1 Step 1 TextBox3.Value = TextBox3.Value + 1 Next Call Clearcmb End Sub 'データベース入力後にコンボボックスを空欄にする Private Sub Clearcmb() ComboBox1.Text = "" ComboBox2.Text = "" ComboBox3.Text = "" End Sub 'ユーザーフォームの終了 Private Sub CommandButton5_Click() Unload UserForm1 End End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。

  • 全くの初心者ですVBA

    どこが悪いかわかりません。 教えてください。 Sub テスト() Dim kekka As String Dim i As Integer tokuten = Worksheets("Sheet1").Cells(i, 1).Value For i = 1 To Worksheets("Sheet1").Range("A1").End(xlDown).Row.Count If tokuten >= 80 Then kekka = "合格" Else kekka = "不合格" kekka = Cells(i, 2) End If Next i End Sub シート1の A列に数値で得点が入っています。

  • VBA Range・Cellsプロパティについて

    下記のコードについて質問致します。 Sub 特定のセルをコピー() Dim rw2 As Long Dim rw1 As Long Dim newdate As Date With Worksheets("steet1") rw2 = .cells(.Rows.Count, "c").End(xlUp).Row newdate = .Range("c" & rw2).value For rw1 = rw2 - 1 To 1 Step -1 If .Range("c" & rw1).value <> newdate Then Exit For Next rw1 .Range(.cells(rw1 + 1, 1), .cells(rw2, 1)).Copy     '(1) Worksheets("steet2").Range("v6").PasteSpecial xlValue End With End Sub (1)部分のコードの意味が分かりません。 よろしくお願いします。

  • Excelのユーザーフォームで別のファイルに転記

    Excel2007です。 マクロを含んだデータファイルがあるのですが、マクロブックとデータブックは分割した方がよいと言われて今分割の方法を試しています。 「マクロブック.xlsm」にマクロを記述し、「商品在庫Data.xlsm」にデータが格納されています。 (まだ試験中で完全に分割できていないのでデータブックもxlsm形式ですが) マクロブックのユーザーフォームから「商品在庫Data.xlsm」ファイルの「商品マスタ」というシートに転記したいのですが、どうやっても「商品在庫Data.xlsm」で「商品マスタ」シートを指定して転記できません。 ユーザーフォームのコードは下記のような内容です。 「HinTouroku」コマンドボタンを押した時に商品マスタシートに内容が転記されるようになっています。 Option Explicit Private Sub HinTouroku_Click() '商品登録 Dim lRow As Long Dim s1 As String, s2 As String Dim Ctrl As Control With Workbooks("商品在庫Data.xlsm") Worksheets ("商品マスタ") lRow = .Range("A" & Rows.Count).End(xlUp).Row s1 = .Cells(lRow, "A").Value s2 = txtHinId.Text If s1 = s2 Then MsgBox "商品IDが重複しています" Exit Sub End If lRow = lRow + 1 .Cells(lRow, "a").Value = txtHinId.Text .Cells(lRow, "b").Value = txtSyohinmei.Text .Cells(lRow, "c").Value = txtHinRyaku.Text End With For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next End Sub Private Sub TourokuClr_Click() '入力フォームのクリア Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then _ myCtrl.Value = vbNullString Next End Sub Private Sub TourokuCls_Click() 'フォームを閉じる Unload Me End Sub http://vbaexcel.seesaa.net/category/7604114-2.html このサイトを参考にしながら書いてみたのですがどうしてもシートの指定ができず… どのように記述すればよいのでしょうか?

  • エクセル ユーザーフォームテキストボックスについて

    テキストボックスからセルへの入力について教えていただきたいのですが、 ネットからサンプルを落として勉強しております。 以下のコードを下の画像のように見出しを3から7まで項目を増やしたい場合、 どの部分を書き換えたらいいのでしょうか? よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim LASROW As Long Dim f As Long With Worksheets("Sheet1") 'A列の最終行を取得 LASROW = .Range("A" & CStr(Rows.Count)).End(xlUp).Row 'セルに書き込み For f = 0 To 2 .Range("A" & CStr(LASROW)).Offset(1, f).Value = Me.Controls("TextBox" & f + 1).Value Next End With 'TextBox1,2,3をクリア For f = 1 To 3 Me.Controls("TextBox" & f).Value = "" Next 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub

専門家に質問してみよう