• 締切済み

連続プルダウンについて

VBAで初心者でリストを作るのがやっとで連続プルダウンができません 各月のシートに登録ボタン作成あります。登録ボタンを押して商品を登録する際に、大分類を選んだら、選んだ大分類の中分類を選べ、中分類を選んだら小分類を選べるようにしたいです。 そのために、Sheet1に分類の表を作成しました。 例えば、大分類で梱包作業用品を選んだら、     中分類には梱包/結束用品かテープ製品が選べて、中分類で梱包/結束用品を選んだら     小分類で緩衝材か養生用テープが選べる様にしたいです。 どうか教えて下さい。 ----------------------------------------------------------- Private Sub CommandButton1_Click() Dim lRow As Long Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet With ws lRow = .Range("B" & Rows.Count).End(xlUp).Row .Range("B" & lRow + 1).Value = TextBox1.Value lRow = Range("C" & Rows.Count).End(xlUp).Row .Range("C" & lRow + 1).Value = ListBox1.Value lRow = .Range("D" & Rows.Count).End(xlUp).Row .Range("D" & lRow + 1).Value = TextBox2.Value lRow = .Range("E" & Rows.Count).End(xlUp).Row .Range("E" & lRow + 1).Value = TextBox3.Value lRow = .Range("F" & Rows.Count).End(xlUp).Row .Range("F" & lRow + 1).Value = TextBox4.Value lRow = .Range("G" & Rows.Count).End(xlUp).Row .Range("G" & lRow + 1).Value = TextBox5.Value 'lRow = .Range("I" & Rows.Count).End(xlUp).Row '.Range("I" & lRow + 1).Value = TextBox6.Value lRow = Range("I" & Rows.Count).End(xlUp).Row .Range("I" & lRow + 1).Value = ListBox3.Value lRow = .Range("J" & Rows.Count).End(xlUp).Row .Range("J" & lRow + 1).Value = TextBox7.Value lRow = .Range("K" & Rows.Count).End(xlUp).Row .Range("K" & lRow + 1).Value = TextBox8.Value lRow = Range("L" & Rows.Count).End(xlUp).Row Range("L" & lRow + 1).Value = ListBox2.Value lRow = .Range("H" & Rows.Count).End(xlUp).Row .Range("H" & lRow + 1).Value = TextBox9.Value End With TextBox1.Value = "" TextBox1.SetFocus TextBox2.Value = "" TextBox2.SetFocus TextBox3.Value = "" TextBox3.SetFocus TextBox4.Value = "" TextBox4.SetFocus TextBox5.Value = "" TextBox5.SetFocus 'TextBox6.Value = "" 'TextBox6.SetFocus TextBox7.Value = "" TextBox7.SetFocus TextBox8.Value = "" TextBox8.SetFocus TextBox9.Value = "" TextBox9.SetFocus End Sub Private Sub UserForm_Initialize() With ListBox1 .AddItem "たのめーる" .AddItem "AMAZON" .AddItem "楽天" .AddItem "yahooショッピング" .AddItem "国峰印房" .AddItem "脇製茶" .AddItem "ヤマト運輸" .AddItem "ゼネラル" .AddItem "家電量販店" End With With ListBox2 .AddItem "総務課" .AddItem "用度" .AddItem "営業" .AddItem "介護" .AddItem "倉庫" .AddItem "人事" .AddItem "経理" End With With ListBox3 .AddItem "梱包作業用品" .AddItem "事務用品消耗品" .AddItem "パソコン用品消耗品" .AddItem "プリンター用品消耗品" .AddItem "掃除用品消耗品" .AddItem "衛生用品消耗品" .AddItem "消臭用品消耗品" .AddItem "洗剤用品消耗品" .AddItem "事務用品" .AddItem "掃除用品" .AddItem "生活雑貨用品" .AddItem "飲食用品" .AddItem "パソコン周辺機器" .AddItem "生活雑貨" .AddItem "医療機器" .AddItem "電化製品" .AddItem "衛生用品" .AddItem "日用品" .AddItem "出版物" .AddItem "家具" End With End Sub

みんなの回答

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.8

