Làm cách nào để chia một hàng thành nhiều hàng với Excel?


9

Tôi có một cơ sở dữ liệu sản phẩm trong Excel với hàng trăm mục nhập, mỗi mục có từ 1 đến 3 "bậc" về giá: Standard, Deluxe và Premium. Mỗi tầng có SKU riêng (A, B hoặc C được thêm vào cuối SKU cơ sở) và giá. Dữ liệu của tôi là như thế này:

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,      ,

Làm thế nào tôi có thể nhận được dữ liệu trông như thế này:

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

Nếu có ích, tôi sẽ nhập các sản phẩm này vào bản cài đặt Magento.

Cảm ơn bạn trong nâng cao.


Có khả năng có một số tên và mô tả tương tự? Ví dụ: Hai dòng có name1desc1nhưng với các mức giá khác nhau cho Giá A, Giá B, Giá C, v.v.
Jerry

Trong dữ liệu gốc? Không, tôi chắc chắn rằng chúng là duy nhất. Nhưng, trong dữ liệu mới chắc chắn sẽ có sự lặp lại.
GreysonD

Được rồi, tôi đã có một cái gì đó trong tâm trí, nhưng hóa ra nó sẽ không hoạt động trừ khi có thêm thao tác phía sau để sửa một số kết quả. Nếu bạn tò mò, tôi đã thử PivotTable Hợp nhất, nhưng trường Mô tả và các trường SKU sẽ phải được kéo riêng bằng cách sử dụng chỉ mục / kết hợp / vlookup, điều này làm cho nó khá dài ở cuối.
Jerry

Câu trả lời:


8

Những nhiệm vụ thường nhanh hơn với VBA. Trên thực tế, tôi đã mất ~ 10 phút để thiết lập nó.
Tôi giả sử dữ liệu của bạn nằm trong cột A đến cột H.

Chuyển đến Excel » Developer » Visual Basic»Trên khung bên trái mở sheet1(hoặc) trang tính nơi dữ liệu của bạn cư trú» Chèn mã ở cửa sổ bên phải »Chạy mã

Mã 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

Giải trình

Đó là ý định của tôi để giữ mã càng ngắn càng tốt để giải thích nó tốt hơn. Về cơ bản chúng tôi sử dụng hai vòng. Vòng lặp bên ngoài ( i) dành cho các hàng và vòng lặp bên trong ( j) cho các cột giá.

Chúng tôi sử dụng rất nhiều cells(rowNumber,columnNumber)để đọc / ghi các tế bào.

  • Dòng 2 | Bắt đầu một vòng lặp từ hàng 2 đến hàng cuối cùng của bạn. Chúng tôi lặp đi lặp lại qua mỗi hàng được sử dụng

  • Dòng 3 | Bắt đầu một vòng lặp thứ hai từ 0 đến 2 (thực tế là 3 vòng lặp, một vòng cho mỗi cột Giá)

  • Dòng 4 | Chúng tôi sử dụng vòng lặp bên trong này để kiểm tra các giá trị trong hàng và cột hiện tại của chúng tôi Giá A, sau đó là Giá B và trong vòng lặp cuối Giá C. Nếu chúng tôi tìm thấy một giá trị trong cột Giá, chúng tôi tiếp tục và sao chép các ô. Nếu không có Giá nào được chèn, chúng tôi sẽ không làm gì và chuyển sang cột Giá tiếp theo

  • Dòng 5 | Đếm một bộ đếm để biết chúng tôi đã sao chép bao nhiêu hàng,
    vì vậy chúng tôi biết sau hàng nào chúng tôi có thể sao chép hàng hiện tại của mình

  • Dòng 6 | Sao chép cột tên

  • Dòng 7 | Sao chép cột mô tả

  • Dòng 8 | Sao chép cột Giá A hoặc B hoặc C tùy thuộc vào vòng lặp bên trong chúng tôi hiện đang là gì

  • Dòng 9 | Sao chép cột SKU A hoặc B hoặc C tùy thuộc vào vòng lặp bên trong chúng tôi hiện đang là gì

Ảnh chụp màn hình kết quả

nhập mô tả hình ảnh ở đây


1
Cái này thật tuyệt! Chính xác những gì tôi cần. Dữ liệu của tôi thực sự phức tạp hơn một chút so với ví dụ của tôi và tôi mới biết về VBA, vì vậy lời giải thích của bạn giúp ích rất nhiều. Cảm ơn!
GreysonD

2

Đây là một giải pháp chức năng bảng tính. Các công thức là một chút dày đặc, vì vậy được cảnh báo, nhưng điều này sẽ cung cấp cho những gì bạn muốn.

Các bước:

  1. Trong hàng đầu tiên của bảng mới, bên dưới Name, hãy nhập tham chiếu trực tiếp đến bảng đầu tiên Nametrong dữ liệu của bạn. Trong ví dụ của bạn, bạn sẽ nhập vào =A2nơi A2 là tên đầu tiên được liệt kê trong dữ liệu của bạn. Trong ảnh chụp màn hình ví dụ tôi đã cung cấp dưới đây, công thức này được đưa vào A8. Tất cả các công thức sau đây sẽ theo bố cục được sử dụng trong ảnh chụp màn hình. Tất nhiên bạn sẽ phải cập nhật tất cả các tham chiếu phạm vi để phù hợp với (các) trang tính của bạn.
  2. Trong ô bên dưới này, nhập công thức sau:
    = 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)
    
    Về cơ bản, điều này sẽ kiểm tra xem có bao nhiêu hàng cho tên được liệt kê ở trên (trong A9) và nếu số lượng hàng đã có trong bảng mới của bạn khớp với tên này, thì nó sẽ chuyển sang tên tiếp theo. Nếu không, một hàng khác cho tên ở trên sẽ được thêm vào.
    Điền công thức này xuống càng xa càng tốt (cho đến khi nó trả về 0 thay vì tên).
  3. Trong hàng đầu tiên bên dưới, Descriptionnhập công thức sau và điền vào.
    = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0))
  4. Trong hàng đầu tiên bên dưới SKU, dán công thức sau vào thanh công thức và nhấn Ctrl+ Shift+ Enter.
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0), NHỎ (IF (OFFSET ($ F $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0) <> "", CỘT ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Đây là một công thức mảng; nếu được nhập chính xác, công thức sẽ xuất hiện trong thanh công thức được đặt trong dấu ngoặc nhọn. Điền công thức này xuống bảng của bạn (mỗi trường hợp cũng sẽ xuất hiện trong dấu ngoặc nhọn).
  5. Tương tự, trong hàng đầu tiên bên dưới Price, dán công thức sau vào thanh công thức và nhập nó dưới dạng công thức mảng (bằng cách nhấn Ctrl+ Shift+ Enter).
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), NHỎ (IF (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9 , $ A $ 2: $ A $ 5,0), 0) <> "", CỘT ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Điền vào, và điều này sẽ hoàn thành bảng của bạn.

Ảnh chụp màn hình của bảng


Công thức ấn tượng! Giữa câu trả lời này và câu trả lời của VBA, tôi đặt ra cho mọi thứ khá nhiều. Cảm ơn!
GreysonD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.