[[20210403103019]] 『1オーダー1行のデータを1商品1行に変換』(hitomi) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『1オーダー1行のデータを1商品1行に変換』(hitomi)

1オーダー1行のデータがあり、各オーダーのT列以降には商品名、数量、単価のセルが、オーダーした商品数だ繰り返されます。
T列より前はそのオーダーの購入商品以外の情報が記載されてます(オーダー番号、購入者名、住所、配達日、時間等)

この様なデータを
1行1商品のオーダーデータに変換したいです。
T列までは同じ共通なので、各行にはT列までの情報+1商品分のデータ。
もし1オーダーで30商品購入されてる場合は30行のデータになります。

1シートに数百のオーダーがあり、それを別シートに1行1商品のデータに変換するにはどどのような関数を使えば良いでしょうか?

1オーダーで1商品しか購入してないオーダーもあれば、30商品以上購入してるオーダーもあります。

宜しくお願いします。

< 使用 Excel:Excel2007、使用 OS:Windows10 >


>商品数だ繰り返されます。
商品数が30個あったら右へ商品名、数量、単価のセルが30回続くということかな?
レイアウト提示したらどうですか。
範囲を指定してコピー、その後ここへ貼り付けて!

(kj) 2021/04/03(土) 11:04


 A列から右にずーっとあったとして
項目1	項目2	項目3	項目4	項目5	項目6	項目7	項目8	項目9	項目10	項目11	項目12	項目13	項目14	項目15	項目16	項目17	項目18	項目19	項目20	商品名	数量	単価	商品名	数量	単価	商品名	数量	単価	商品名	数量	単価	商品名	数量	単価	商品名	数量	単価
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	a1	5	100	あ2	10	1100	あ3	7	500	あ4	3	800	あ5	3	800	あ6	3	800
い1	い2	い3	い4	い5	い6	い7	い8	い9	い10	い11	い12	い13	い14	い15	い16	い17	い18	い19	い20	b1	3	1000															
う1	う2	う3	う4	う5	う6	う7	う8	う9	う10	う11	う12	う13	う14	う15	う16	う17	う18	う19	う20	c1	8	10	c2	11	100												

 ひたすら数合わせをすれば↓こんな感じになるにはなりますけど、、、

 項目1	項目2	項目3	項目4	項目5	項目6	項目7	項目8	項目9	項目10	項目11	項目12	項目13	項目14	項目15	項目16	項目17	項目18	項目19	項目20	商品名	数量	単価
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	a1	5	100
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	あ2	10	1100
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	あ3	7	500
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	あ4	3	800
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	あ5	3	800
あ1	あ2	あ3	あ4	あ5	あ6	あ7	あ8	あ9	あ10	あ11	あ12	あ13	あ14	あ15	あ16	あ17	あ18	あ19	あ20	あ6	3	800
い1	い2	い3	い4	い5	い6	い7	い8	い9	い10	い11	い12	い13	い14	い15	い16	い17	い18	い19	い20	b1	3	1000
う1	う2	う3	う4	う5	う6	う7	う8	う9	う10	う11	う12	う13	う14	う15	う16	う17	う18	う19	う20	c1	8	10
う1	う2	う3	う4	う5	う6	う7	う8	う9	う10	う11	う12	う13	う14	う15	う16	う17	う18	う19	う20	c2	11	100

 本当はトランスポウズを使って拡張したらいいんでしょうけど。。。
3つの時の数合わせです。
参考にして頂けたら幸いです。。。参考にならんか_| ̄|○

 Option Explicit
Sub てすと()
Dim MyAry As Variant
Dim MyA As Variant
Dim i As Long
Dim j As Long
Dim jj As Long
Dim jx As Long
Dim k As Long
Dim n As Long
MyA = Sheets("Sheet1").Range("A1").CurrentRegion.Value
ReDim MyAry(1 To ((UBound(MyA, 2) - 20) / 3) + 4, 1 To 20 + 3)
k = 1
For j = 1 To 20 + 3
    MyAry(1, j) = MyA(1, j)
Next
For i = LBound(MyA, 1) + 1 To UBound(MyA, 1)
    For j = 21 To UBound(MyA, 2)
        n = 0
        If (MyA(i, j) <> "") * (MyA(1, j) = "商品名") Then
            k = k + 1
            For jj = LBound(MyA, 2) To 20
                MyAry(k, jj) = MyA(i, jj)
            Next
            For jx = 21 To UBound(MyAry, 2)
                MyAry(k, jx) = MyA(i, j + n)
                n = n + 1
            Next
        End If
    Next
Next
With Sheets("Sheet2")
    .Cells.Clear
    .Range("A1").Resize(UBound(MyAry, 1), UBound(MyAry, 2)).Value = MyAry
End With
Erase MyA, MyAry
End Sub
(SoulMan) 2021/04/03(土) 11:28

(kj) 様
ありがとうございます!
教えて教えて頂いた方法でチャレンジしてみます!
(hitomi) 2021/04/03(土) 13:51

回答してくれたのはSoulManさんです。
私はあなたに質問しただけです。
(kj) 2021/04/03(土) 14:57

たぶんこういうことでしょう
   _______A_________B____...____T________U_______V________W________X_______Y________Z_______AA_______AB________
  1 オーダー番号 購入者名    商品名1   数量1   単価1   商品名2   数量2   単価2   商品名3   数量3   単価3
  2   A00001     鈴木一郎     ああ      10      100     いい      20        50    うう      10      1000
  3   A00002     佐藤二郎     いい      30       50
  4   A00003     北島三郎     ああ      40      100     うう       5      1000

   _______A_________B____...____T________U_______V____
  1 オーダー番号 購入者名    商品名    数量    単価
  2   A00001     鈴木一郎     ああ      10      100
  2   A00001     鈴木一郎     いい      20       50
  2   A00001     鈴木一郎     うう      10     1000
  2   A00002     佐藤二郎     いい      30       50
  2   A00003     北島三郎     ああ      40      100
  2   A00003     北島三郎     うう       5     1000

>どのような関数を使えば良いでしょうか
関数でもできるかもしれませんが、ちょっと私には思いつかなかったのでマクロ案

    Sub 研究用()
        Dim データ行 As Long, 出力行 As Long
        Dim 列 As Long

        Stop 'ブレークポイントの代わり

        出力行 = 2
        With Worksheets("データ")
            For データ行 = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
                For 列 = 20 To .Cells(データ行, .Columns.Count).End(xlToLeft).Column Step 3
                    Union(.Cells(データ行, "A").Resize(, 19), .Cells(データ行, 列).Resize(, 3)).Copy Worksheets("別シート").Cells(出力行, "A")
                    出力行 = 出力行 + 1
                Next 列
            Next データ行
        End With
    End Sub

マクロに抵抗がなければ研究してみてはどうでしょうか。

(もこな2) 2021/04/03(土) 16:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.