Nhờ viết code hoặc viết hàm sắp xếp lại dữ liệu dạng cột thành dạng dòng (1 người xem)

  • Thread starter Thread starter camap97
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

camap97

Thành viên mới
Tham gia
21/9/08
Bài viết
8
Được thích
2
Mình có dữ liệu dạng bên dưới.

[TABLE="width: 372"]
[TR]
[TD]Tên hàng
[/TD]
[TD]Mã hàng[/TD]
[TD]Đơn hàng 1[/TD]
[TD]Đơn hàng 2[/TD]
[TD]Đơn hàng 3
[/TD]
[/TR]
[TR]
[TD]AAAA[/TD]
[TD="align: center"]1[/TD]
[TD="align: center"][/TD]
[TD="align: center"][/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]BBBB[/TD]
[TD="align: center"]2[/TD]
[TD="align: center"][/TD]
[TD="align: center"]5[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]CCCC[/TD]
[TD="align: center"]3[/TD]
[TD="align: center"][/TD]
[TD="align: center"][/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]DDDD[/TD]
[TD="align: center"]4[/TD]
[TD="align: center"]12[/TD]
[TD="align: center"]3[/TD]
[TD="align: center"][/TD]
[/TR]
[TR]
[TD]EEEE[/TD]
[TD="align: center"]5[/TD]
[TD="align: center"][/TD]
[TD="align: center"][/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]FFFF[/TD]
[TD="align: center"]6[/TD]
[TD="align: center"]2[/TD]
[TD="align: center"]7[/TD]
[TD="align: center"][/TD]
[/TR]
[TR]
[TD]GGG[/TD]
[TD="align: center"]7[/TD]
[TD="align: center"]3[/TD]
[TD="align: center"]8[/TD]
[TD="align: center"]1[/TD]
[/TR]
[/TABLE]

Nhờ các bạn viết code dùm mình để sắp xếp dữ liệu thành dạng bên dưới:

[TABLE="width: 216"]
[TR]
[TD]Đơn hàng 1[/TD]
[TD="align: center"]DDDD[/TD]
[TD="align: center"]12[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD="align: center"]FFFF[/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD="align: center"]GGG[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]BBBB[/TD]
[TD="align: center"]5[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]DDDD[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]FFFF[/TD]
[TD="align: center"]7[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]GGG[/TD]
[TD="align: center"]8[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]AAAA[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]BBBB[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]CCCC[/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]EEEE[/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]GGG[/TD]
[TD="align: center"]1[/TD]
[/TR]
[/TABLE]

Mình có đính kèm file excel cho các bạn tham khảo. Cám ơn các bạn trước nha.
 

File đính kèm

Mình có dữ liệu dạng bên dưới.

[TABLE="width: 372"]
[TR]
[TD]Tên hàng
[/TD]
[TD]Mã hàng[/TD]
[TD]Đơn hàng 1[/TD]
[TD]Đơn hàng 2[/TD]
[TD]Đơn hàng 3
[/TD]
[/TR]
[TR]
[TD]AAAA[/TD]
[TD="align: center"]1[/TD]
[TD="align: center"][/TD]
[TD="align: center"][/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]BBBB[/TD]
[TD="align: center"]2[/TD]
[TD="align: center"][/TD]
[TD="align: center"]5[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]CCCC[/TD]
[TD="align: center"]3[/TD]
[TD="align: center"][/TD]
[TD="align: center"][/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]DDDD[/TD]
[TD="align: center"]4[/TD]
[TD="align: center"]12[/TD]
[TD="align: center"]3[/TD]
[TD="align: center"][/TD]
[/TR]
[TR]
[TD]EEEE[/TD]
[TD="align: center"]5[/TD]
[TD="align: center"][/TD]
[TD="align: center"][/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]FFFF[/TD]
[TD="align: center"]6[/TD]
[TD="align: center"]2[/TD]
[TD="align: center"]7[/TD]
[TD="align: center"][/TD]
[/TR]
[TR]
[TD]GGG[/TD]
[TD="align: center"]7[/TD]
[TD="align: center"]3[/TD]
[TD="align: center"]8[/TD]
[TD="align: center"]1[/TD]
[/TR]
[/TABLE]

