PhamHuyHung1990
Thành viên mới
- Tham gia
- 18/10/21
- Bài viết
- 28
- Được thích
- 3
Chẳng theo quy luật nào đánh kiểu gì ta.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 đỡ ạ.
có quy luật chứ. số thứ tự sẽ có dạngChẳng theo quy luật nào đánh kiểu gì ta.
Chạy code dưới: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
...
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!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 đã 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Đá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ẻ!
Tên miền | Mã miền | Vật nuôi | Mã DT | Tên thức ăn | Mã TA | Đại lý | Mã NS | Mã ĐL | |||||||||||
Miền Bắc | 1 | Cho cá | 1 | Cám đậm đặc | 1 | Cấn Văn Long | CVL00 | 10 | |||||||||||
Miền Trung | 2 | Cho gà | 2 | Cám hỗn hợp | 2 | Dương Hùng Mạnh | DHM00 | 11 | |||||||||||
Miền Nam | 3 | Cho lợn | 3 | Cám nhân tạo | 3 | Duy Hưng | DJH00 | 12 | |||||||||||
Nước ngoài | 4 | Cho bò | 4 | Cám trộn NH3 | 4 | Đào Duy Hùng | FDH00 | 13 | |||||||||||
Đào Tấn Trung | FTT00 | 14 | |||||||||||||||||
Hoàng Văn Tùng | HVT00 | 15 | |||||||||||||||||
Lê Cảnh Linh | LCL00 | 16 | |||||||||||||||||
Lý Chính Thắng | LCT00 | 17 | |||||||||||||||||
Lê Khánh | LJK00 | 18 | |||||||||||||||||
Lê Mạnh Hùng | LMH00 | 19 | |||||||||||||||||
Lê Minh Trang | LMT00 | 20 | |||||||||||||||||
Nguyễn Kiệm | NJK00 | 21 | |||||||||||||||||
Nguyễn Thị Thanh Hương | NTH00 | 22 | |||||||||||||||||
Nguyễn Thị Hồng | NTH01 | 23 | |||||||||||||||||
Nguyễn Văn Kha | NVK00 | 24 | |||||||||||||||||
Nguyễn Văn Toàn | NVT00 | 25 | |||||||||||||||||
Tùng Dương | TJD00 | 26 | |||||||||||||||||
Nguyễn Thị Cận | TTC00 | 27 | |||||||||||||||||
Trịnh Thị Lan | TTL00 | 28 | |||||||||||||||||
Trịnh Văn Bảy | TVB00 | 29 |
Anh ơi, cách này em đã nghĩ đến mà dùng không được. Lý do: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ền Mã miền Vật nuôi Mã DT Tên thức ăn Mã TA Đại lý Mã NS Mã ĐL Miền Bắc 1 Cho cá 1 Cám đậm đặc 1 Cấn Văn Long CVL00 10 Miền Trung 2 Cho gà 2 Cám hỗn hợp 2 Dương Hùng Mạnh DHM00 11 Miền Nam 3 Cho lợn 3 Cám nhân tạo 3 Duy Hưng DJH00 12 Nước ngoài 4 Cho bò 4 Cám trộn NH3 4 Đào Duy Hùng FDH00 13 Đào Tấn Trung FTT00 14 Hoàng Văn Tùng HVT00 15 Lê Cảnh Linh LCL00 16 Lý Chính Thắng LCT00 17 Lê Khánh LJK00 18 Lê Mạnh Hùng LMH00 19 Lê Minh Trang LMT00 20 Nguyễn Kiệm NJK00 21 Nguyễn Thị Thanh Hương NTH00 22 Nguyễn Thị Hồng NTH01 23 Nguyễn Văn Kha NVK00 24 Nguyễn Văn Toàn NVT00 25 Tùng Dương TJD00 26 Nguyễn Thị Cận TTC00 27 Trịnh Thị Lan TTL00 28 Trịnh Văn Bảy TVB00 29
Bạn tham khảo thử & kiểm tra dùm dữ liệu trong fileAnh ơi, cách này em đã nghĩ đến mà dùng không được. Lý do: . . . . .
Cám ơn bác đã giúp đỡ, em sẽ tham khảo cách bố trí dữ liệu này.Bạn tham khảo thử & kiểm tra dùm dữ liệu trong file
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ạ.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
=IFERROR(CHOOSE(MATCH(TRUE,LEFT($B4,4)={"Miền","Thức","Cám ","Đại "},0),Mien,Thucan,Cam,Daily),kh)
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!Ô A4:
Lưu ý:Mã:=IFERROR(CHOOSE(MATCH(TRUE,LEFT($B4,4)={"Miền","Thức","Cám ","Đại "},0),Mien,Thucan,Cam,Daily),kh)
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é.
Cho em hỏi thêm là ký tự @ trong công thức có nghĩa là gì vậy? Em dùng google mà không được.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é.
@ ở đâu sao file của mình không thấy nhỉ?Cho em hỏi thêm là ký tự @ trong công thức có nghĩa là gì vậy? Em dùng google mà không được.