Đánh số thứ tự dựa vào cột mã số

Liên hệ QC

PhamHuyHung1990

Thành viên mới
Tham gia
18/10/21
Bài viết
28
Được thích
3
Xin chào cả nhà,

Em muốn đánh số thứ tự tự động cho báo cáo dựa vào cột mã số. File báo cáo em đã đánh số thứ tự một cách thủ công trong file đính kèm. Rất mong mọi người giúp đỡ ạ.
 

File đính kèm

Xin chào cả nhà,

Em muốn đánh số thứ tự tự động cho báo cáo dựa vào cột mã số. File báo cáo em đã đánh số thứ tự một cách thủ công trong file đính kèm. Rất mong mọi người giúp đỡ ạ.
Chẳng theo quy luật nào đánh kiểu gì ta.
 
Chẳng theo quy luật nào đánh kiểu gì ta.
có quy luật chứ. số thứ tự sẽ có dạng
a. Dành cho dòng thông tin vùng
a.b. Dành cho dòng thông tin về Loại thức ăn
a.b.c. Dành cho dòng thông tin về loại cám
a.b.c.d. Dành cho dòng thông tin về đại lý

a. Là vùng (Bắc, Trung, Nam), có thể nhận các giá trị 1, 2, 3 tùy theo số vùng có trong dữ liệu
b. Là loại thức ăn (thức ăn cho cá, thức ăn cho gà, thức ăn cho lợn, vịt, chim cút, đà điểu...), có thể nhận giá trị 1, 2, 3...
c. Là loại cám (cám hỗn hợp, cám đậm đặc, thức ăn bổ sung vitamin, thức ăn bổ sung khoáng chất...), có thể nhận giá trị 1, 2...
d. Là đại lý, có thể có rất nhiều, đến vài trăm

Tên khách hàng thì đánh số thứ tự dạng n như
1
2
3
...
 
Lần chỉnh sửa cuối:
Đánh số thứ tự bằng công thức thì mình chịu!
Nhưng mình khuyên chủ bài đăng: Nên lâp các bảng danh mục rõ ràng; Không nên lập kiểu như #3 trên kia, xấu xí & khó cho mọi người có nhã ý giúp bạn!

Chúc ngày cuối tuần vui vẻ!
 
có quy luật chứ. số thứ tự sẽ có dạng
a. Dành cho dòng thông tin vùng
a.b. Dành cho dòng thông tin về Loại thức ăn
a.b.c. Dành cho dòng thông tin về loại cám
a.b.c.d. Dành cho dòng thông tin về đại lý

a. Là vùng (Bắc, Trung, Nam), có thể nhận các giá trị 1, 2, 3 tùy theo số vùng có trong dữ liệu
b. Là loại thức ăn (thức ăn cho cá, thức ăn cho gà, thức ăn cho lợn, vịt, chim cút, đà điểu...), có thể nhận giá trị 1, 2, 3...
c. Là loại cám (cám hỗn hợp, cám đậm đặc, thức ăn bổ sung vitamin, thức ăn bổ sung khoáng chất...), có thể nhận giá trị 1, 2...
d. Là đại lý, có thể có rất nhiều, đến vài trăm

Tên khách hàng thì đánh số thứ tự dạng n như
1
2
3
...
Chạy code dưới:
Mã:
Option Explicit

Sub Level()
Dim pt As PivotTable, Arr(), Res(), I&, J&, K&, Cols&, chkArr(), Txt$, Rng As Range
Set pt = Sheets("BaoCao").PivotTables(1)
pt.RowAxisLayout xlOutlineRow
pt.ColumnGrand = True
Set Rng = pt.TableRange2
Arr = Rng.Value
Cols = Rng.Columns.Count - pt.DataFields.Count
ReDim Res(1 To UBound(Arr) - 2, 1 To 1)
ReDim chkArr(1 To Cols)
For I = 2 To UBound(Arr) - 1
    For J = 1 To Cols
        If Arr(I, J) <> "" Then
            K = J
            chkArr(J) = chkArr(J) + 1
        End If
        If J > K Then chkArr(J) = 0
    Next
    Txt = Join(chkArr, ".")
    If Arr(I, Cols) <> "" Then
        Res(I - 1, 1) = Mid(Txt, InStrRev(Txt, ".") + 1)
    Else
        Res(I - 1, 1) = "'" & Mid(Txt, 1, InStr(Txt, "0") - 1)
    End If