Nhờ các bạn viết code dùm mình để sắp xếp dữ liệu thành dạng bên dưới:

[TABLE="width: 216"]
[TR]
[TD]Đơn hàng 1[/TD]
[TD="align: center"]DDDD[/TD]
[TD="align: center"]12[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD="align: center"]FFFF[/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD="align: center"]GGG[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]BBBB[/TD]
[TD="align: center"]5[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]DDDD[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]FFFF[/TD]
[TD="align: center"]7[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD="align: center"]GGG[/TD]
[TD="align: center"]8[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]AAAA[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]BBBB[/TD]
[TD="align: center"]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]CCCC[/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]EEEE[/TD]
[TD="align: center"]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD="align: center"]GGG[/TD]
[TD="align: center"]1[/TD]
[/TR]
[/TABLE]

Mình có đính kèm file excel cho các bạn tham khảo. Cám ơn các bạn trước nha.
Sau khi chuyển thì đè lên dữ liệu cũ hay là để xuống bên dưới bảng chưa xắp xếp hay là cho sang Sheet khác,... hả bạn?
 
Upvote 0
Công việc mà bạn muốn, trong ngeehf CSDL gọi là chuẩn hoá. Gọi theo tiếng CSDL LH thì là chuẩn hoá bậc 1 (1st order normalisation)

Tuy nhiên, ai mà nhào vào làm cho bạn là do người ấy ngứa tay quá, chỉ muốn code cho đã. Chứ những điều kiện bạn đưa ra không đủ để làm cái gì cả.

Bạn cần cho biết thêm chi tiết. Nếu không biết các chi tiết này là đoán mò, 99% khả năng là phải làm lại.

1. Bạn có tất cả bao nhiêu đơn hàng? nếu không rõ thì ít nhất phải xác định là số đơn hàng = số cột - 2, có phải hay không?

2. Cái con số ở mỗi ô có phải là số lượng đặt hàng?

3. Mỗi loại hàng nằm trong đơn hàng là duy nhất? Nói cách khác, một đơn có thể có nhiều mặt hàng, nhưng mõi mặt hàng chỉ xuất hiện 1 lần trong đơn hàng? Tức là khi code làm việc, lúc chuyển ra dòng thì có cần phải tổng những con số của mặt hàng A trong đơn hàng N hay không?

4. Trong ví dụ của bạn chỉ cần lấy tên hnagf, mã hàng không cần. Đúng không?
 
Upvote 0
Mình có cảm giác như tác giả muốn làm ngược lại từ một bảng pivot table thành một bảng dữ liệu.
Không biết có đúng không?
 
Upvote 0
Đơn giản
Copy\Paste Special\Transpose...........Xong ngồi uống cafe |||||
 
Upvote 0
Mình xin trả lời các bạn như bên dưới. Các bạn giúp mình nhé!

Công việc mà bạn muốn, trong ngeehf CSDL gọi là chuẩn hoá. Gọi theo tiếng CSDL LH thì là chuẩn hoá bậc 1 (1st order normalisation)

Tuy nhiên, ai mà nhào vào làm cho bạn là do người ấy ngứa tay quá, chỉ muốn code cho đã. Chứ những điều kiện bạn đưa ra không đủ để làm cái gì cả.

Bạn cần cho biết thêm chi tiết. Nếu không biết các chi tiết này là đoán mò, 99% khả năng là phải làm lại.

1. Bạn có tất cả bao nhiêu đơn hàng? nếu không rõ thì ít nhất phải xác định là số đơn hàng = số cột - 2, có phải hay không?

2. Cái con số ở mỗi ô có phải là số lượng đặt hàng?

