VBAのComboBoxについて

このQ&Aのポイント
  • VBAのComboBoxを使ってUserFormにリストを表示し、選択したデータをSheet1に追加する方法について教えてください。
  • UserFormにはComboBox1からComboBox10までの合計10個のComboBoxがあり、それぞれに対応する列のリストを表示します。
  • ComboBoxで選択したデータがリストにない場合は、新しいデータを入力してSheet1に追加したいのですが、どのようにすればよいでしょうか。
回答を見る
  • ベストアンサー

VBAのComboBoxについて

UserForm1にComboBoxが8個(ComboBox1~8)あります。 各ComboBoxはSheet1の下記列に入力されているリストを表示します。 ComboBox1 : A列 ComboBox2 : B列 ComboBox3 : C列 ComboBox4 : D列 ComboBox5 : E列 ComboBox6 : F列 ComboBox7 : G列 ComboBox8 : H列 ComboBox9 : I列 ComboBox10 : J列 そこで、UserForm1の各ComboBoxでデータ選択する際に、リストにある場合はそれを選択し、リストにない場合はComboBoxに新しいデータを入力し、UserForm1のCommandButton1を押下時にその新しいデータをSheet1の各列に追加したいのですが、どのようにしたらよいのでしょうか。 Sheet1にあるリストをComboBoxに表示するところまではできています。 ※ComboBoxの番号とリストの列番号を一致させています。 --------------------------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, retu As Integer, i As Integer For retu = 1 To 10 lastrw = Sheet1.Cells(1, retu).End(xlDown).Row For i = 1 To lastrw - 1 Controls("ComboBox" & retu).AddItem Sheet1.Cells(i + 1, retu).Value Next i Next retu End Sub ---------------------------------------------------------------

  • gazo
  • お礼率30% (74/241)

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

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

こんにちは。 もっと良い方法があるかも知れませんが、(良い方法があれば直してください) 以下のマクロで、お試しください。 Dim wIdx    As Integer 'ComboBox1選択 Private Sub ComboBox1_Click()   Dim wI   As Integer   wIdx = 1   wI = ComboBox1.ListIndex   Sheet1.Cells(wI + 2, wIdx).Select End Sub 'ComboBox2選択 Private Sub ComboBox2_Click()   Dim wI   As Integer   wIdx = 2   wI = ComboBox2.ListIndex   Sheet1.Cells(wI + 2, wIdx).Select End Sub ' 'ComboBox1入力 Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)   wIdx = 1 End Sub 'ComboBox2入力 Private Sub ComboBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)   wIdx = 2 End Sub ' 'CommandButton1押下 Private Sub CommandButton1_Click()   Dim wText   As String   Dim mR     As Integer   Dim rFind   As Range   '   wText = Controls("ComboBox" & wIdx).Text   Controls("ComboBox" & wIdx).AddItem wText   '   With ActiveSheet     mR = .Cells(1, wIdx).End(xlDown).Row     Set rFind = .Range(.Cells(1, wIdx), .Cells(mR, wIdx)).Find(wText)     If rFind Is Nothing Then       .Cells(mR + 1, wIdx).Value = wText       .Cells(mR + 1, wIdx).Select     End If   End With End Sub

gazo
質問者

お礼

ご回答どうもありがとうございます。 無事に解決することができました。 ありがとうございました。

