web-dev-qa-db-ja.com

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

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インストールにインポートします。

よろしくお願いします。

9
GreysonD

これらのタスクは通常、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列をコピーします

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

enter image description here

8
nixda

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

手順:

  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)))
    記入すると、テーブルが完成します。

Screenshot of table

2
Excellll