回答受付が終了しました

エクセルについてご質問で シート1 B列に品名、C列に数量、D列に納期、E列に納品先

エクセルについてご質問で シート1 B列に品名、C列に数量、D列に納期、E列に納品先 のデータがあり、 B列に同じ品名だがC、Dへ違う数量、納期もあるデータになります。 AAA 2個 0101 a倉庫 AAA 1個 0101 b倉庫 AAA 2個 0103 b倉庫 BBB 2個 0101 a倉庫 BBB 1個 0102 a倉庫 BBB 3個 0101 b倉庫 上記は数個のデータですが、実際はかなりの量がります。 上記データを貼り付けすれば、 別シートに下記のような表示に反映するように式を組みたいです。 A列__B列__C列__ D列 品名__a倉__b倉__納期 aaa___2_________01/01 aaa________1____01/01 aaa________2___ 01/03 bbb___2________01/01 bbb___1_________01/02 bbb________3____01/01 アンダーバーは気にしないでください 可能で有れば教えてください。

Windows系19閲覧

回答(1件)

0

「シート1」の他に「シート2」というシート名のシートが存在しなければなりません。 また、「シート1」のデータも2行目から始まっている(1行目は項目行)、という想定です。 Sub Sample() Dim s1 As Worksheet, s2 As Worksheet Dim i As Long, j As Long, r As Long Dim c As Long, m As Long, x As String Set s1 = Worksheets("シート1") Set s2 = Worksheets("シート2") ReDim f(0) As String c = 0 f(c) = s1.Range("E2").Value r = s1.Cells(Rows.Count, "E").End(xlUp).Row For i = 3 To r x = s1.Cells(i, "E").Value m = 0 For j = 0 To c If f(j) = x Then m = 1 Exit For End If Next j If m = 0 Then c = c + 1 ReDim Preserve f(c) f(c) = x End If Next i s2.Range("A1").Value = "品名" For i = 0 To c s2.Cells(1, i + 2).Value = f(i) Next i s2.Cells(1, c + 3).Value = "納期" For i = 2 To r s2.Cells(i, "A").Value = s1.Cells(i, "B").Value For j = 0 To c If s1.Cells(i, "E").Value = f(j) Then m = j + 2 Exit For End If Next j x = s1.Cells(i, "C").Value s2.Cells(i, m).Value = Mid(x, 1, Len(x) - 1) x = s1.Cells(i, "D").Value s2.Cells(i, c + 3).NumberFormat = "@" s2.Cells(i, c + 3).Value = Left(x, 2) & "/" & Right(x, 2) Next i End Sub 簡単な説明です。 ReDim f(0) As String c = 0 f(c) = s1.Range("E2").Value r = s1.Cells(Rows.Count, "E").End(xlUp).Row For i = 3 To r x = s1.Cells(i, "E").Value m = 0 For j = 0 To c If f(j) = x Then m = 1 Exit For End If Next j If m = 0 Then c = c + 1 ReDim Preserve f(c) f(c) = x End If Next i この部分は、工場の数(=「c」)と、工場名(=「f()」)を調べています。 やっているのは、2行目の工場名を「f(0)」に覚えさせ、3行目からは、すでに覚えた工場名かどうかをいちいち調べ、無かったら、新たな工場名として「f(1)」に登録、ということを最終行まで繰り返します。 もちろん、また、見つかれば「f(2)」、「f(3)」となるわけです。 s2.Range("A1").Value = "品名" 「シート2」のセル「A1」に「品名」という文字列を書き込んでいます。 For i = 0 To c For i = 0 To c s2.Cells(1, i + 2).Value = f(i) Next i 1行目の列「B」以降に工場名を書き込んでいます。 s2.Cells(1, c + 3).Value = "納期" 最後の工場名の隣に「納期」という文字列を書き込んでいます。 For i = 2 To r 2行目から最終行まで繰り返し。 s2.Cells(i, "A").Value = s1.Cells(i, "B").Value 「シート1」の品名をそのまま「シート2」に書き込んでいます。 For j = 0 To c If s1.Cells(i, "E").Value = f(j) Then m = j + 2 Exit For End If Next j ここでは、その「i」行目がどの工場かを調べ、それによって「シート2」に書き込む際の列(=「m」)を計算しています。 x = s1.Cells(i, "C").Value s2.Cells(i, m).Value = Mid(x, 1, Len(x) - 1) 「個」という文字列(=「最後の1文字」)を取り除いた部分を「シート2」の上記で計算した列に書き込んでいます。 x = s1.Cells(i, "D").Value s2.Cells(i, c + 3).NumberFormat = "@" s2.Cells(i, c + 3).Value = Left(x, 2) & "/" & Right(x, 2) 「納期」を書き込んでいるのですが、真ん中に「/」を入れています。 Next i を、最終行まで繰り返しています。