Next
Rng(2, 1).Offset(, -1).Resize(UBound(Res), 1) = Res
pt.RowAxisLayout xlCompactRow
End Sub
 

File đính kèm

Chạy code dưới:
Mã:
Option Explicit

Sub Level()
Dim pt As PivotTable, Arr(), Res(), I&, J&, K&, Cols&, chkArr(), Txt$, Rng As Range
Set pt = Sheets("BaoCao").PivotTables(1)
pt.RowAxisLayout xlOutlineRow
pt.ColumnGrand = True
Set Rng = pt.TableRange2
Arr = Rng.Value
Cols = Rng.Columns.Count - pt.DataFields.Count
ReDim Res(1 To UBound(Arr) - 2, 1 To 1)
ReDim chkArr(1 To Cols)
For I = 2 To UBound(Arr) - 1
    For J = 1 To Cols
        If Arr(I, J) <> "" Then
            K = J
            chkArr(J) = chkArr(J) + 1
        End If
        If J > K Then chkArr(J) = 0
    Next
    Txt = Join(chkArr, ".")
    If Arr(I, Cols) <> "" Then
        Res(I - 1, 1) = Mid(Txt, InStrRev(Txt, ".") + 1)
    Else
        Res(I - 1, 1) = "'" & Mid(Txt, 1, InStr(Txt, "0") - 1)
    End If
Next
Rng(2, 1).Offset(, -1).Resize(UBound(Res), 1) = Res
pt.RowAxisLayout xlCompactRow
End Sub
Cám ơn bác nhiều, đáp án chuẩn không cần chỉnh!
Bài đã được tự động gộp:

Đánh số thứ tự bằng công thức thì mình chịu!
Nhưng mình khuyên chủ bài đăng: Nên lâp các bảng danh mục rõ ràng; Không nên lập kiểu như #3 trên kia, xấu xí & khó cho mọi người có nhã ý giúp bạn!

Chúc ngày cuối tuần vui vẻ!
Cám ơn bác đã góp ý, em đang nghiên cứu làm, mới giải quyết được bước 1 của bài toán bằng cách thêm cột phụ với công thức
=LET(Loai;IFNA(VLOOKUP(B4;MaHoa!$J$3:$L$140;3;0);5);IFS(Loai=1;”bài toán đánh số thứ tự cho dòng vùng”;Loai=2;”bài toán đánh số thứ tự cho dòng thức ăn”;Loai=3;”bài toán đánh số thứ tự cho dòng loại cám”;Loai=4;"bài toán đánh số thứ tự cho dòng đại lý";Loai=5;"bài toán đánh số thứ tự cho dòng khách hàng"))


Bước 2 bài toán có lẽ dùng hàm UNIQUE kết hợp hàm COUNTIF để giải, nhưng nghĩ chưa ra.

Bài toán đánh số thứ tự cho dòng vùng: =COUNTA(UNIQUE(LEFT($D$4:$D4;1)))&"."
Bài toán đánh số thứ tự cho dòng thức ăn: ???
Bài toán đánh số thứ tự cho dòng loại cám: ???
Bài toán đánh số thứ tự cho dòng đại lý: ???
Bài toán đánh số thứ tự cho dòng khách hàng: ???
 
Lần chỉnh sửa cuối:
Bạn lập các bảng như dưới đây; Sau đó xài VLOOKUP() mà nối chúng lại lần lượt thành mã thôi:

