Excelで1つの行を複数の行に分割するにはどうすればよいですか?


9

Excelに製品データベースがあり、数百のエントリがあり、それぞれに標準、デラックス、プレミアムという1〜3の「階層」の価格設定があります。各層には独自のSKU(A、B、またはCが基本SKUの最後に追加されます)と価格があります。私のデータは次のとおりです:

Name, Description, Price A, Price B, Price C, SKU A, SKU B, SKU C
name1,      desc1,   14.95,   19.95,        , sku1A, sku1B, 
name2,      desc2,    4.95,    9.95,   12.95, sku2A, sku2B, sku2C
name3,      desc3,   49.95,        ,        , sku3A,      ,

データを次のようにするにはどうすればよいですか?

Name, Description,   SKU, Price
name1,      desc1, sku1A, 14.95
name1,      desc1, sku1B, 19.95
name2,      desc2, sku2A,  4.95
name2,      desc2, sku2B,  9.95
name2,      desc2, sku2C, 12.95
name3,      desc3, sku3A, 49.95

それが役立つ場合は、これらの製品をMagentoインストールにインポートします。

よろしくお願いします。


同様の名前と説明がいくつかある可能性はありますか?たとえば、2つのラインがname1ありdesc1、価格A、価格B、価格Cなどの価格が異なる
ジェリー

元のデータでは?いいえ、私はそれらがユニークであると確信しています。しかし、新しいデータには間違いなく繰り返しがあります。
GreysonD 2013

さて、私は何かを念頭に置いていましたが、いくつかの結果を修正するための背後にさらに操作がない限り、それは機能しないことがわかりました。気になる方は、統合ピボットテーブルを試してみましたが、説明フィールドとSKUフィールドは、index / match / vlookupを使用して個別にプルする必要があるため、最後はかなり長くなります。
ジェリー

回答:


8

これらのタスクは通常、VBAを使用するとより高速になります。実際、セットアップに10分ほどかかりました。
データがA列からH列にあると想定しています。

移動Excel » Developer » Visual Basic»左側のペインsheet1で、データが存在するシートを開く(または)»右側のウィンドウにコードを挿入する»コードを実行する

VBAコード

1 |Sub NewLayout()
2 |    For i = 2 To Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
3 |        For j = 0 To 2
4 |        If Cells(i, 3 + j) <> vbNullString Then
5 |            intCount = intCount + 1
6 |            Cells(i, 1).Copy Destination:=Cells(intCount, 10)
7 |            Cells(i, 2).Copy Destination:=Cells(intCount, 11)
8 |            Cells(i, 3 + j).Copy Destination:=Cells(intCount, 12)
9 |            Cells(i, 6 + j).Copy Destination:=Cells(intCount, 13)
10|        End If
11|        Next j
12|    Next i
13|End Sub

説明

それをよりよく説明するために、コードをできるだけ短くすることが私の意図でした。基本的には2つのループを使用します。外側のループ(i)は行用で、内側のループ(j)は価格列用です。

cells(rowNumber,columnNumber)セルの読み取り/書き込みに頻繁に使用します。

  • 2行目| 行2から最後の行までループを開始します。使用されたすべての行を反復処理します

  • 3行目| 0から2までの2番目のループを開始します(実際には3つのループで、すべてのPrice列に1つ)

  • 4行目| この内部ループを使用して、現在の行と列の価格A、次に価格B、最後のループの価格Cの値をチェックします。価格列に値が見つかったら、セルをコピーします。Priceが挿入されていない場合、何もせずに次のPrice列に進みます

  • 5行目| カウンターをカウントアップして、既にコピー
    した行数を確認します。これにより、現在の行をコピーできる行がわかります。

  • 6行目| 名前列をコピーする

  • 7行目| 説明列をコピーする

  • 8行目| 現在の内部ループに応じて、価格AまたはBまたはC列をコピーします。

  • 9行目| 現在の内部ループに応じて、SKU AまたはBまたはC列をコピーします

結果のスクリーンショット

ここに画像の説明を入力してください


1
これは素晴らしいです!まさに私が必要とするもの。私のデータは実際には私の例よりも少し複雑であり、私はVBAを初めて使用するので、あなたの説明は非常に役立ちます。ありがとう!
GreysonD 2013

2

これはワークシート関数ソリューションです。数式は少し密集しているので注意が必要ですが、これで十分です。

手順:

  1. 新しいテーブルの最初の行ので、データの最初の行Nameへの直接参照を入力Nameします。この例で=A2は、データにリストされている最初の名前がA2であると入力します。以下のスクリーンショットの例では、この式はに当てはまりA8ます。以下のすべての数式は、スクリーンショットで使用されているレイアウトに従います。もちろん、シートに一致するようにすべての範囲参照を更新する必要があります。
  2. この下のセルに、次の数式を入力します。
    = IF(COUNTIF($ A $ 9:A9、A9)= COUNTA(OFFSET($ C $ 1:$ E $ 1、MATCH(A9、$ A $ 2:$ A $ 5,0)、0))、INDEX($ A $ 2 :$ A $ 5、MATCH(A9、$ A $ 2:$ A $ 5,0)+1)、A9)
    
    これは基本的に、上にリストされた名前(内A9)に必要な行数をチェックし、新しいテーブルに既にある行の数がこれと一致する場合は、次の名前に移動します。そうでない場合は、上記の名前の別の行が追加されます。
    この式を必要なところまで入力します(名前ではなく0が返されるまで)。
  3. 下の最初の行Descriptionに、次の数式を入力して入力します。
    = INDEX($ B $ 2:$ B $ 5、MATCH(A9、$ A $ 2:$ A $ 5,0))
  4. の下の最初の行でSKU、次の数式を数式バーに貼り付け、Ctrl+ Shift+ を押しEnterます。
    = INDEX(OFFSET($ A $ 1:$ H $ 1、MATCH(A9、$ A $ 2:$ A $ 5,0)、0)、SMALL(IF(OFFSET($ F $ 1:$ H $ 1、MATCH(A9、$ A $ 2:$ A $ 5,0)、0)<> ""、COLUMN($ F $ 1:$ H $ 1))、COUNTIF($ A $ 9:$ A9、$ A9)))
    これは配列数式です。正しく入力すると、数式は中括弧で囲まれた数式バーに表示されます。この数式をテーブルに入力します(各インスタンスは同様に中かっこで囲まれる必要があります)。
  5. 同様に、の下の最初の行でPrice、次の数式を数式バーに貼り付け、配列数式として入力します(Ctrl+ Shift+を押しEnterます)。
    = INDEX(OFFSET($ A $ 1:$ H $ 1、MATCH($ A9、$ A $ 2:$ A $ 5,0)、0)、SMALL(IF(OFFSET($ C $ 1:$ E $ 1、MATCH($ A9 、$ A $ 2:$ A $ 5,0)、0)<> ""、COLUMN($ C $ 1:$ E $ 1))、COUNTIF($ A $ 9:$ A9、$ A9)))
    記入すると、テーブルが完成します。

テーブルのスクリーンショット


印象的な式!これとVBAの答えの間で、私はほとんどすべてのものに取り掛かります。ありがとう!
GreysonD 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.