3. Mỗi loại hàng nằm trong đơn hàng là duy nhất? Nói cách khác, một đơn có thể có nhiều mặt hàng, nhưng mõi mặt hàng chỉ xuất hiện 1 lần trong đơn hàng? Tức là khi code làm việc, lúc chuyển ra dòng thì có cần phải tổng những con số của mặt hàng A trong đơn hàng N hay không?

4. Trong ví dụ của bạn chỉ cần lấy tên hnagf, mã hàng không cần. Đúng không?


Cám ơn phản hồi của bạn, bạn xem câu trả lời của mình bên dưới nha.

1. Bạn có tất cả bao nhiêu đơn hàng? nếu không rõ thì ít nhất phải xác định là số đơn hàng = số cột - 2, có phải hay không? - Số đơn hàng = số cột - 2

2. Cái con số ở mỗi ô có phải là số lượng đặt hàng? - Đúng vậy, số ở mỗi ô là số lượng đặt hàng.

3. Mỗi loại hàng nằm trong đơn hàng là duy nhất? Nói cách khác, một đơn có thể có nhiều mặt hàng, nhưng mõi mặt hàng chỉ xuất hiện 1 lần trong đơn hàng? Tức là khi code làm việc, lúc chuyển ra dòng thì có cần phải tổng những con số của mặt hàng A trong đơn hàng N hay không? - Mỗi mặt hàng chỉ xuất hiện 1 lần, không cần tính tổng.

4. Trong ví dụ của bạn chỉ cần lấy tên hnagf, mã hàng không cần. Đúng không? - Đúng, mình chỉ cần lấy tên hàng, không cần mã hàng.

Mình có cảm giác như tác giả muốn làm ngược lại từ một bảng pivot table thành một bảng dữ liệu.
Không biết có đúng không?
- Đại loại là như vậy. Nhưng dữ liệu này do mình nhập ta mà có chứ không phải là pivot, không có source nào khác.
 
Upvote 0
Một cách viết:
Mã:
Public Sub DocNgang()
    Dim Vung, TieuDe, Kq, I, J, K
        Set TieuDe = Range([A4], [A4].End(xlToRight))
        Set Vung = Range([A5], [A5].End(xlDown)).Resize(, TieuDe.Columns.Count)
        ReDim Kq(1 To WorksheetFunction.CountA(Vung) - Vung.Rows.Count * 2, 1 To 3)
            For I = 3 To Vung.Columns.Count
                For J = 1 To Vung.Rows.Count
                    If Vung(J, I) <> "" Then
                        K = K + 1
                        Kq(K, 1) = TieuDe(I): Kq(K, 2) = Vung(J, 1): Kq(K, 3) = Vung(J, I)
                    End If
                Next J
            Next I
      [F16].Resize(K, 3) = Kq
End Sub
 
Upvote 0
Mình có cảm giác như tác giả muốn làm ngược lại từ một bảng pivot table thành một bảng dữ liệu.
Không biết có đúng không?

Đuúng vậy. Theo tiếng kỹ thuật thì công việc này còn gọi là UnPivot.

@chủ thớt: bài này đã được giải ở bài #7. Tôi chỉ đưa code của tôi có chú thích cho dễ hiểu thôi.