No7の補足です。 「参照設定」で「Microsoft ActiveX Data Objects 2.X Library」を追加しておいてください。

snoopy1971ken55
質問者

お礼

ありがとうございます。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.7

No4のコードを同じところをFunctionとしてまとめたものです。 ShName = "Sheet2"のSheet2を本来のシート名に変更してください。 それぞれのリストボックス名は大分類,中分類,小分類としてください。 Private Sub UserForm_Initialize() Dim strSQL As String Dim ShName As String ShName = "Sheet2" strSQL = "" strSQL = strSQL & "SELECT [" & ShName & "$].大分類" strSQL = strSQL & " FROM [" & ShName & "$]" strSQL = strSQL & " GROUP BY [" & ShName & "$].大分類; " Call mRunSQL(Me.大分類, strSQL, "大分類") End Sub Private Sub 大分類_Change() Dim strSQL As String Dim ShName As String ShName = "Sheet2" strSQL = "" strSQL = strSQL & "SELECT [" & ShName & "$].中分類" strSQL = strSQL & " FROM [" & ShName & "$]" strSQL = strSQL & " GROUP BY [" & ShName & "$].中分類,[" & ShName & "$].大分類 " strSQL = strSQL & " HAVING ((([" & ShName & "$].大分類)=" & """" & Me.大分類.Text & """" & "));" Call mRunSQL(Me.中分類, strSQL, "中分類") End Sub Private Sub 中分類_Change() Dim strSQL As String Dim ShName As String ShName = "Sheet2" strSQL = "" strSQL = strSQL & "SELECT [" & ShName & "$].小分類" strSQL = strSQL & " FROM [" & ShName & "$]" strSQL = strSQL & " WHERE ((([" & ShName & "$].大分類)=" & """" & Me.大分類.Text & """" & ") AND (([" & ShName & "$].中分類)=" & """" & Me.中分類.Text & """" & "));" Call mRunSQL(Me.小分類, strSQL, "小分類") End Sub Function mRunSQL(ByRef mList As Control, ByVal strSQL As String, ByVal Catergory As String) Dim objCn As New ADODB.Connection Dim objRS As ADODB.Recordset mList.Clear With objCn .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0" .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name End With Set objRS = New ADODB.Recordset Set objRS = objCn.Execute(strSQL) Do Until objRS.EOF mList.AddItem objRS(Catergory) objRS.MoveNext Loop objCn.Close Set objRS = Nothing Set objCn = Nothing End Function

snoopy1971ken55
質問者

お礼

ありがとうございます。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.6

SQLを使って書いてみました。 よかったら試してみてください。 'Sheet1モジュール=========== Option Explicit Private Sub CommandButton1_Click()  UserForm1.Show End Sub 'UserForm1モジュール=========== Option Explicit Private Sub UserForm_Initialize()  Set1 End Sub Private Sub ListBox1_Change()  Set2 End Sub Private Sub ListBox2_Change()  Set3 End Sub '標準モジュール=========== Option Explicit Sub Set1()  Dim SQL As String  Dim cn As Object  Dim rs As Object  'SQL全文を組み立て  SQL = "SELECT [大分類]" & vbCrLf  SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf  SQL = SQL & "GROUP BY [大分類]" & vbCrLf  SQL = SQL & "ORDER BY [大分類]" & vbCrLf  'SQLを実行  Set cn = CreateObject("ADODB.Connection")  Set rs = CreateObject("ADODB.Recordset")  cn.Provider = "Microsoft.ACE.OLEDB.12.0"  cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1"  cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name  rs.Open SQL, cn  UserForm1.ListBox1.Clear  UserForm1.ListBox2.Clear  UserForm1.ListBox3.Clear  If Not rs.EOF Or Not rs.Bof Then   rs.MoveFirst   Do    If rs.EOF = True Then Exit Do    With UserForm1.ListBox1     .AddItem rs("大分類")    End With    rs.MoveNext   Loop  End If  '後処理  rs.Close  Set rs = Nothing  cn.Close  Set cn = Nothing End Sub Sub Set2()  Dim SQL As String  Dim cn As Object  Dim rs As Object  'SQL全文を組み立て  SQL = "SELECT [中分類]" & vbCrLf  SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf  SQL = SQL & "Where [大分類]='" & UserForm1.ListBox1.Text & "'" & vbCrLf  SQL = SQL & "GROUP BY [中分類]" & vbCrLf  SQL = SQL & "ORDER BY [中分類]" & vbCrLf  'SQLを実行  Set cn = CreateObject("ADODB.Connection")  Set rs = CreateObject("ADODB.Recordset")  cn.Provider = "Microsoft.ACE.OLEDB.12.0"  cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1"  cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name  rs.Open SQL, cn  UserForm1.ListBox2.Clear  UserForm1.ListBox3.Clear    If Not rs.EOF Or Not rs.Bof Then   rs.MoveFirst   Do    If rs.EOF = True Then Exit Do    With UserForm1.ListBox2     .AddItem rs("中分類")    End With    rs.MoveNext   Loop  End If  '後処理  rs.Close  Set rs = Nothing  cn.Close  Set cn = Nothing End Sub Sub Set3()  Dim SQL As String  Dim cn As Object  Dim rs As Object  'SQL全文を組み立て  SQL = "SELECT [小分類]" & vbCrLf  SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf  SQL = SQL & "Where ([大分類]='" & UserForm1.ListBox1.Text & "' ) and" & vbCrLf  SQL = SQL & "   ([中分類]='" & UserForm1.ListBox2.Text & "' ) " & vbCrLf  SQL = SQL & "GROUP BY [小分類]" & vbCrLf  SQL = SQL & "ORDER BY [小分類]" & vbCrLf  'SQLを実行  Set cn = CreateObject("ADODB.Connection")  Set rs = CreateObject("ADODB.Recordset")  cn.Provider = "Microsoft.ACE.OLEDB.12.0"  cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1"  cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name  rs.Open SQL, cn  UserForm1.ListBox3.Clear  If Not rs.EOF Or Not rs.Bof Then   rs.MoveFirst   Do    If rs.EOF = True Then Exit Do    With UserForm1.ListBox3     .AddItem rs("小分類")    End With    rs.MoveNext   Loop  End If  '後処理  rs.Close  Set rs = Nothing  cn.Close  Set cn = Nothing End Sub

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

No4の追加です。 念のために Set objRS = Nothing を各プロシージャの Set objCn = Nothing の前に入れておいてください。 また、それぞれのプロシージャはほとんど同じようなものなのでFunctionとしてまとめたらいいのですが面倒なのでやってません。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.4

質問の添付画像のままのデータでしたら(SHeet2にデータがあるとして)「参照設定」で「Microsoft ActiveX Data Objects 2.X Library」を追加してフォームのプロシージャに以下をコピペで試してみてください。 Private Sub UserForm_Initialize() Dim objCn As New ADODB.Connection Dim objRS As ADODB.Recordset Dim strSQL As String With objCn .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0" .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name End With strSQL = "" strSQL = strSQL & "SELECT [Sheet2$].大分類" strSQL = strSQL & " FROM [Sheet2$]" strSQL = strSQL & " GROUP BY [Sheet2$].大分類; " Set objRS = New ADODB.Recordset Set objRS = objCn.Execute(strSQL) Do Until objRS.EOF Me.大分類.AddItem objRS!大分類 objRS.MoveNext Loop objCn.Close Set objCn = Nothing End Sub Private Sub 大分類_Change() Dim objCn As New ADODB.Connection Dim objRS As ADODB.Recordset Dim strSQL As String Me.中分類.Clear With objCn .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0" .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name End With strSQL = "" strSQL = strSQL & "SELECT [Sheet2$].中分類" strSQL = strSQL & " FROM [Sheet2$]" strSQL = strSQL & " GROUP BY [Sheet2$].中分類,[Sheet2$].大分類 " strSQL = strSQL & " HAVING ((([Sheet2$].大分類)=" & """" & Me.大分類.Text & """" & "));" Set objRS = New ADODB.Recordset Set objRS = objCn.Execute(strSQL) Do Until objRS.EOF Me.中分類.AddItem objRS!中分類 objRS.MoveNext Loop objCn.Close Set objCn = Nothing End Sub Private Sub 中分類_Change() Dim objCn As New ADODB.Connection Dim objRS As ADODB.Recordset Dim strSQL As String Me.小分類.Clear With objCn .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0" .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name End With strSQL = "" strSQL = strSQL & "SELECT [Sheet2$].小分類" strSQL = strSQL & " FROM [Sheet2$]" strSQL = strSQL & " WHERE ((([Sheet2$].大分類)=" & """" & Me.大分類.Text & """" & ") AND (([Sheet2$].中分類)=" & """" & Me.中分類.Text & """" & "));" Set objRS = New ADODB.Recordset Set objRS = objCn.Execute(strSQL) Do Until objRS.EOF Me.小分類.AddItem objRS!小分類 objRS.MoveNext Loop objCn.Close Set objCn = Nothing End Sub

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

