Help về cắt nhiều chuỗi trong ngoặc và kiểm từng chuỗi theo yêu cầu (7 người xem)

  • Thread starter Thread starter StarVn
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

StarVn

Thành viên mới
Tham gia
9/8/10
Bài viết
5
Được thích
3
Mọi người xem giúp mình file excel mẫu mình gửi kèm.
- Yêu cầu là: cắt tất cả các chuỗi trong dấu ngoặc đơn ra, sau đó kiểm tra nếu chuỗi nào "dài hay ngắn" hơn 4 ký tự thì bỏ, chỉ lấy chuỗi = 4 ký tự.

Mình chỉ làm dc là cắt chuỗi trong ngoặc đầu tiên ra và kiểm tra nếu = 4 thì lấy, khác 4 thì cắt tiếp chuỗi trong ngoặc thứ 2. Nhưng nếu trong chuỗi có nhiều hơn 2 ngoặc thì chịu, và nếu chuỗi ngoặc đầu tiên = 4 thì lấy luôn và dừng lại không làm tiếp.

Nói dài dòng nhưng mọi người xem file sẽ dễ hình dung, kết quả theo yêu cầu mình gõ sẵn cho mọi người dễ so sánh. Có người nhờ mình hỏi giúp nên không rõ là dùng công thức hay hàm vba, ai có giải pháp nào hay xin chỉ dùm.
 

File đính kèm

Mọi người xem giúp mình file excel mẫu mình gửi kèm.
- Yêu cầu là: cắt tất cả các chuỗi trong dấu ngoặc đơn ra, sau đó kiểm tra nếu chuỗi nào "dài hay ngắn" hơn 4 ký tự thì bỏ, chỉ lấy chuỗi = 4 ký tự.

Mình chỉ làm dc là cắt chuỗi trong ngoặc đầu tiên ra và kiểm tra nếu = 4 thì lấy, khác 4 thì cắt tiếp chuỗi trong ngoặc thứ 2. Nhưng nếu trong chuỗi có nhiều hơn 2 ngoặc thì chịu, và nếu chuỗi ngoặc đầu tiên = 4 thì lấy luôn và dừng lại không làm tiếp.

Nói dài dòng nhưng mọi người xem file sẽ dễ hình dung, kết quả theo yêu cầu mình gõ sẵn cho mọi người dễ so sánh. Có người nhờ mình hỏi giúp nên không rõ là dùng công thức hay hàm vba, ai có giải pháp nào hay xin chỉ dùm.
Bạn thử dùng hàm CatChim này thử
 

File đính kèm

Mọi người xem giúp mình file excel mẫu mình gửi kèm.
- Yêu cầu là: cắt tất cả các chuỗi trong dấu ngoặc đơn ra, sau đó kiểm tra nếu chuỗi nào "dài hay ngắn" hơn 4 ký tự thì bỏ, chỉ lấy chuỗi = 4 ký tự.
Mình chỉ làm dc là cắt chuỗi trong ngoặc đầu tiên ra và kiểm tra nếu = 4 thì lấy, khác 4 thì cắt tiếp chuỗi trong ngoặc thứ 2. Nhưng nếu trong chuỗi có nhiều hơn 2 ngoặc thì chịu, và nếu chuỗi ngoặc đầu tiên = 4 thì lấy luôn và dừng lại không làm tiếp.
Nói dài dòng nhưng mọi người xem file sẽ dễ hình dung, kết quả theo yêu cầu mình gõ sẵn cho mọi người dễ so sánh. Có người nhờ mình hỏi giúp nên không rõ là dùng công thức hay hàm vba, ai có giải pháp nào hay xin chỉ dùm.
Góp vui với hàm tự tạo JoinText() của thầy @ndu96081631 + công thức Mảng:
Mã:
D2=JoinText(" - ",MID($A2,AGGREGATE(15,6,ROW(INDIRECT("1:"&LEN($A2)))/(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)="(")/(MMULT(FIND({"(",")"},$A2&"()",ROW(INDIRECT("1:"&LEN($A2))))*{-1,1},{1;1})-1=4),ROW($1:$10))+1,4))
Kết thúc bằng Ctrl+Shift+Enter, rồi fill xuống.
Xem file kèm.

Thân
 

File đính kèm

Chưa đúng! Thử với chuỗi này:
BASE LOGO(PRINT BACK SIDE)LÔNG(9987) /CRYSTAL WHITE S16(A8L5)CHIM(080A) (V)
Chuỗi này chắc phải dùng hàm này ;)
Mã:
Function MyConcat(ByVal txt As String) As String
    Dim Args, Ndx As Long, Str As String
txt = Replace(txt, "(", ")")
Args = Split(txt, ")")
For Ndx = LBound(Args) + 1 To UBound(Args) Step 2
    If Len(Trim(Args(Ndx))) = 4 Then
        Str = IIf(Str = "", Trim(Args(Ndx)), Str & " " & Trim(Args(Ndx)))
    End If
Next Ndx
If Len(Str) Then MyConcat = Str
End Function
 
Góp vui với hàm tự tạo JoinText() của thầy @ndu96081631 + công thức Mảng:
Mã:
D2=JoinText(" - ",MID($A2,AGGREGATE(15,6,ROW(INDIRECT("1:"&LEN($A2)))/(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)="(")/(MMULT(FIND({"(",")"},$A2&"()",ROW(INDIRECT("1:"&LEN($A2))))*{-1,1},{1;1})-1=4),ROW($1:$10))+1,4))
Kết thúc bằng Ctrl+Shift+Enter, rồi fill xuống.
Xem file kèm.

Thân
Tôi có nghĩ đến việc dùng JoinText nhưng bài toán này mà dùng nó thì hơi... "đao to búa lớn" quá
Nếu viết code thì giải thuật của tôi là
1> Vòng lập đi vào chuỗi (có thể là Do...Loop chứ không For...Next)
2> Xác định vị trí của ký tự "(" ---> Cho vào 1 biến p1
3> Từ vị trí p1 tính sang phải, nếu ký tự thứ 5 là ")" thì "nhổ" 4 cọng lông bên trong ---> Cho vào biến chuỗi hoặc mảng tùy ý
4> Đi tiếp và thực hiện thủ tục giống bước 2 và 3, đến lúc hết tìm thấy "(" nào thì ngưng ---> Xuất kết quả
---------------------------------------
Chuỗi này chắc phải dùng hàm này ;)
Mã:
Function MyConcat(ByVal txt As String) As String
    Dim Args, Ndx As Long, Str As String
txt = Replace(txt, "(", ")")
Args = Split(txt, ")")
For Ndx = LBound(Args) + 1 To UBound(Args) Step 2
    If Len(Trim(Args(Ndx))) = 4 Then
        Str = IIf(Str = "", Trim(Args(Ndx)), Str & " " & Trim(Args(Ndx)))
    End If
Next Ndx
If Len(Str) Then MyConcat = Str
End Function
MyConcat của bạn còn "lộ" hơn CatChim Hoa Bất Tử.
Thử với chuỗi này:
Mã:
BASE LOGO(PRINT BACK SIDE))LÔNG(9987) /CRYSTAL WHITE S16(A8L5)CHIM(080A) (V)
Sẽ thấy... "lộ hàng"
 
Dấu ngoặc có lồng nhau hay không? (abcd (efgh))
Nếu có lồng nhau thì ca này hơi khó. Phải biết cách parse chuỗi với tokens.
Nếu không có lồng nhau thì dùng regex là đúng ca.
 
Function BatCoc(ByVal s As String) As String
Static rx As Object
Dim allMatches As Object
If rx Is Nothing Then
Set rx = CreateObject("vbscript.regexp")
rx.Global = True
End If
rx.Pattern = "\(([^\(\)]{4})\)"
Set allMatches = rx.Execute(s)
If allMatches.Count > 0 Then BatCoc = allMatches.Item(0).submatches.Item(0)
End Function
 
Dấu ngoặc có lồng nhau hay không? (abcd (efgh))
Nếu có lồng nhau thì ca này hơi khó. Phải biết cách parse chuỗi với tokens.
Nếu không có lồng nhau thì dùng regex là đúng ca.
Không có ngoặc lồng nhau bạn ơi, hiện tại thì các tên mã hàng cần lấy đều là 4 ký tự chưa có dài hơn và chưa thấy có cái nào lồng vào nhau.
 
Lần chỉnh sửa cuối:
Không có ngoặc lồng nhau bạn ơi, hiện tại thì các tên mã hàng cần lấy đều là 4 ký tự chưa có dài hơn và chưa thấy có cái nào lồng vào nhau.
Tôi chỉ mách cho đại khái thôi. Code ở trên là tôi diễn tả giải thuật cho các bạn khác chứ không phải là giải đáp cho bạn.
Chứ thật tình tôi ngại những ngừoi hỏi giùm lắm. Ngạn ngữ mình có câu tam sao thất bổn. Bạn bảo ngừoi cần giúp kia hỏi trực tiếp.
...
Nói dài dòng nhưng mọi người xem file sẽ dễ hình dung, kết quả theo yêu cầu mình gõ sẵn cho mọi người dễ so sánh. Có người nhờ mình hỏi giúp nên không rõ là dùng công thức hay hàm vba, ai có giải pháp nào hay xin chỉ dùm.
 
Không có ngoặc lồng nhau bạn ơi, hiện tại thì các tên mã hàng cần lấy đều là 4 ký tự chưa có dài hơn và chưa thấy có cái nào lồng vào nhau.
Nếu không lồng nhau thì bạn có thể dùng hàm này :D.
Mã:
Function CatKhongLong(ByVal Str As String) As String
Dim Arr As Variant, i As Long
Arr = Split(Str, "(")
For i = 1 To UBound(Arr)
    If InStr(Arr(i), ")") = 5 Then CatKhongLong = CatKhongLong & " " & Left(Arr(i), 4)
Next
CatKhongLong = Mid(CatKhongLong, 2)
End Function
 
Nếu không lồng nhau thì bạn có thể dùng hàm này :D.
Mã:
Function CatKhongLong(ByVal Str As String) As String
Dim Arr As Variant, i As Long
Arr = Split(Str, "(")
For i = 1 To UBound(Arr)
    If InStr(Arr(i), ")") = 5 Then CatKhongLong = CatKhongLong & " " & Left(Arr(i), 4)
Next
CatKhongLong = Mid(CatKhongLong, 2)
End Function
Theo code này thì có ngoặc lồng nhau tôi thấy cũng đâu vấn đề gì
 
Cám ơn mọi người nhiều nhé :<> (ko tag tên vào dc như fb), toàn cao thủ và nhiều giải pháp đều cho kq tốt với mấy file mình có. Nếu sau này có thêm mã hàng nào mới hay phát sinh thêm gì mình lại nhờ mọi người. :drinks:
 
Nếu không lồng nhau thì bạn có thể dùng hàm này :D.
Mã:
Function CatKhongLong(ByVal Str As String) As String
Dim Arr As Variant, i As Long
Arr = Split(Str, "(")
For i = 1 To UBound(Arr)
    If InStr(Arr(i), ")") = 5 Then CatKhongLong = CatKhongLong & " " & Left(Arr(i), 4)
Next
CatKhongLong = Mid(CatKhongLong, 2)
End Function
Code này dùng "magic numbers", và trong đó 5 là phụ thuộc vào 4 (nó suy ra từ 4+1). Viết code có kinh nghiệm ngừoi ta dùng Const.

Const LONGDAI = 4
Const NGOACMO = "("
Const NGOACDONG = ")"
Dim e as Variant
For each e in Split(Str, NGOACMO)
If InStr(e, NGOACDONG) = LONGDAI+1 Then CatKhongLong = CatKhongLong & " " & Left(e, LONGDAI)
Next e

Cám ơn mọi người nhiều nhé :<> (ko tag tên vào dc như fb), toàn cao thủ và nhiều giải pháp đều cho kq tốt với mấy file mình có. Nếu sau này có thêm mã hàng nào mới hay phát sinh thêm gì mình lại nhờ mọi người. :drinks:
Ủa. Hỏi giùm ngừoi khác mờ.
Có gì thêm thì bảo người ấy hỏi cho nhanh.
 
Ủa. Hỏi giùm ngừoi khác mờ.
Có gì thêm thì bảo người ấy hỏi cho nhanh.
Có lý do bạn ơi, cty cấm internet chỉ cho truy cập các trang nào liên quan đến phòng đó làm việc thôi, các bạn ấy ko lên mạng dc, cấm usb, đt,... dữ liệu ko thể mang ra ngoài file làm lưu trên NAS, hay ERP, vì vậy vào cty mới làm. Mình ko làm, nhưng có thể giúp nên các bạn ấy hỏi ngoài gõ tay có nào nhanh ko, dùng cách find, mid, len, if... cthức dài quá và không ổn, nên mới lên hỏi mọi người.
 
Điện thoại và tablet chỉ dùng để chát phây bút à?
Con người muốn làm thì có hàng tá cách.
 
Web KT

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

Back
Top Bottom