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インストールにインポートします。
よろしくお願いします。
これらのタスクは通常、VBAを使用すると高速になります。実際、セットアップに10分ほどかかりました。
データが列Aから列Hにあると想定しています。
_Excel » Developer » Visual Basic
_に移動します"左側のペインで_sheet1
_(または)データが存在するシートを開きます"右側のウィンドウにコードを挿入します"コードを実行します
_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列をコピーします
これはワークシート関数ソリューションです。数式は少し密集しているので注意が必要ですが、これで十分です。
手順:
Name
の下に、データの最初のName
への直接参照を入力します。この例では、=A2
と入力します。ここで、A2はデータにリストされている最初の名前です。以下に示すスクリーンショットの例では、この数式はA8
になります。以下のすべての数式は、スクリーンショットで使用されているレイアウトに従います。もちろん、シートに一致するようにすべての範囲参照を更新する必要があります。= 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
内)に必要な行数をチェックし、新しいテーブルに既にある行の数がこれと一致する場合は、次の名前に移動します。そうでない場合は、上記の名前の別の行が追加されます。Description
の下の最初の行に、次の数式を入力して入力します。= INDEX($ B $ 2:$ B $ 5、MATCH(A9、$ A $ 2:$ A $ 5,0))
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)))これは配列数式です。正しく入力すると、式は中括弧で囲まれた式バーに表示されます。この数式をテーブルに入力します(各インスタンスも同様に中かっこで囲まれる必要があります)。
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)))記入すると、テーブルが完成します。