Mã:
Sub UnPivot()
[COLOR=#008000]' sub dùng để unpivot một bảng đã crosstabed trở về thành bảng dọc
[/COLOR]Const BANGDULIEU = "A4"[COLOR=#008000] ' ô đầu tiên của bảng ở đây[/COLOR]
Dim sh As Worksheet, rg As Range
Set sh = Sheets("sheet1")
Set rg = sh.Range(BANGDULIEU)
Set rg = rg.Resize(rg.End(xlDown).row - rg.row + 1, rg.End(xlToRight).Column - rg.Column + 1)[COLOR=#008000] ' xác đinh phạm vi cả bảng[/COLOR]
Dim dat As Variant, donHang As Integer, matHang As Integer
Dim unPV(), tenHang As String, monHang As Integer
dat = rg.Value ' copy data qua mang de de truy cuu
ReDim unPV(1 To UBound(dat, 1) * UBound(dat, 2), 1 To 3)
monHang = 0 ' chua co mon hang nao
For donHang = 3 To UBound(dat, 2) [COLOR=#008000]' doc tung don hang[/COLOR]
    For matHang = 2 To UBound(dat, 1) [COLOR=#008000]' doc tung mat hang[/COLOR]
        If dat(matHang, donHang) <> "" Then [COLOR=#008000]' mat hang co trong don hang[/COLOR]
            monHang = monHang + 1
            unPV(monHang, 1) = dat(1, donHang) [COLOR=#008000]' ten don hang[/COLOR]
            unPV(monHang, 2) = dat(matHang, 1) [COLOR=#008000]' ten mon hang[/COLOR]
            unPV(monHang, 3) = dat(matHang, donHang) [COLOR=#008000]' luong hang[/COLOR]
        End If
    Next matHang
Next donHang
rg.Offset(rg.Rows.Count + 4, 4).Resize(monHang, 3) = unPV [COLOR=#008000]' chép kết quả đã unpivot ra[/COLOR]
Set sh = Nothing
Set rg = Nothing
End Sub
 
Upvote 0
Đuúng vậy. Theo tiếng kỹ thuật thì công việc này còn gọi là UnPivot.

@chủ thớt: bài này đã được giải ở bài #7. Tôi chỉ đưa code của tôi có chú thích cho dễ hiểu thôi.

Mã:
Sub UnPivot()
[COLOR=#008000]' sub dùng để unpivot một bảng đã crosstabed trở về thành bảng dọc
[/COLOR]Const BANGDULIEU = "A4"[COLOR=#008000] ' ô đầu tiên của bảng ở đây[/COLOR]
Dim sh As Worksheet, rg As Range
Set sh = Sheets("sheet1")
Set rg = sh.Range(BANGDULIEU)
Set rg = rg.Resize(rg.End(xlDown).row - rg.row + 1, rg.End(xlToRight).Column - rg.Column + 1)[COLOR=#008000] ' xác đinh phạm vi cả bảng[/COLOR]
Dim dat As Variant, donHang As Integer, matHang As Integer
Dim unPV(), tenHang As String, monHang As Integer
dat = rg.Value ' copy data qua mang de de truy cuu
ReDim unPV(1 To UBound(dat, 1) * UBound(dat, 2), 1 To 3)
monHang = 0 ' chua co mon hang nao
For donHang = 3 To UBound(dat, 2) [COLOR=#008000]' doc tung don hang[/COLOR]
    For matHang = 2 To UBound(dat, 1) [COLOR=#008000]' doc tung mat hang[/COLOR]
        If dat(matHang, donHang) <> "" Then [COLOR=#008000]' mat hang co trong don hang[/COLOR]
            monHang = monHang + 1
            unPV(monHang, 1) = dat(1, donHang) [COLOR=#008000]' ten don hang[/COLOR]
            unPV(monHang, 2) = dat(matHang, 1) [COLOR=#008000]' ten mon hang[/COLOR]
            unPV(monHang, 3) = dat(matHang, donHang) [COLOR=#008000]' luong hang[/COLOR]
        End If
    Next matHang
Next donHang
rg.Offset(rg.Rows.Count + 4, 4).Resize(monHang, 3) = unPV [COLOR=#008000]' chép kết quả đã unpivot ra[/COLOR]
Set sh = Nothing
Set rg = Nothing
End Sub
Bác VetMini và Concogia đúng là bậc tiền bối có khác, không viết thì thôi, viết bài nào ra bài đấy
PHP:
ReDim Kq(1 To WorksheetFunction.CountA(Vung) - Vung.Rows.Count * 2, 1 To 3)
đoạn này 26-14 cũng nguy hiểm quá
 
Upvote 0
Do mới tự học VBA nên chỉ biết được range với cell và vòng lặp thôi. Nhưng vẫn áp dụng thử hàm tự tạo để giải bài này.
Khó diễn tả nên xin gửi file đính kèm. Mong mọi người góp ý thêm nhé.
 

File đính kèm

Upvote 0
Dùng công thức bạn nhé
Tại A16
Mã:
=IFERROR(INDEX($A$4:$E$4,--LEFT(SMALL(IF($C$5:$E$11<>"",COLUMN($C$5:$E$11)*10^5+ROW($C$5:$E$11),""),ROW(1:1)),1)),"")
Tại B16
Mã:
=IFERROR(INDEX($A$1:$A$11,--RIGHT(SMALL(IF($C$5:$E$11<>"",COLUMN($C$5:$E$11)*10^5+ROW($C$5:$E$11),""),ROW(1:1)),3)),"")
Tại C16
Mã:
=IFERROR(INDEX($A$1:$E$11,--RIGHT(SMALL(IF($C$5:$E$11<>"",COLUMN($C$5:$E$11)*10^5+ROW($C$5:$E$11),""),ROW(1:1)),3),--LEFT(SMALL(IF($C$5:$E$11<>"",COLUMN($C$5:$E$11)*10^5+ROW($C$5:$E$11),""),ROW(1:1)),1)),"")
Tất cả các công thức để kết thúc bởi tổ hợp 3 phím Ctrl + Shift + Enter
 
Upvote 0
Mình cám ơn tất cả các bạn. Tất cả công thức / code của các bạn mình đều sử dụng được.
Chúc mọi người vui khỏe. Mình cần phải học tập nhiều nữa :-=
 
Upvote 0
Chào bạn
Mình thì chỉ mới tập tành viết code thôi nên có gì mong bác thông cảm, bài này theo mình thì bạn chỉ cần viết theo cách đơn giản, cái này là mình nghĩ sao viết vậy thôi à hihi



Public Sub SS()
Dim i As Long, j As Long
k = 1
Sheet2.Range("A2:E500").ClearContents
Sheet2.Cells(1, 1) = "Ten Hang"
Sheet2.Cells(1, 2) = "Ma Hang"
Sheet2.Cells(1, 3) = "So Luong"
Sheet2.Cells(1, 4) = "So Don Hang"
For j = 3 To 5
For i = 5 To Sheet1.UsedRange.Rows.Count
If Sheet1.Cells(i, j) <> "" Then
k = k + 1
Sheet2.Cells(k, 1) = Sheet1.Cells(i, 1)
Sheet2.Cells(k, 2) = Sheet1.Cells(i, 2)
Sheet2.Cells(k, 3) = Sheet1.Cells(i, j)
Sheet2.Cells(k, 4) = Sheet1.Cells(4, j)
End If
Next i
Next j
End Sub
 
Upvote 0
Chào bạn
Mình thì chỉ mới tập tành viết code thôi nên có gì mong bác thông cảm, bài này theo mình thì bạn chỉ cần viết theo cách đơn giản, cái này là mình nghĩ sao viết vậy thôi à hihi
...

Trước đây tôi cũng làm như bạn. Nhưng sau một thời gian, tôi chấp nhận "nhập giang tuỳ khúc, nhập gia tuỳ tục". Hầu hết dân ở đây chỉ thích code chiến, tốc độ là điều kiện cốt yếu. Theo tinh thần ấy thì code của bạn xài không được.

Ở đây phần lớn là chỉ xin code. Cho nên định nghĩa code đơn giản là ngắn, ít dòng chứ không phải là sử dụng các công cụ gần gũi.

Lưu ý: tôi chỉ nói trên sự việc tôi nhận xét ở đây thôi. Vấn đề đúng hay sai tôi đã xác định là "phép vua thua lệ làng" rồi.
 
Upvote 0
Cho mình hỏi thêm, trong trường hợp mình cần thêm tên hàng và giá nữa thì có thể viết code được không. Hiện mình đang dùng hàm VLOOKUP nhưng nếu có code có thể lọc luôn được tất cả giá trị này thì rất tốt.
Cảm ơn các bạn trước nha.

[TABLE="width: 612"]
[TR]
[TD="colspan: 2"]Dữ liệu ban đầu (số lượng đơn hàng có thể tăng lên nhiều hơn nữa, có thể lên đến 20 đơn hàng)[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD="colspan: 3"]Số lượng từng đơn hàng[/TD]
[/TR]
[TR]
[TD]Tên hàng[/TD]
[TD]Mã hàng[/TD]
[TD]Giá tiền[/TD]
[TD]Đơn hàng 1[/TD]
[TD]Đơn hàng 2[/TD]
[TD]Đơn hàng 3[/TD]
[/TR]
[TR]
[TD]AAAA[/TD]
[TD]1A[/TD]
[TD]10[/TD]
[TD][/TD]
[TD][/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]BBBB[/TD]
[TD]2B[/TD]
[TD]20[/TD]
[TD][/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]CCCC[/TD]
[TD]3C[/TD]
[TD]30[/TD]
[TD][/TD]
[TD][/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]DDDD[/TD]
[TD]4D[/TD]
[TD]40[/TD]
[TD]12[/TD]
[TD]3[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]EEEE[/TD]
[TD]5E[/TD]
[TD]50[/TD]
[TD][/TD]
[TD][/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]FFFF[/TD]
[TD]6F[/TD]
[TD]60[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]1[/TD]
[/TR]
[/TABLE]


[TABLE="width: 510"]
[TR]
[TD]Sau khi chuyển[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]Đơn hàng[/TD]
[TD]Tên hàng[/TD]
[TD]Mã hàng[/TD]
[TD]Giá tiền[/TD]
[TD]Số lượng[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD]DDDD[/TD]
[TD]4D[/TD]
[TD]40[/TD]
[TD]12[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD]FFFF[/TD]
[TD]6F[/TD]
[TD]60[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]BBBB[/TD]
[TD]2B[/TD]
[TD]20[/TD]
[TD]5[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]DDDD[/TD]
[TD]4D[/TD]
[TD]40[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]FFFF[/TD]
[TD]6F[/TD]
[TD]60[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]AAAA[/TD]
[TD]1A[/TD]
[TD]10[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]BBBB[/TD]
[TD]2B[/TD]
[TD]20[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]CCCC[/TD]
[TD]3C[/TD]
[TD]30[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]EEEE[/TD]
[TD]5E[/TD]
[TD]50[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]1[/TD]
[/TR]
[/TABLE]
 

File đính kèm

Upvote 0
Cho mình hỏi thêm, trong trường hợp mình cần thêm tên hàng và giá nữa thì có thể viết code được không. Hiện mình đang dùng hàm VLOOKUP nhưng nếu có code có thể lọc luôn được tất cả giá trị này thì rất tốt.
Cảm ơn các bạn trước nha.

[TABLE="width: 612"]
[TR]
[TD="colspan: 2"]Dữ liệu ban đầu (số lượng đơn hàng có thể tăng lên nhiều hơn nữa, có thể lên đến 20 đơn hàng)[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD="colspan: 3"]Số lượng từng đơn hàng[/TD]
[/TR]
[TR]
[TD]Tên hàng[/TD]
[TD]Mã hàng[/TD]
[TD]Giá tiền[/TD]
[TD]Đơn hàng 1[/TD]
[TD]Đơn hàng 2[/TD]
[TD]Đơn hàng 3[/TD]
[/TR]
[TR]
[TD]AAAA[/TD]
[TD]1A[/TD]
[TD]10[/TD]
[TD][/TD]
[TD][/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]BBBB[/TD]
[TD]2B[/TD]
[TD]20[/TD]
[TD][/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]CCCC[/TD]
[TD]3C[/TD]
[TD]30[/TD]
[TD][/TD]
[TD][/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]DDDD[/TD]
[TD]4D[/TD]
[TD]40[/TD]
[TD]12[/TD]
[TD]3[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]EEEE[/TD]
[TD]5E[/TD]
[TD]50[/TD]
[TD][/TD]
[TD][/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]FFFF[/TD]
[TD]6F[/TD]
[TD]60[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]1[/TD]
[/TR]
[/TABLE]


[TABLE="width: 510"]
[TR]
[TD]Sau khi chuyển[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]Đơn hàng[/TD]
[TD]Tên hàng[/TD]
[TD]Mã hàng[/TD]
[TD]Giá tiền[/TD]
[TD]Số lượng[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD]DDDD[/TD]
[TD]4D[/TD]
[TD]40[/TD]
[TD]12[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD]FFFF[/TD]
[TD]6F[/TD]
[TD]60[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 1[/TD]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]BBBB[/TD]
[TD]2B[/TD]
[TD]20[/TD]
[TD]5[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]DDDD[/TD]
[TD]4D[/TD]
[TD]40[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]FFFF[/TD]
[TD]6F[/TD]
[TD]60[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]Đơn hàng 2[/TD]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]AAAA[/TD]
[TD]1A[/TD]
[TD]10[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]BBBB[/TD]
[TD]2B[/TD]
[TD]20[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]CCCC[/TD]
[TD]3C[/TD]
[TD]30[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]EEEE[/TD]
[TD]5E[/TD]
[TD]50[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Đơn hàng 3[/TD]
[TD]GGG[/TD]
[TD]7G[/TD]
[TD]70[/TD]
[TD]1[/TD]
[/TR]
[/TABLE]
suar lại một chút thầy Concogia là được
PHP:
Public Sub DocNgang()
    Dim Vung, TieuDe, Kq, I, J, K
        Set TieuDe = Range([A5], [A5].End(xlToRight))
        Set Vung = Range([A6], [A6].End(xlDown)).Resize(, TieuDe.Columns.Count)
        ReDim Kq(1 To WorksheetFunction.CountA(Vung) - Vung.Rows.Count * 2, 1 To 5)
            For I = 4 To Vung.Columns.Count
                For J = 1 To Vung.Rows.Count
                    If Vung(J, I) <> "" Then
                        K = K + 1
                        Kq(K, 1) = TieuDe(I)
                        Kq(K, 2) = Vung(J, 1)
                        Kq(K, 3) = Vung(J, 2)
                         Kq(K, 4) = Vung(J, 3)
                         Kq(K, 5) = Vung(J, I)
                        
                    End If
                Next J
            Next I
      [F16].Resize(K, 5) = Kq
End Sub
nếu số lượng đơn hàng tăng lên như bạn nói, thay thế này luôn, bạn đỡ phải sửa, nếu chưa biết VBA
PHP:
Public Sub DocNgang()
    Dim Vung, TieuDe, Kq, I, J, K
        Set TieuDe = Range([A5], [A5].End(xlToRight))
        Set Vung = Range([A6], [A6].End(xlDown)).Resize(, TieuDe.Columns.Count)
        ReDim Kq(1 To WorksheetFunction.CountA(Vung) - Vung.Rows.Count * 2, 1 To TieuDe.Columns.Count)
            For I = 4 To Vung.Columns.Count
                For J = 1 To Vung.Rows.Count
                    If Vung(J, I) <> "" Then
                        K = K + 1
                        Kq(K, 1) = TieuDe(I)
                        Kq(K, 2) = Vung(J, 1)
                        Kq(K, 3) = Vung(J, 2)
                         Kq(K, 4) = Vung(J, 3)
                         Kq(K, 5) = Vung(J, I)
                        
                    End If
                Next J
            Next I
      [F16].Resize(K, TieuDe.Columns.Count) = Kq
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom