『複数の設定データを横方向に一括入力するにはどうすればいいですか?』(正光) Listbox1で業者を選択しListBox3で日付を設定し、ComboBox2で商品を設定したデータをCommandButton1_Clickして横方向にカレンダーTbl(Worksheets("原紙").Range("c3").Resize(31, 23))に入力していきたいのですが、うまくいきません?教えて頂けないでしょうか? ただし、Listbox1とListbox3は複数選択が可能で複数のデータを入力することが出来るように Private Sub CommandButton1_Click() Dim tbl As Range Dim 行 As Long Dim 列 As Long With ListBox1 '業者名が入ってます For i = 0 To .ListCount - 1 If .Selected(i) = True Then リスト = リスト & " " & " " & " " & .List(i) & vbCrLf ListBox1.Selected(i) = False End If Next i End With With ListBox3 ’日付が入ってます。 For 行 = 0 To .ListCount - 1 If .Selected(行) = True Then 列 = ActiveSheet.Cells(行, Columns.Count).End(xlToLeft).Column + 1 If 行 * 列 = 0 Then Exit Sub Set tbl = Worksheets("原紙").Range("c3").Resize(31, 23) tbl(行, 列).Value = ComboBox2.Value & リスト ListBox3.Selected(行) = False End If Next 行 End With ListBox3.Value = "" ComboBox2.Value = "" End Sub < 使用 Excel:Excel2019、使用 OS:Windows10 > ---- 全体のレイアウトがよくわかりません。 例えば↓のように【】で囲まれているのが選択されているものだとして Listbox1・・・業者 【A社】 B社 【C社】 D社 ListBox3・・・日付 【6/1】 6/2 【6/3】 【6/4】 ComboBox2・・・商品 【いろは】 ↓がどのようになれば正解なのですか? ●「原紙」シート ___C___ ___D___ ___E___ ___F___ ___G___ ___H___ 3 4 5 6 7 8 9 10 (もこな2) 2021/06/15(火) 17:10 ---- ありがとうございます。   ___C___   ___D___  ___E___  ___F___  ___G___   ___H___(注文予約欄) 3 A業者商品1 B業者商品3 C業者商品5 → 4 A業者商品2 B業者商品4 C業者商品6 → 5   ・    ・     ・ 6 B業者商品5 C業者商品1 → 7 B業者商品4 C業者商品6 → 8   ・    ・    ・ 9 A業者商品8 →・    ・      10 B業者商品7 → ・    ・     ・ (日付欄) まずcombobox2で商品を選択しListbox1で業者を選択し最後に日付を選択すれば同じ日付なら  ば横にデータが入っていくようにしたいのです (正光) 2021/06/15(火) 17:52 ---- 列 = ActiveSheet.Cells(行, Columns.Count).End(xlToLeft).Column + 1この部分をどのように変更すればいいか分かりません (正光) 2021/06/15(火) 19:10 ---- うーん。さっぱりわかりません。 こちらが提示した条件(Listbox1、Listbox3の選択状況)にあわせてレイアウト提示されるか、希望の完成図にあわせて選択条件(Listbox1、Listbox3、ComboBox2の状況)を提示しなおしされるのが筋じゃないですか? 提示されたものだと、複数選択しないはずのComboBox2(商品)が複数ありますし少なくとも私には状況が理解できません。 (もこな2) 2021/06/15(火) 20:41 ---- もこな2様本当にすいませんでした。 Listbox1・・・商品 【A社】 B社 【C社】 D社 ListBox3・・・日付 【6/1】 6/2 【6/3】 【6/4】 ComboBox2・・・業者 【いろは】 ___C___   ___D___  ___E___  ___F___  ___G___   ___H___(注文予約欄) 3 A業者商品1 B業者商品3 C業者商品5 → 4 A業者商品2 B業者商品4 C業者商品6 → 5   ・    ・     ・ 6 B業者商品5 C業者商品1 → 7 B業者商品4 C業者商品6 → 8   ・    ・    ・ 9 A業者商品8 →・    ・      10 B業者商品7 → ・    ・     ・ (日付欄) まずcombobox2で業者を選択しListbox1で商品を選択し最後に日付を選択すれば同じ日付ならば横にデータが入っていくようにしたいのです (正光) 2021/06/15(火) 17:52 (正光) 2021/06/16(水) 06:50 ---- 何が変わったんでしょうか・・・とみていて変わったのこっちですか・・ Listbox1・・・業者 →商品 ListBox3・・・日付 ComboBox2・・ 商品 →業者 変更前 Listbox1で業者を選択しListBox3で日付を設定し、ComboBox2で商品を設定したデータ 変更後 combobox2で業者を選択しListbox1で商品を選択し最後に(ListBox3で)日付を選択 そうなると【複数】選択される可能性があるのはどの項目なのですか? 【複数選択】されている形で、完成形と選択状態両方の、名称をあわせて提示してください。 "A社"なら"A社"、"A業者"なら"A業者"、"いろは"なら"いろは"、"商品1"なら"商品1"のように、選択されるものと完成予定図を合わせていただかないと、私には理解できません。 (もこな2) 2021/06/16(水) 08:03 ---- ComboBox2・・・会社名 【A社】 B社 【C社】 D社 ListBox3・・・日付 【6/1】 6/2 【6/3】 【6/4】 Listbox1・・・商品 【商品1】   商品2  【商品3】  【商品4】   商品5   商品6 ___C___   ___D___  ___E___  ___F___  ___G___   ___H___(注文予約欄) 3 A社商品1 B社商品3 C社商品5 → 4 A社商品2 B社商品4 C社商品6 → 5   ・    ・     ・ 6 B社商品5 C社商品1 → 7 B社商品4 C社商品6 → 8   ・    ・    ・ 9 A社商品8  →・    ・      10 B社商品7  → ・   ・     ・ (日付欄) まずcombobox2で業者を選択しListbox1で商品を選択し最後に日付を選択すれば同じ日付ならば横にデータが入っていくようにしたいのです 複数選択可能なコントロールはListBox3・・・日付 Listbox1・・・商品の2つです。 (正光) 2021/06/16(水) 11:25 ---- ■1 >複数選択可能なコントロールはListBox3・・・日付 >Listbox1・・・商品の2つです。 ならば、↓はおかしくないですか?(これでは複数選択しているイメージですよね。) ComboBox2・・・会社名 【A社】 B社 【C社】 D社 ■2 >同じ日付ならば 「カレンダーTbl(Worksheets("原紙").Range("c3").Resize(31, 23))」と言っているので想像はつきますが、【同じ日付】とは何を示すのか、出力セル範囲の【行or列】で説明してください。 (万が一誤解があると手間なので) さらに、想像ですが追記していくと、【23件】以上は表範囲を超えると思うんですが、そこは考慮しなくてよいのですか? ■3 >横にデータが入っていくようにしたい どうも、【追記】するようなイメージでいるようなので、そうであればレイアウトはマクロ【実行前】と【実行後】の両方を提示してください。 (現状だと、選択していない会社名や商品まで(■2と絡みますが、たぶん日付も)出力されているので訳が分かりません) (もこな2) 2021/06/16(水) 12:16 ---- ■1 ComboBox2・・・会社名 【A社】 B社  C社 D社  ComboBox2会社名は複数選択が可能ではありませんでした。 ■2 【同じ日付】とは各々会社が商品を注文する日が同じ日、出力セル範囲の【行が日付(Listbox3複数選択可)or列が注文予約欄(各々の会社名(ComboBox2)&商品データ(Listbox1複数選択可)】 【23件】以上は表範囲を超えるが、考慮しなくていいです。 ■3 >横にデータが入っていくようにしたい    【1回目実行前】      ComboBox2・・・会社名 【A社】 B社 C社 D社  E社   ListBox3・・・日付 【6/1】 6/2 【6/3】 【6/4】 Listbox1・・・商品 【商品1】   商品2 【商品3】 【商品4】  商品5   商品6 【1回目実行後】 __C___   ___D___    ___E___  (注文予約欄) 3(6/1) A社商品1,3,4   4(6/2)   5(6/3) A社商品1,3,4   6(6/4) A社商品1,3,4 7(6/5)  8(6/6)  9(6/7)     10(6/8) (日付欄)    【2回目実行前】      ComboBox2・・・会社名   A社 【B社】 C社 D社  E社   ListBox3・・・日付 【6/1】 6/2 【6/3】 【6/4】 Listbox1・・・商品 商品1 【商品2】 商品3 商品4 【商品5】 【商品6】 【2回目実行後】 __C___   ___D___     ___E___  (注文予約欄) 3(6/1) A社商品1,3,4   B社商品2,5,6 4(6/2)   5(6/3) A社商品1,3,4   B社商品2,5,6 6(6/4) A社商品1,3,4 B社商品2,5,6 7(6/5)  8(6/6)  9(6/7)     10(6/8) (日付欄) まずcombobox2で業者を選択しListbox1で商品を選択し最後に日付を選択すれば 同じ日付ならば横にデータが入っていくようにしたいのです。 各々の会社が注文する商品の組み合わせはほとんど同じパターンですから 同じ日に別々の会社が重なれば横にデータが入っていくようにしたいのですが もこな2さん ご指導宜しくお願い致します。 (正光) 2021/06/16(水) 20:07 ---- ■4 >ComboBox2会社名は複数選択が可能ではありませんでした。 そうです「ComboBox」ですからね。 ■5 >23件】以上は表範囲を超えるが、考慮しなくていいです。 わかりました。 ■6 >>横にデータが入っていくようにしたい それは察しがついてます。 確認したかったのは【3行目から下方向に6/1〜6/30まで日付ごとになっている】ということでした。 完成予定図のほうはずれてよくわかりませんが、↓はちょっとめんどくさいのでパスします。 【A社商品1,3,4】 ■7 とりあえず情報をまとめると、 (1)ListBox3(日付)から【出力行】を求め (2)【出力行】に対応する最終列を求めて右にずらす(出力列) (3)そのセルから右に「ComboBox2(会社名)」と「Listbox1(商品)」を組み合わせたものを出力する とすればよさそうにおもいます。 ■8 >もこな2さん ご指導宜しくお願い致します。 とりあえず考えたことは提示しますが、私にはいまいち詳細が理解できないので一旦ここまでとします。(といいつつコメントするかもですが) Private Sub UserForm_Initialize() Dim MyDate As Date Me.ComboBox2.List = Array("A社", "B社", "C社", "D社") Me.ListBox1.List = Split("商品1,商品2,商品3,商品4,商品5,商品6", ",") For MyDate = DateSerial(2021, 6, 1) To DateSerial(2021, 7, 0) Me.ListBox3.AddItem Format(MyDate, "m/d") Next MyDate End Sub '=========================================== Private Sub CommandButton1_Click() Dim i As Long, 出力行 As Long, 出力列 As Long Dim objDIC As Object If Me.ComboBox2.ListIndex = -1 Then MsgBox "会社名が選択されていません" Exit Sub End If Set objDIC = CreateObject("Scripting.Dictionary") With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then objDIC.Add Me.ComboBox2.Text & .List(i), Me.ComboBox2.Text & .List(i) Next i End With If objDIC.Count = 0 Then Exit Sub With Worksheets("原紙") For i = 0 To Me.ListBox3.ListCount - 1 If Me.ListBox3.Selected(i) Then 出力行 = Day(CDate(Me.ListBox3.List(i))) + 2 出力列 = WorksheetFunction.Max(3, .Cells(出力行, .Columns.Count).End(xlToLeft).Column + 1) .Cells(出力行, 出力列).Resize(, objDIC.Count).Value = objDIC.keys End If Next i End With End Sub ↑は完成品のプレゼントではありません。ちゃんと研究の上必要な部分をご自身のコードに取り込んでください。 (丸写しして完成!というのはご遠慮ください) (もこな2) 2021/06/16(水) 21:55