データを添付画像のようにしていただいて(画像はテスト的に一部です) 以下のコードで試してみてください。 Private Sub UserForm_Initialize() Dim i As Long Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") For i = 1 To ws.Cells(1, Columns.Count).End(xlToRight).Column Me.大分類.AddItem ws.Cells(1, i) Next i End Sub Private Sub 大分類_Change() Dim i As Long Dim Fb As Range Dim FirstRow As Long, EndRow As Long Dim TitleRow As Long Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") TitleRow = 1 FirstRow = 2 EndRow = 9 Me.中分類.Clear With ws Set Fb = .Range(.Cells(TitleRow, "A"), .Cells(TitleRow, Columns.Count).End(xlToLeft)).Find(What:=Me.大分類.Text, LookIn:=xlValues, LookAt:=xlWhole) If Not Fb Is Nothing Then For i = FirstRow To .Cells(EndRow, Fb.Column).End(xlUp).Row Me.中分類.AddItem .Cells(i, Fb.Column) Next i End If End With Set ws = Nothing End Sub Private Sub 中分類_Change() Dim i As Long Dim Fb As Range Dim FirstRow As Long, EndRow As Long Dim TitleRow As Long Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") TitleRow = 10 FirstRow = 11 EndRow = 19 Me.小分類.Clear With ws Set Fb = .Range(.Cells(TitleRow, "A"), .Cells(TitleRow, Columns.Count).End(xlToLeft)).Find(What:=Me.中分類.Text, LookIn:=xlValues, LookAt:=xlWhole) If Not Fb Is Nothing Then For i = FirstRow To .Cells(EndRow, Fb.Column).End(xlUp).Row Me.小分類.AddItem .Cells(i, Fb.Column) Next i End If End With Set ws = Nothing End Sub

snoopy1971ken55
質問者

お礼

ありがとうございます。

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

#1です。書き忘れたが、Googleで「エクセル ドロップダウンリスト 多段」で照会でもして、記事を読んで、参考にして、考えたか?または「エクセル VBA ドロップダウンリスト 多段 」で たくさん記事があり、数個に目を通せば、参考になるだろう。 そしたら、ここへの、質問の書き方も変わるのではないか(自分の一方的なコードを挙げて読ませるのでなくて)。VBAコード的に、的が絞れると思う。

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

よくある課題だ。長々と説明しなくても、「あれだな」とわかる。 しかしACCSSVBAなど、SQLを使えるものと違って、エクセルでは、抜出し(選択)が、VBAでは 複雑になるので、やる気がしない。 エクセルで該当するものを抜き出すのはFilterだが、これでやれるかやってみたら。 エクセルの入力規則の、リストでも2段階ぐらいなら、VBAを使わなくてもやる方法が、WEBに載っているのではと思う。エクセルでもADOを使ってSQLのSELECT文を使う方法は、WEBに載っているから、勉強する手がある。この辺になると、知らない世界に入る方法もあるので、周りに良き指導者が必要と思う。 丸投げで帰ってきたコードや、説明文章だけで達成できるとは思わない。  初心者に、課題だけは、一般普通のものを割り当てられて、どうにかするのは、難しい。長年の色んなタイプの型を課題を経験して、貯めておいて、初めてある時に、役に立つというのが通例と思う。 もし、この問題の回答者が出ても、その人は、多分過去の他言語のJAVAなどの経験や、仕事経験のある人と推測する。

