Bạn dùng code này:Làm ơn giup mình với. Làm sao từ một chuỗi dài có thể tách thành 2 chuỗi có màu đỏ
Function splstr(ByVal str As String, Optional n As Byte = 1)
Static reg As Object
If reg Is Nothing Then Set reg = CreateObject("vbscript.regexp")
reg.Global = True: reg.Pattern = "(P[A-Z]{3}\d{9})[^\d]*([\d,]+)"
If reg.test(str) Then
If n = 1 Then
splstr = reg.Execute(str)(0).submatches(0)
Else
splstr = CLng(reg.Execute(str)(0).submatches(1))
End If
End If
End Function
Ký tự đầu <>"P" thì sao bạnBạn dùng code này:
Công thức tách mã hợp đồng, khách hàng=splstr($A3,1)Mã:Function splstr(ByVal str As String, Optional n As Byte = 1) Static reg As Object If reg Is Nothing Then Set reg = CreateObject("vbscript.regexp") reg.Global = True: reg.Pattern = "(P[A-Z]{3}\d{9})[^\d]*([\d,]+)" If reg.test(str) Then If n = 1 Then splstr = reg.Execute(str)(0).submatches(0) Else splstr = CLng(reg.Execute(str)(0).submatches(1)) End If End If End Function
tách số tiền =splstr($A3,2)
Nếu kí tự đầu bất kì, sửa chỗ P[A-Z]{3} thành [A-Z]{4} là được.Ký tự đầu <>"P" thì sao bạn![]()
Nếu không dùng hàm thì thử chạy sub dưới xem saoLàm ơn giup mình với. Làm sao từ một chuỗi dài có thể tách thành 2 chuỗi có màu đỏ
Sub Tach()
Dim Nguon
Dim Kq
Dim i, j, t
Nguon = Sheet1.Range("a3", Sheet1.Range("a3").End(xlDown))
ReDim Kq(1 To UBound(Nguon), 1 To 2)
For i = 1 To UBound(Nguon)
t = Replace(Nguon(i, 1), """" & "," & """", "|")
t = Split(t, "|")
Kq(i, 2) = t(4)
For Each j In Split(t(2))
If Len(j) = 13 Then
Kq(i, 1) = j
Exit For
End If
Next j
Next i
Sheet1.Range("b3").Resize(UBound(Kq), UBound(Kq, 2)).ClearContents
Sheet1.Range("b3").Resize(UBound(Kq), UBound(Kq, 2)) = Kq
End Sub
A-Za-z chứNếu kí tự đầu bất kì, sửa chỗ P[A-Z]{3} thành [A-Z]{4} là được.
Tôi nhớ các item hay các submatches trong item đâu có trả về mảng , muốn lấy thì phải gán trực tiếp vô lấy thôi, giả sử có trả về mảng thì cột số tiền sẽ trả về String sẽ tốn thêm bước nữa để trả về số, trong code tôi tách ra sử dụng CLng để chuyển về số.A-Za-z chứ
về bài #2, thông thường thì cách viết code là nếu hàm tính ra một mảng thì cứ cho nó trả về mảng đó. Và viết thêm hàm khác để gọi hàm này, lấy ra đúng phần tử. Như vậy, lúc cần, tôi có thể dùng hàm chính để lấy ra luôn cả mảng (chọn 2 ô, gõ công thức, và ctrl+shift+enter)
Có vẻ như là: Theo thứ tự - Không lấy ký tự số từ 0 -> n lần , lấy các ký tự số và dấu phẩy từ 1 -> n lầnBạn có thể giải thích Pattern trên giúp. Mơ hồ về Regexp quá nên chưa hiểu hết được.
Mã:[^\d]*([\d,]+)
Để giải thích hết cái pattern, giải thích ngang khó nói (P[A-Z]{3}\d{9})[^\d]*([\d,]+)Bạn có thể giải thích Pattern trên giúp. Mơ hồ về Regexp quá nên chưa hiểu hết được.
Mã:[^\d]*([\d,]+)
Tôi chỉ nói về thủ thuật viết function. Bởi vì hầu hết người học code ở diễn đàn này theo gương của một bậc đàn anh đàn chị, chủ yếu chỉ thích viết một cục function/sub duy nhất và dùng tham số để điều khiển. Thói quen đó không hề sai, nhưng tới một trình độ nào đó sẽ thấy giới hạn của nó.Tôi nhớ các item hay các submatches trong item đâu có trả về mảng , muốn lấy thì phải gán trực tiếp vô lấy thôi, giả sử có trả về mảng thì cột số tiền sẽ trả về String sẽ tốn thêm bước nữa để trả về số, trong code tôi tách ra sử dụng CLng để chuyển về số.
Tôi copy code cũ chỉ sữa pattern nên không để ý, cấu trúc regexp thì cũng có nhiêu đó thôi.Không biết reg.Global = True để làm gì.
Mặc định là False. Khi tìm được 1 đoạn khớp thì reg dọn đồ. Khi True thì mặc dù đã tìm được thì reg vẫn cố tìm tiếp cho tới cuối chuỗi. Lãng phí không cần thiết. Chỉ nên đổi thành True khi muốn lấy tất cả (>1) các đoạn khớp.
À, ý tôi nói là các bài regexp phần lớn chỉ thay đổi pattern có thể copy lại và sửa pattern thôi, mấy tham số khác có thể thêm bớt cho phù hợp, tôi làm công thức hay code đều ít quan tâm đến tốc độ, trừ khi thực tế thấy nó chậm quá mới ngồi xem lại vì quan trọng đầu tiên là có kết quả trước đã. Cũng hiểu ít về sự nặng của regexp , nhưng thấy nó ra kết quả là mừng rồi đối với tôi regexp như kiểu đánh đố làm có cảm giác thú vị.Không hẳn vậy. Khi sử dụng Regex thì phải luôn nhớ rằng nó:
1. Nặng ký. Trừ phi có kỹ thuật cache dữ liệu để hiệu quả hoá. Kỹ thuật này hơi rắc rối.
2. Tham lam. Phải biết cách giới hạn độ tham lam của nó.
Theo tôi không cần. Tất nhiên để thay đổi mặc định "tham lam" thành "chừng mực" thì phải biết là phải thêm ?. Nhưng ý tôi là không phải cứ dùng *, +, ?, {n,}, {n,m} là phải thêm ? để thay đổi thành "chừng mực"Không hẳn vậy. Khi sử dụng Regex thì phải luôn nhớ rằng nó:
2. Tham lam. Phải biết cách giới hạn độ tham lam của nó.