関連する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まで問題なく動くのですが・・・ すみませんが、アドバイスお願いいたします。

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

  • セルの選択について

    <Sheet2のコード> Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not UserForm3.Visible Then UserForm3.Show 0 UserForm3.TextBox1.Text = Selection.Count End Sub *********************************************** <UserForm3のコード> Private Sub CommandButton1_Click() With Selection .MergeCells = True .WrapText = True .Value = TextBox2.Text & ComboBox1.Text End With UserForm3.Hide End Sub ---------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, lastrw2 As Integer, i As Integer lastrw = Sheet3.Range("A1").End(xlDown).Row lastrw2 = Sheet3.Range("B1").End(xlDown).Row If Sheet2.Range(Cells(5, 4), Cells(5, 100)).Select Then ・・・(1) For i = 1 To lastrw - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 1).Value Next i End If If Sheet2.Range(Cells(6, 4), Cells(6, 100)).Select Then ・・・(2) For i = 1 To lastrw2 - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 2).Value Next i End If End Sub ************************************************* ワークシート上でマウスで選択されたセルの行ごとにUserForm3のComboBox1で表示させる文字を変えたいのですが、どのようにすればよいのでしょうか。 上の(1)(2)だととマウスで選択されたセルではなく(1)(2)の範囲のセルが結合されてしまいます。。。 また、今はワークシート上でマウスを左クリックする度にUserForm3が表示されてしまいます。 これをワークシート上でマウスでセルを選択して右クリックするとUserForm3が表示される ようにしたりすることは可能なのでしょうか。

  • comboboxで任意の行列を削除する

    comboboxで選択したデーターを探して、その行の 2列目から45列までを、削除する方法をお教えください。 下のように記述したのですが、1行全てが削除されてしまいます。 どのように記述したらよいのでしょうか。 よろしくお願いします。 Private Sub 保存データー削除_Click() Dim i As Long For i = 2 To 199 If Cells(i, 2).Value = combobox1.Value Then Range(i & ":" & i).Delete End If Next i Dim k As Long, s As Long k = 1 For s = 1 To 31 Cells(s, 1).Value = k k = k + 1 Next s End Sub

  • VBAでオプションボタン変更によって・・・

    エクセルVBAのユーザーフォーム内にあるコンボボックス3つを選択することによりデータ入力を行っています。 この度選択肢を増やすことになり、オプションボタンを2つ追加しようと思っています。 オプションボタンはどちらかを決定することで、コンボボックスの選択内容を変更する予定です。 コンボボックスは大中小分類としており、シート2から抽出したものをシート1に落としている現状をオプションボタン新設により、ボタン1は従来通りシート2から、ボタン2選択時はシート3にあるリストからコンボボックスへ繁栄させようとしたいのですが、方法が分かりません。 どなたか、教えていただけると助かります。 よろしくお願いします。 現在のコードを下記に記します。 Private Sub UserForm_Activate() With UserForm3 .OptionButton1 = True *この段階でボタン2を選択時は、シート3にあるリストよりコンボボックスの内容を抽出したい。 以下中小分類も同様としたい。 .ComboBox1.RowSource = "シート2!A3:A15" .ComboBox1.SetFocus End With End Sub Private Sub ComboBox1_Change() Dim myLlist As String myLlist = ComboBox1 With UserForm3 .ComboBox2.Text = "" .ComboBox3.Text = "" Select Case myLlist Case "大1" .ComboBox2.RowSource = "シート2!B21:B26" Case "大2" .ComboBox2.RowSource = "シート2!B27:B28" End Select End With End Sub Private Sub ComboBox2_Change() Dim myMlist As String myMlist = ComboBox2 With UserForm3 .ComboBox3.Text = "" Select Case myMlist Case "中1" .ComboBox3.RowSource = "シート2!C101:C111" Case "中2" .ComboBox3.RowSource = "シート2!C121:C124" End Select End With End Sub Private Sub OKボタン_Click() With UserForm3 ActiveSheet.Unprotect 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm3.ComboBox1.Value Cells(行, 列 + 1) = UserForm3.ComboBox2.Value Cells(行, 列 + 2) = UserForm3.ComboBox3.Value ActiveSheet.Protect End With End Sub

  • VBAコードでシート名を取得したい。

    下記のコードは、指定したExcelブックにある情報をVBAコードを設置したブックに 情報を取得するコードになります。 質問なんですが・・・指定したExcelブックは、予めSheet名までをVBAコードで指定し、 そのSheetの内容を取得していますが、この部分を指定したSheet名ではなく、 Sheet名を取得し、取得したSheet名から自分で選択したSheetを選んび、 そのSheetの内容を取得する様に変えたいと考えています。 取得する側のSheet名が一定の名前になっていない為、 今までSheet名を変えて情報を取得する様にしていたのを 変えずに情報を取得したいと思ったからなんですが・・・ どの様に変えればできるのか初心者のためよろしくお願いします。 できましたら・・・UserForm2を使ってComboboxに取得するSheet名を 一覧化し、そのComboboxからSheet名を選べる様にしたいと思います。 ----------------------------------------------------------------------------------- Public Day As String '全プロシージャーで有効な変数 Sub CommandButton1() If MsgBox(Space(6) & "メールデータを取込みます。よろしいですか?", vbYesNo, "継続確認") = 7 Then Exit Sub Dim LstWb As Workbook Dim LstWs As Worksheet Dim OutWs As Worksheet Dim LstDt As Variant Dim EndRow As Long Dim Day0 As String Dim Day1 As String Dim i As Long Dim j As Integer Dim k As Long Set LstWb = Workbooks.Open(ThisWorkbook.Path & "\テストファイル.xlsm") Set OutWs = ThisWorkbook.Sheets("Sheet1") Set LstWs = LstWb.Sheets("Sheet1") EndRow = LstWs.Cells(Rows.Count, 1).End(xlUp).Row With LstWs LstDt = .Range(.Cells(1, 1), .Cells(EndRow, 5)) End With LstWb.Close Set LstWb = Nothing Set LstWs = Nothing Load UserForm2 With UserForm2 Day0 = LstDt(2, 4) .ComboBox1.AddItem Day0 For i = 2 To EndRow With .ComboBox1 Day0 = .List(.ListCount - 1) Day1 = LstDt(i, 4) If Day0 <> Day1 Then .AddItem Day1 End If End With Next i .ComboBox1.Value = .ComboBox1.List(0) End With UserForm2.Show For i = 1 To 5 OutWs.Cells(1, i).Value = LstDt(1, i) Next i k = 2 For i = 2 To EndRow Day0 = LstDt(i, 4) If Day = Day0 Then For j = 1 To 5 OutWs.Cells(k, j).Value = LstDt(i, j) Next j k = k + 1 End If Next i Set OutWs = Nothing LstDt = Empty UserForm1.Show (vbModeless)End Sub

  • vbaのclassモジュールを呼び出し

    現在フォームに書いてるcode ーーー ’シート1のB列250件くらい有る(名前)→コンボボックスに漢字1−2文字入れて表示件数を絞り込み→comboboxにリスト表示している。 ーーー ーーーーー Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer '押されたキーが、Enterキー以外は終了 If KeyCode <> vbKeyReturn Then Exit Sub 'テキスト部分が選択されている場合 If ComboBox1.ListIndex = -1 Then ComboBox1.Visible = False 'コンボボックスを非表示 ComboBox1.Visible = True 'コンボボックスを表示 ComboBox1.List = Array() 'コンボボックスのリストをクリア '値を部分一致で抽出 For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row If InStr(Sheets("Sheet1").Cells(i, "B"), ComboBox1.Text) > 0 Then 'コンボボックスのリストに追加 ComboBox1.AddItem Sheets("Sheet1").Cells(i, "B") End If Next End If KeyCode = 0 'コンボボックスをフォーカス ComboBox1.DropDown 'リストを表示 End Sub ーーーーー ーーー ’上記Combobox1で表示された内容の同行&別列で対応するセル内容をLabelに表示させたい、が「行 = 行 + 1」でエラー吐く。 ーーー ーーーーー Private Sub ComboBox1_Change() Dim 行 As Integer 行 = 1 Do 行 = 行 + 1 Loop Until ComboBox1.Text = Worksheets("Sheet1").Cells(行, 2) 'ComboBox1に表示されてる文字列が、B列の何行目に記載されてるか取得 FormMain.Label1.Caption = Worksheets("Sheet1").Cells(行, 1) 'B列に記載されてる文字列と同じ行にある、A列の文字を取得してTextBox1に表示 FormMain.Label2.Caption = Worksheets("Sheet1").Cells(行, 4) 'B列に記載されてる文字列と同じ行にある、D列の文字を取得してTextBox1に表示 End Sub ーーーーー 検索絞り込み・Labelに表示・最終行の取得(これはエラーなく動かせてる)は、Sheet2でも使うのでclassモジュールに書きたい+formでの呼び出しがうまく行かない。 インターネットで調べながら組み合わせたが自力解決出来なかったのでよろしくお願いします(Vbaの知識は無し)。 元データーは現在Accessで動いてますが、B列(名前250件くらい)ComboBoxで全件読み込みから目当ての名前1つを探し出す宝探し状態。 元データー制作は10年くらい前に業者発注した物(当時は250件を想定してなかったのだろう)→現在は連絡取れない方なのです。 Vba(ComboBox絞り込み)での作り直しを希望してます。

  • ComboBox1_Changeについて

    Private Sub ComboBox1_Change() Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox1.ListIndex ' ComboBox1 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容をC列から作成する .ComboBox2.RowSource = "Sheet1!C1" Case 1 .ComboBox2.RowSource = "Sheet1!C2" End Select End With End Sub コンボボックス1で選択された値に対して『Sheet1!C1』が 表示されるようにするには、『.RowSource』の部分に 適切な言語がありますでしょうか。 また、『.RowSource』は、こういう効果がある等 紹介しているサイトをご存知あれば教えてください。 (探してみたのですが、めぐり合えず)

  • VBA For To Next 文でComboBoxを指定?

    VBAでお世話になっています。 UserForm上のComboBox1~30の各値を元に Sheet2上のデータをSheet4上に貼り付けるVBAを組んであります。 ComboBox1の値を元に行なう作業(VBA)とComboBox30を元に行なう作業は同じなのですが、 但し記述は50行程×30あるので全記述をすると60kを超えてエラーになります。  ですので i = 0 For a = 1 To 30 従業員番号 = UserForm1.ComboBox a.Text + 10 'ここでエラー .CombBox a 反転表示 With Sheet4 .Cells(15 + i, 3).Value = Sheet2.Cells(従業員番号, 1).Value .Cells(17 + i, 3).Value = Sheet2.Cells(従業員番号, 2).Value .Cells(16 + i, 6).Value = Sheet2.Cells(従業員番号, 3).Value     ・     ・     ・ End with i=i+4 Next a としたら、「コンパイルエラー メソッド・データメンバが見つかりません」が返ります。 ComboBoxの番号を指定しないとわからんわい、との事と思います。 (a) "a" _a としてもだめですし、cmd=CombBox+aを足してみたら cmd=1になるし、 cmd="CombBox"+a は「型が一致しない」エラー・・・等々 なんとかCombBoxの1~30をFor文でループしたいのです。ご教授をお願いします。

  • VBA オブジェクトが必要です エラー424

    VBA初心者です。 初歩的な質問で申し訳ありません。 ユーザーフォームのコンボボックスにユーザーリストを読みこみプルダウンする構文です。 以下を実行すると 実行時エラー 424 オブジェクトが必要です という警告が出ます。 どこを直せばいいのかわかりません。 詳しい方教えて下さい。宜しくお願いします。 private sub userform_initialize() dim 最終行 as integer dim i as integer 最終行 = worksheets(゛meisai″).cells(Row.count,8).end(xlup).Row for i = 1 to 最終行 combobox1.addItem worksheets(″meisai゛).value next i end sub