- Tham gia
- 23/3/16
- Bài viết
- 705
- Được thích
- 52
Hi vọng với bạn là đừng bao giờ thốt lên câu này lần nữa nhá:
Không có lần sau đâu
Mã:Public Sub GPE() Dim Dic As Object, Tem As String, I As Long, J As Long, K As Long Dim sArr, dArr(1 To 10000, 1 To 2), Qty As Double, Tam, N As String Set Dic = CreateObject("Scripting.Dictionary") sArr = Range("B4", Range("B4").End(4)).Value For I = 1 To UBound(sArr) If sArr(I, 1) <> Empty Then Tam = Split(Trim(sArr(I, 1)), ",") For J = 0 To UBound(Tam) If Len(Tam(J)) > 1 Then Tem = Trim(Left(Tam(J), InStr(1, Tam(J), "[") - 1)) N = Trim(Mid(Tam(J), InStr(1, Tam(J), "[") + 1, Len(Tam(J)))) Qty = Val(Left(N, Len(N) - 1)) If Not Dic.exists(Tem) Then K = K + 1 Dic.Add Tem, K dArr(K, 1) = Tem dArr(K, 2) = Qty Else dArr(Dic.Item(Tem), 2) = dArr(Dic.Item(Tem), 2) + Qty End If End If Next J End If Next I If K Then Range("D4").Resize(K, 2).Value = dArr End Sub
Hi vọng với bạn là đừng bao giờ thốt lên câu này lần nữa nhá:
Không có lần sau đâu
Mã:Public Sub GPE() Dim Dic As Object, Tem As String, I As Long, J As Long, K As Long Dim sArr, dArr(1 To 10000, 1 To 2), Qty As Double, Tam, N As String Set Dic = CreateObject("Scripting.Dictionary") sArr = Range("B4", Range("B4").End(4)).Value For I = 1 To UBound(sArr) If sArr(I, 1) <> Empty Then Tam = Split(Trim(sArr(I, 1)), ",") For J = 0 To UBound(Tam) If Len(Tam(J)) > 1 Then Tem = Trim(Left(Tam(J), InStr(1, Tam(J), "[") - 1)) N = Trim(Mid(Tam(J), InStr(1, Tam(J), "[") + 1, Len(Tam(J)))) Qty = Val(Left(N, Len(N) - 1)) If Not Dic.exists(Tem) Then K = K + 1 Dic.Add Tem, K dArr(K, 1) = Tem dArr(K, 2) = Qty Else dArr(Dic.Item(Tem), 2) = dArr(Dic.Item(Tem), 2) + Qty End If End If Next J End If Next I If K Then Range("D4").Resize(K, 2).Value = dArr End Sub
Bài này viết code không khó, chạy nhanh (khoảng 2000 dòng dữ liệu) cũng không khó, chỉ khi nhập dữ liệu thì phải nhập đúng kiểu, đúng định dạng, thống nhất một kiểu nhậpCode của mình Ok hết nếu là Số nguyện ví dụ: Cà phê đá [4] , còn số lẻ thì không đúng ví dụ: Cà phê đá[2.5] . Mình đang cần rất gấp rất mong mọi người giúp đở
Lúc thì "chấm", lúc thì "phẩy", nếu không lường trước khi viết code dễ bị "tèo" lắmCà phê Cacao [1.5], Cà phê đen [4,5], Cà phê sữa [5,5], Cà phê sữa Cacao [2,5], 7 - up [2,5], Coca [2,5], Numberone [2,5],
Muốn gắn chết đầu vào thì sửa câu
ThànhMã:sArr = Range("B4", Range("B4").End(4)).Value
Mã:sArr = Range("B4:B30").Value
Đúng rồi...Không có dữ liệu thì code bị lỗi...vì không có gì hết... tất nhiên là phải có dữ liệu đầu vào...Nếu không có thì viết code và chạy code làm gì...=> Bị Hâm ah???
Bài này viết code không khó, chạy nhanh (khoảng 2000 dòng dữ liệu) cũng không khó, chỉ khi nhập dữ liệu thì phải nhập đúng kiểu, đúng định dạng, thống nhất một kiểu nhập
Trong topic kia của bạn ở bảng có số lẻ bạn nhập:
Lúc thì "chấm", lúc thì "phẩy", nếu không lường trước khi viết code dễ bị "tèo" lắm
Thân
Bắt buộc bạn phải chuẩn hóa dữ liệu. Đã ngăn cách món bằng dấu phẩy thì tên món phải loại bỏ dấu phẩy...Thế thôi,không thể kiều muón gõ gì thì gõ được...
Đưa lại file có dữ liệu chuẩn của bạn lên xem sao, làm một lần khỏi sửaAnh ơi em mới Test có thêm 1 lỗi rất nghiêm trọng. Là khi tên hàng em có dấu phẩy là nó báo lỗi ở dòng
Tem = Trim(Left(Tam(J), InStr(1, Tam(J), "[") - 1))
Ví du: Cà phê đá [5] là ok
Ví du: Cà phê, đá [5] là báo lỗi
Anh xem chỉnh lại giúp em
Đưa lại file có dữ liệu chuẩn của bạn lên xem sao, làm một lần khỏi sửa
Số 10000 nghĩa là: đọc bằng chữ: mười ngàn ....kế hợp vào mảng thì gọi là tạo 1 mảng có 10 ngàn dòng và có 2 cột...Thế thôi...
Nói chung bạn chưa có căn bản gì về code thì nên tìm đọc trước chứ đừng hỏi vậy...xa xôi lắm...
----------------
Quay về vấn đề trên: nếu tên sản phẩm của bạn có dấu phẩy...thì bắt buộc bạn nhập dấu phẩy ngăn cách món phải sau dấu ] thì làm được...có nghĩa là phải theo kiểu như vậy...
Cà phê Cacao [1], Cà phê đen, đá [4.5],, Cà phê sữa [5], Cà phê sữa Cacao [2], 7 - up [2], Coca [2], Numberone [2]
Vậy ta dựa vào 2 ký tự liên tiếp mà xử ], Nếu Ok thì phản hồi...tôi sửa lại code
Số 10000 nghĩa là: đọc bằng chữ: mười ngàn ....kế hợp vào mảng thì gọi là tạo 1 mảng có 10 ngàn dòng và có 2 cột...Thế thôi...
Nói chung bạn chưa có căn bản gì về code thì nên tìm đọc trước chứ đừng hỏi vậy...xa xôi lắm...
----------------
Quay về vấn đề trên: nếu tên sản phẩm của bạn có dấu phẩy...thì bắt buộc bạn nhập dấu phẩy ngăn cách món phải sau dấu ] thì làm được...có nghĩa là phải theo kiểu như vậy...
Cà phê Cacao [1], Cà phê đen, đá [4.5],, Cà phê sữa [5], Cà phê sữa Cacao [2], 7 - up [2], Coca [2], Numberone [2]
Vậy ta dựa vào 2 ký tự liên tiếp mà xử ], Nếu Ok thì phản hồi...tôi sửa lại code
Sluong&
Sluong#
",*(.+?)\[\s*(\d+)\s*\]"
",*(.+?)\[\s*(\d+\.*,*\d*)\s*\]"
Application.Trim(Item.submatches(0))
Application.Trim(Replace(Item.submatches(0), ",", ""))
Vậy bạn sửa code trong file thành vầy...
Mã:Sub Locsole() Dim Dic As Object, Tem As String, I As Long, J As Long, K As Long Dim sArr, dArr(1 To 10000, 1 To 2), Qty As Double, Tam, N As String Set Dic = CreateObject("Scripting.Dictionary") sArr = Range("B4:B30").Value Range("D4:E30").ClearContents For I = 1 To UBound(sArr) If sArr(I, 1) <> Empty Then Tam = Split(Trim(sArr(I, 1)), "],") For J = 0 To UBound(Tam) If Len(Tam(J)) > 1 Then Tem = Trim(Left(Tam(J), InStr(1, Tam(J), "[") - 1)) N = Trim(Mid(Tam(J), InStr(1, Tam(J), "[") + 1, Len(Tam(J)))) Qty = Val(N) If Not Dic.exists(Tem) Then K = K + 1 Dic.Add Tem, K dArr(K, 1) = Tem dArr(K, 2) = Qty Else dArr(Dic.Item(Tem), 2) = dArr(Dic.Item(Tem), 2) + Qty End If End If Next J End If Next I If K Then Range("D4").Resize(K, 2).Value = dArr End Sub