snoopy1971ken55
質問者

お礼

ありがとうございます。

関連するQ&A

  • Excel オーダーフォームのテキストボックス入力について

    オーダーフォームを作成し、テキストボックスを2つ以上作成し、コマンドボタンを1つ作りました。 同じ行ですべてを入力できるようにしたいのですが、どうしたらよいでしょうか? テキストボックス1の値を入力するためのコマンドは、最下位の行を探してそこに入力するようなコマンドを作っているはずです…その横の列にテキストボックス2の値を入力し、その横の列にテキストボックス3の値を入力し…というようにしていきたいのです。 Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = TextBox1.Value End With TextBox1.Value = "" TextBox1.SetFocus End Sub

  • 簡単な居酒屋の顧客管理シートをエクセルで作成したい

    添付のような簡単な顧客管理シートを作成したいと考えてます。 予約→来店にいたった団体のお客様を履歴として残し、次回の利用時に料理が被らないよう・・・といった趣旨で単純に役立てていきたいと考えております。 ダイアログの入力フォームはそれぞれの項目の最終行を取得して写されるものになっていて マクロはこんな感じです。 Option Explicit Private Sub CommandButton1_Click() Dim lRow As Long With ActiveSheet lRow = .Range("B" & Rows.Count).End(xlUp).Row .Range("B" & lRow + 1).Value = TextBox1.Value .Range("C" & lRow + 1).Value = TextBox2.Value .Range("D" & lRow + 1).Value = TextBox3.Value End With TextBox1.Value = "" TextBox1.SetFocus TextBox2.Value = "" TextBox2.SetFocus TextBox3.Value = "" TextBox3.SetFocus End Sub Private Sub UserForm_Click() End Sub とここまでの入力は出来るのですが、オートフィルタなどを使わずダイアログボックスの入力フォームで電話番号がリスト中のデータとヒットした場合(=リピーター)は「この方は既に登録済みです。来歴・コメントのみ更新します。」という表示が出るとともに、添付画像下部にあるように「井上」と「田中」の間に新たな行を挿入、来店日のみ書き足される、、、つまり一目で分かるよう、余計な入力の無いように紐付けしたいと考えております。 さらに「抽出ボタン」を作成して電話番号入力で添付のピンクの部分の情報をまとめて表示させることも可能であればしたいと考えております。 使用用途はここまでで単純なのですが、マクロもほぼ分からず、考えるにあたっては複雑そうで自分ではハードルが高いです。 これ以上の機能は求めませんので、シンプルな形で分かり易く教えて頂けると大変助かります。 恐縮ですが、どうぞよろしくお願いいたします。

  • エクセルマクロ_テキストボックスをシートに反映(その2)

    エクセルマクロ初心者です。(2003使用_ユーザーフォーム) 先ほどは大変お世話になりました。 複数行に応用させようとしたのですが、管理番号が余計に記載(テキストボックス(出荷日など)が空欄であっても、管理番号だけはとられてしまいます)されてしまいます。すみませんが、ご教授よろしくお願いいたします。 リストボックス1のデータは、Sheet1を表示しています。→管理番号はSheet2のA最終行に記載されます。 テキストボックス1(回答日)は、上記の管理番号記載のとなりに、 テキストボックス2(出荷日)は、テキストボックス1記載のとなりに、 ・・・とテキストボックス4(コメント)(これはK列)に1行で記載されます。 ↑ここまでは、教えていただいたので、完璧なのですが、 テキストボックス2~4までの内容を、あと複数行(4件)追加できるように試してみたのですが、空欄であっても管理番号だけは常に記載されてしまいます。 テキストボックス2と5に記載されている場合は、Sheet2に値を反映させるが、空欄の場合は、値を反映させないようにしたいのです。 (Sheet1=データベース) C5   D5 管理番号 品名 アカ12 りんご アオ56 みかん クロ34 なし クロ89 すいか アオ12 もも (Sheet2=入力シート) A(管理番号)    B(回答日)    C(出荷日)   D(数量)     K(コメント) アオ56        8月9日        8月10日      75     送り先の確認 アオ56                    8月11日      80 クロ34        9月4日        9月5日      80 (今回は、2行で作成した場合のマクロを記載しました) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "0;0;50;50" .ColumnCount = 4 .RowSource = "Sheet1!A5:D" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row End With End Sub Private Sub CommandButton1_Click() If TextBox2.Value Then Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox1.Value) Then .Range("B" & lRow + 1).Value = TextBox1.Value End If If IsDate(TextBox2.Value) Then .Range("C" & lRow + 1).Value = TextBox2.Value End If If IsNumeric(TextBox3.Value) Then .Range("D" & lRow + 1).Value = TextBox3.Value End If .Range("K" & lRow + 1).Value = TextBox4.Value End With End If If TextBox5.Value Then Dim llRow As Long With Worksheets("Sheet2") llRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & llRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox5.Value) Then .Range("C" & llRow + 1).Value = TextBox5.Value End If If IsNumeric(TextBox6.Value) Then .Range("D" & llRow + 1).Value = TextBox6.Value End If .Range("K" & llRow + 1).Value = TextBox7.Value End With End If Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then myCtrl.Value = vbNullString End If Next End Sub (ユーザーフォーム) リストボックス1=Sheet1のデータを反映 テキストボックス1(回答日) テキストボックス2(出荷日),テキストボックス3(数量),テキストボックス4(コメント)←1件目 テキストボックス5(出荷日),テキストボックス6(数量),テキストボックス7(コメント)←2件目 ↑1件目のみでコマンドボタンを押した場合は、1件目のみの管理番号取得をしたいのです。が今は、2件目が空欄でも管理番号はとられてしまいます。 長くなってしまいすみません。 どなたかご回答いただければ幸いです。よろしくお願いいたします。

  • テキスト値をExcel反映空欄を無視し連続入力

    テキストボックス1~30に入力した際、テキストの3行目をクリアーした後、実行ボタンを押したらExcelsheet1のABC列に入力できるがテキストに空欄が生じた場合、以下のコードでは空欄以降の値が入力できません。空欄は無視し続けてセルに入力するコード表示はあるのでしょうか、お解りになる方宜しくお願いします。 できればコード追加入力で行いたいのですが。 Private Sub 実行_Click() Dim i As Integer Dim LRow As Long LRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To 10 If Me.Controls("TextBox" & i).Text = "" Then Exit For Range("A" & LRow + i).Value = Me.Controls("TextBox" & i).Text Range("B" & LRow + i).Value = Me.Controls("TextBox" & i + 10).Text Range("C" & LRow + i).Value = Me.Controls("TextBox" & i + 20).Text Next End Sub

  • リストボックスの内容を検索したいが...

    エクセル2019を使っています。 添付画像のようにユーザーフォームにテキストボックスとリストボックスを作り、テキストボックスに入力した文字でリストボックスの内容を検索しようとコードを作成しました。 Private Sub TextBox1_Change() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row .Range("A1").AutoFilter 1, "*" & TextBox1.Value & "*" If .Cells(Rows.Count, "A").End(xlUp).Row > 1 Then Set rng = .Range("A2:A" & LastRow).SpecialCells(xlCellTypeVisible) Else Me.ListBox1.Clear Exit Sub End If End With Me.ListBox1.Clear With Me.ListBox1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With End Sub Private Sub UserForm_Initialize() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row Set rng = .Range("A2:A" & LastRow) End With With Me.ListBox1 .ColumnCount = 1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With ListBox1.ListIndex = 0 End Sub とりあえず検索はできるのですが、使用されていない文字や記号を入力したあとにバックスペースキーで入力した文字や記号を削除するとリストボックスの内容が意図した内容で表示されません。 どこを修正したらいいでしょうか。

  • エクセル、不特定行数の条件分岐マクロについて

    不特定行数に B3セル以降下セルに優・良・可・不可を入れたく以下のように書きましたがうまく行きません。 どのようにしたら良いでしょうか。 If Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Offset(,1).FormulaR1C1.Value=100Then Range("L4:L" & Range("L" & Rows.Count).End(xlUp).Row).Offset(, 1).FormulaR1C1.Value = "優" ElseIf ("L4:L" & Range("L" & Rows.Count).End(xlUp).Row).Offset(, 1).FormulaR1C1.Value = ????  ・  ・  ・ End If

  • コンボボックス or リストボックス (複数列表示→値の取得)

    マクロ初心者です。(エクセル2003使用-ユーザーフォーム) 先日はお世話になり、ありがとうございました。 作成していくうちにさらに改良を加えたく、再質問させていただきます。 ※コンボボックス内の表示を複数行表示(Sheet1の管理番号,品名,注文数量)し、そのデータをSheet2のセルA(管理番号),セルB(品名),セルC(注文数量)と貼り付けようとしております。 が、本で探したところ複数行表示のやり方がリストボックスでしかのっていなく、さらに自分で作成したマクロでは動きませんでした。 すみませんが、お力をお貸しください。 (Sheet1) 担当課 客先 管理番号 品名 注文数量 出荷数量 A 岡田さん 1324 りんご 30 20 B 山田さん 1554 みかん 250 70 C 岡田さん 7634 なし 40 25 B 金子さん 4653 みかん 75 70 A 金子さん 6675 りんご 170 60 C 杉浦さん 7789 りんご 200 120 (↓こちらは、前回質問させていただいた内容です。) Private Sub UserForm_Initialize() ComboBox1.RowSource = "Sheet1! C2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。 ComboBox1.ListIndex = -1 ComboBox1.SetFocus End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ComboBox1.Value End With End Sub (↓こちらは、リストボックスでのマクロですが、動きません) Private Sub UserForm_Initialize() With UserForm2.ListBox1 .ColumnWidths = "70;50;50" .ColumnCount = 3 End With With Worksheets("Sheet1") Dim MyA As Variant Dim i As Long For i = 2 To UBound(MyA, 1) .AddItem .List(i - 2, 0) = Cells(i, 1).Value .List(i - 2, 1) = Cells(i, 2).Value .List(i - 2, 2) = Cells(i, 3).Value Next End With End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.Value End With End Sub 教えていただけましたら幸いです。 よろしくお願いいたします。

  • VBA 任意のシートからコピーを始める。

    教えてください。 全てのシートをコピーして一つのシートにまとめるプログラムシートを作成しました。 1番目のシートからコピーを始める場合は For i = 2 To Worksheets.Count 2番目のシートからコピーを始める場合は For i = 3 To Worksheets.Count とすればよいのですがこれだといちいちモジュールコードを出して数字を変更しなければならず面倒です。 そこでユーザーフォームのコンボボックスに任意の数字を入れてクリックを押せば希望するシートからコピーを始めるプログラムを作成してみましたがうまくいきません。どなたか教えてくださいませんか。 Sub matome() Dim i As Integer Dim lRow As Long, lCol As Long, lRow2 As Long, lRow3 As Long, SNo As Integer '----何番目からコピーを始めるかを決定します With UserForm2 SNo = .ComboBox1.value End With For i = 1 + SNo To Worksheets.Count With Worksheets(i) lRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 lCol = .Cells(1, Columns.Count).End(xlToLeft).Column '----シートのデータが2行以上の場合にコピーします If lRow >= 2 Then lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 If lRow2 < Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row + 1 Then lRow2 = Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row + 1 .Activate .Range(Cells(2, 1), Cells(lRow, lCol)).Copy Worksheets(1).Cells(lRow2, 1) End If End With Next i

  • VBA ユーザーフォーム リストボックス

    教えてください。 現在下記のようなコードでリストボックスに対象セルの値を表示しています。 Private Sub UserForm_Initialize() ListBox1.List = Range(Range("M5"), Cells(Rows.Count, 14).End(xlUp)).Value End Sub この時、例えば別シート(仮にsheet3)のセルを表示したい場合 どのようにすればいいでしょうか? ListBox1.List = sheets("sheet3").Range(Range("M5"), Cells(Rows.Count, 14).End(xlUp)).Value としてもエラーになってしまいます。 よろしくお願いします。

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

専門家に質問してみよう