Tên miềnMã miềnVật nuôiMã DTTên thức ănMã TAĐại lýMã NSMã ĐL
Miền Bắc1Cho cá1Cám đậm đặc1Cấn Văn LongCVL0010
Miền Trung2Cho gà2Cám hỗn hợp2Dương Hùng MạnhDHM0011
Miền Nam3Cho lợn3Cám nhân tạo3Duy HưngDJH0012
Nước ngoài4Cho bò4Cám trộn NH34Đào Duy HùngFDH0013
Đào Tấn TrungFTT0014
Hoàng Văn TùngHVT0015
Lê Cảnh LinhLCL0016
Lý Chính ThắngLCT0017
Lê KhánhLJK0018
Lê Mạnh HùngLMH0019
Lê Minh TrangLMT0020
Nguyễn KiệmNJK0021
Nguyễn Thị Thanh HươngNTH0022
Nguyễn Thị HồngNTH0123
Nguyễn Văn KhaNVK0024
Nguyễn Văn ToànNVT0025
Tùng DươngTJD0026
Nguyễn Thị CậnTTC0027
Trịnh Thị LanTTL0028
Trịnh Văn BảyTVB0029
 
Bạn lập các bảng như dưới đây; Sau đó xài VLOOKUP() mà nối chúng lại lần lượt thành mã thôi:

Tên miềnMã miềnVật nuôiMã DTTên thức ănMã TAĐại lýMã NSMã ĐL
Miền Bắc1Cho cá1Cám đậm đặc1Cấn Văn LongCVL0010
Miền Trung2Cho gà2Cám hỗn hợp2Dương Hùng MạnhDHM0011
Miền Nam3Cho lợn3Cám nhân tạo3Duy HưngDJH0012
Nước ngoài4Cho bò4Cám trộn NH34Đào Duy HùngFDH0013
Đào Tấn TrungFTT0014
Hoàng Văn TùngHVT0015
Lê Cảnh LinhLCL0016
Lý Chính ThắngLCT0017
Lê KhánhLJK0018
Lê Mạnh HùngLMH0019
Lê Minh TrangLMT0020
Nguyễn KiệmNJK0021
Nguyễn Thị Thanh HươngNTH0022
Nguyễn Thị HồngNTH0123
Nguyễn Văn KhaNVK0024
Nguyễn Văn ToànNVT0025
Tùng DươngTJD0026
Nguyễn Thị CậnTTC0027
Trịnh Thị LanTTL0028
Trịnh Văn BảyTVB0029
Anh ơi, cách này em đã nghĩ đến mà dùng không được. Lý do:

- Miền Bắc bán được 3 mã cám là cho cá, cho gà, cho lợn => số thứ tự cho nó tương ứng là 1, 2, 3. Nhưng Miền nam bán đươc 2 mã cám là cám cho gà, cho lợn => số thứ tự tương ứng cho cám gà bị đổi lại từ 2 thành 1, cám cho lợn bị đổi thứ tự từ 3 thành 2.

- Sản lượng tiêu thụ theo quý cũng không giống nhau, ví dụ quý 1, miền bắc tiêu thụ 3 mã cám là cho cá, cho gà, cho lợn => số thứ tự cho nó tương ứng là 1, 2, 3. Tuy nhiên quý 2 thì chỉ tiêu thụ được cám cho lợn => mã gán cho số thứ tự từ 3 thành 1.
 
Bạn tham khảo thử & kiểm tra dùm dữ liệu trong file
Cám ơn bác đã giúp đỡ, em sẽ tham khảo cách bố trí dữ liệu này.
Tuy nhiên cấu trúc báo cáo là quy định cấp trên ban hành xuống, em bắt buộc phải tuân theo.

em đã giải quyết được vấn đề nhưng phải dùng tới 5 cột phụ (trong file đính kèm). Bác giúp em loại bỏ cột phụ với.
 

File đính kèm

Lần chỉnh sửa cuối:
Chạy code dưới:
Mã:
Option Explicit

