Em gửi lại file chi tiết hơn để các bác hiểu rõ hơn giúp em, thanksEm có 1 dãy số hóa đơn ở cột A và em phải làm tay thành kết quả ở ô B3
Các thầy giúp em dùng lệnh hay code vba như thế nào để được kết quả đó không ạ, em làm tay đau hết măt
Em gửi lại file chi tiết hơn để các bác hiểu rõ hơn giúp em, thanks
Em gửi thầy bản cực kỳ chi tiết hơn và đúng gốc nó luôn ạ. thày giúp em vớiBiết ngay là phải có gì đó khác biết so với file ở bài đầu rồi
Tôi đang mường tượng: Làm xong hàm rồi cũng không biết sẽ kéo fill thể nào nữa?
Đâu có đơn giản!
Em gửi thầy bản cực kỳ chi tiết hơn và đúng gốc nó luôn ạ. thày giúp em với
Bạn thử hàm sauEm gửi thầy bản cực kỳ chi tiết hơn và đúng gốc nó luôn ạ. thày giúp em với
Function gop(r As Range) As String
Dim i, j, k As Integer, m, u, cell As Range
u = WorksheetFunction.CountA(r)
For k = 1 To UBound(r.Value)
If r(k) <> "" Then If WorksheetFunction.Match(r(k), r, 0) = k Then _
i = i + 1: gop = gop & "/" & r(k)
Next
gop = Replace(gop, "/", "", 1, 1)
For i = Len(r(1)) To 1 Step -1
m = Left(r(1), i)
j = 0
For Each cell In r
If cell Like m & "*" Then j = j + 1
Next
If j = u Then gop = m & Replace(gop, m, ""): Exit For
Next
End Function
Vậy nên chăng thể hiện kết quả dạng này: 55555(9-1/10-2/11/12)Thực ra, cách ghép chuỗi của bạn chính nó đã sai từ đầu, điển hình:
Ở Van Don KGL10061311, chuỗi kết quả là 555559-1/10-2/11/12. Làm sao người đọc hiểu cái Invoice thứ 2 nó chính thức là 5555510-1 (5 số 5) hay là 555510-1 (4 số 5)
Bạn thử hàm sau
Bạn cần sort hoá đơn ở vùng dữ liệu nguồn theo thứ tự mong muốnMã:Function gop(r As Range) As String Dim i, j, k As Integer, m, u, cell As Range u = WorksheetFunction.CountA(r) For k = 1 To UBound(r.Value) If r(k) <> "" Then If WorksheetFunction.Match(r(k), r, 0) = k Then _ i = i + 1: gop = gop & "/" & r(k) Next gop = Replace(gop, "/", "", 1, 1) For i = Len(r(1)) To 1 Step -1 m = Left(r(1), i) j = 0 For Each cell In r If cell Like m & "*" Then j = j + 1 Next If j = u Then gop = m & Replace(gop, m, ""): Exit For Next End Function
Vậy nên chăng thể hiện kết quả dạng này: 55555(9-1/10-2/11/12)
Chờ ý kiến phản hồi của chủ topic
Bạn thử hàm sau
Bạn cần sort hoá đơn ở vùng dữ liệu nguồn theo thứ tự mong muốnMã:Function gop(r As Range) As String Dim i, j, k As Integer, m, u, cell As Range u = WorksheetFunction.CountA(r) For k = 1 To UBound(r.Value) If r(k) <> "" Then If WorksheetFunction.Match(r(k), r, 0) = k Then _ i = i + 1: gop = gop & "/" & r(k) Next gop = Replace(gop, "/", "", 1, 1) For i = Len(r(1)) To 1 Step -1 m = Left(r(1), i) j = 0 For Each cell In r If cell Like m & "*" Then j = j + 1 Next If j = u Then gop = m & Replace(gop, m, ""): Exit For Next End Function
em đang test thấy chuẩn luôn ạ, em xin đa tạ cảm ơn bác nhiều, có lỗi em lại phiền bác
Function Join(Rng As Range)
Dim Cll As Range, Tmp As String, C As Long
Join = "/"
For Each Cll In Rng
If InStr(Join, "/" & Cll.Value & "/") = 0 And Cll.Value <> "" Then
Join = Join & Cll.Value & "/"
If Tmp = "" Then Tmp = Cll.Value: C = Len(Tmp)
Do Until Cll.Value Like Left(Tmp, C) & "*"
C = C - 1
Loop
End If
Next
Join = Replace(Replace(Left(Join, Len(Join) - 1), "/" & Left(Tmp, C), "/"), "/", Left(Tmp, C), 1, 1)
End Function
hệ thống không cho () ạ
Bạn nói đúng, dưới đây là code đã hiệu chỉnhXem code của bạn nginh tôi thấy có một vài lỗi về thuật toán nên bạn hãy cẩn thận khi sử dụng:
1. Ở vòng lặp For k đã xét điều kiện r(k) <> "" tức là cho phép dữ liệu có ô rỗng và khi gộp lại sẽ bỏ qua các ô rỗng nhưng ở vòng lặp For i lại dùng ô r(1) làm chuẩn để xét những ô khác. Nếu ô đầu tiên của vùng tham chiếu (r(1)) là một ô rỗng thì các số hóa đơn sẽ không được rút gọn.
2. Code xóa phần trùng của các Invoice (gọi là phần đầu, phần còn lại gọi là phần đuôi) bằng hàm Replace nên nếu phần đuôi có chứa chuỗi trùng với phần đầu thì cũng bị xóa mất. Ví dụ các số 301929, 302302, 302630 gộp lại sẽ ra kết quả 301929/22/26
Function gr(r As Range) As String
Dim cell As Range, i As Integer, u As Integer
For Each cell In r
If Not gr Like "*" & cell & "*" Then gr = gr & "/" & cell: u = u + 1
Next
Do While gr <> "" And Len(gr) - Len(Replace(gr, Left(gr, i + 1), "/")) = i * u
i = i + 1
Loop
gr = Mid(gr, 2, i - 1) & Replace(Replace(gr, Left(gr, i), "/"), "/", "", 1, 1)
End Function
Bạn nói đúng, dưới đây là code đã hiệu chỉnh
PHP:Function gr(r As Range) As String Dim cell As Range, i As Integer, u As Integer For Each cell In r If Not gr Like "*" & cell & "*" Then gr = gr & "/" & cell: u = u + 1 Next Do While gr <> "" And Len(gr) - Len(Replace(gr, Left(gr, i + 1), "/")) = i * u i = i + 1 Loop gr = Mid(gr, 2, i - 1) & Replace(Replace(gr, Left(gr, i), "/"), "/", "", 1, 1) End Function
Xem code của bạn nginh tôi thấy có một vài lỗi về thuật toán nên bạn hãy cẩn thận khi sử dụng:
1. Ở vòng lặp For k đã xét điều kiện r(k) <> "" tức là cho phép dữ liệu có ô rỗng và khi gộp lại sẽ bỏ qua các ô rỗng nhưng ở vòng lặp For i lại dùng ô r(1) làm chuẩn để xét những ô khác. Nếu ô đầu tiên của vùng tham chiếu (r(1)) là một ô rỗng thì các số hóa đơn sẽ không được rút gọn.
2. Code xóa phần trùng của các Invoice (gọi là phần đầu, phần còn lại gọi là phần đuôi) bằng hàm Replace nên nếu phần đuôi có chứa chuỗi trùng với phần đầu thì cũng bị xóa mất. Ví dụ các số 301929, 302302, 302630 gộp lại sẽ ra kết quả 301929/22/26
Còn đây là code của tôi. Bạn có thể tham khảo.
PHP:Function Join(Rng As Range) Dim Cll As Range, Tmp As String, C As Long Join = "/" For Each Cll In Rng If InStr(Join, "/" & Cll.Value & "/") = 0 And Cll.Value <> "" Then Join = Join & Cll.Value & "/" If Tmp = "" Then Tmp = Cll.Value: C = Len(Tmp) Do Until Cll.Value Like Left(Tmp, C) & "*" C = C - 1 Loop End If Next Join = Replace(Replace(Left(Join, Len(Join) - 1), "/" & Left(Tmp, C), "/"), "/", Left(Tmp, C), 1, 1) End Function
Khi kiểm tra bằng cách so sánh chuỗi (Instr, Like) cần chú ý đến trường hợp chuỗi trong chuỗi.
Như code của bạn, nếu gộp 196737 và 673 thì lại bị mất 673 kết quả chỉ còn 196737.
Function gr(r As Range) As String
Dim cell As Range, i As Integer, u As Integer
For Each cell In r
If cell <> "" Then If Not gr & "/" Like "*/" & cell & "/*" Then If gr Like "*/" & cell & "*" _
Then gr = "/" & cell & gr: u = u + 1 Else gr = gr & "/" & cell: u = u + 1
Next
Do While gr <> "" And Len(gr) - Len(Replace(gr, Left(gr, i + 1), "/")) = i * u
i = i + 1
Loop
gr = Mid(gr, 2, i - 1) & Replace(Replace(gr, Left(gr, i), "/"), "/", "", 1, 1)
End Function