Sub Level()
Dim pt As PivotTable, Arr(), Res(), I&, J&, K&, Cols&, chkArr(), Txt$, Rng As Range
Set pt = Sheets("BaoCao").PivotTables(1)
pt.RowAxisLayout xlOutlineRow
pt.ColumnGrand = True
Set Rng = pt.TableRange2
Arr = Rng.Value
Cols = Rng.Columns.Count - pt.DataFields.Count
ReDim Res(1 To UBound(Arr) - 2, 1 To 1)
ReDim chkArr(1 To Cols)
For I = 2 To UBound(Arr) - 1
    For J = 1 To Cols
        If Arr(I, J) <> "" Then
            K = J
            chkArr(J) = chkArr(J) + 1
        End If
        If J > K Then chkArr(J) = 0
    Next
    Txt = Join(chkArr, ".")
    If Arr(I, Cols) <> "" Then
        Res(I - 1, 1) = Mid(Txt, InStrRev(Txt, ".") + 1)
    Else
        Res(I - 1, 1) = "'" & Mid(Txt, 1, InStr(Txt, "0") - 1)
    End If
Next
Rng(2, 1).Offset(, -1).Resize(UBound(Res), 1) = Res
pt.RowAxisLayout xlCompactRow
End Sub
Code của bạn rất hay nên mình muốn vận dụng cho các trường hợp tương tự khác. Mình là tay ngang nên tìm hiểu cả ngày vẫn chưa hiểu rõ cách hoạt động của code này. Bạn có thể thêm chú thích ý nghĩa của các code cho mình với. Mình xin cám ơn và hậu tạ.
 
Ô A4:
Mã:
=IFERROR(CHOOSE(MATCH(TRUE,LEFT($B4,4)={"Miền","Thức","Cám ","Đại "},0),Mien,Thucan,Cam,Daily),kh)
Lưu ý:
1) Có 5 name : Mien, Thucan, Cam, Daily, kh
Bạn Ctrl-F3 xem công thức từng name nhé. Các name này là name động (thay đổi theo dòng).
2) Điều kiện: Nếu có khách hàng nào có họ tên với 4 ký tự đầu trùng với các name thì kết quả sẽ sai.
VD: "Miền Văn A", "Cám Văn Cảnh"
Để cho đơn giản công thức, và chắc cũng hiếm gặp trường hợp này nên dùng đỡ cái này nhé.
 

File đính kèm

Ô A4:
Mã:
=IFERROR(CHOOSE(MATCH(TRUE,LEFT($B4,4)={"Miền","Thức","Cám ","Đại "},0),Mien,Thucan,Cam,Daily),kh)
Lưu ý:
1) Có 5 name : Mien, Thucan, Cam, Daily, kh
Bạn Ctrl-F3 xem công thức từng name nhé. Các name này là name động (thay đổi theo dòng).
2) Điều kiện: Nếu có khách hàng nào có họ tên với 4 ký tự đầu trùng với các name thì kết quả sẽ sai.
VD: "Miền Văn A", "Cám Văn Cảnh"
Để cho đơn giản công thức, và chắc cũng hiếm gặp trường hợp này nên dùng đỡ cái này nhé.
Em cám ơn bác! Nhưng kết quả có 2 chỗ sai, em đã khoanh tròn trên hình đính kèm. Bác xem xử lý lại giúp em với!

1661324167937.png
 
Mình nhớ lỗi này đã sửa rồi mà khi post lên lại post file cũ.
Do vùng động trong name bị dư 3 dòng so với dòng hiện hành.
Xem lại file nhé.
 

File đính kèm

Dấu @ là ký hiệu "Implicit Intersection" của công thức mảng.
Khi công thức mảng ở file Excel đời trước (2013) đưa vào 365 (tức là các phiên bản có khả năng mảng động) ở vị trí có thể xảy ra "Implicit Intersection" thiif 365 thêm dấu @ để cảnh báo.

Bạn nào chưa hiểu "Implicit Intersection" là gì thì nên về học lại lý thuyết công thức mảng.
 
Web KT

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

Back
Top Bottom