hongphuong1997
Thành viên tiêu biểu

- Tham gia
- 12/11/17
- Bài viết
- 773
- Được thích
- 323
- Giới tính
- Nữ
Tiếng việt rất phức tạp.Nhờ các anh chị và các thầy giúp bài như file đính kèm ạ
Trích yếu một số nội dung trong file Excel bạn đính kèm :Hi hi..... hum nay bị cách ly rùi
Anh rảnh viết giúp em với anh snow25
Xóa từ có chữ "ô" hoặc chữ "u" anh oiTrích yếu một số nội dung trong file Excel bạn đính kèm :
yêu cầu : chuỗi "Việt Nam không có ổ dịch virut" nhờ các bạn trên diễn đàn xóa chữ "ô" và chữ "u" và móng muốn kết quả "Việt Nam có dịch" sau khi xem xét tôi có mấy ý kiến sau:
1. Kết quả với yêu cầu không phù hợp,
2. Nội dung liên quan đến vấn đề thời cuộc và chính trị, phải có động cơ mục địch tích cực mới giúp được !
Anh đọc kỹ lại trong bài em nói rõ rùi màTrích yếu một số nội dung trong file Excel bạn đính kèm :
yêu cầu : chuỗi "Việt Nam không có ổ dịch virut" nhờ các bạn trên diễn đàn xóa chữ "ô" và chữ "u" và móng muốn kết quả "Việt Nam có dịch" sau khi xem xét tôi có mấy ý kiến sau:
1. Kết quả với yêu cầu không phù hợp,
2. Nội dung nhạy cảm liên quan đến vấn đề thời cuộc và chính trị, phải có động cơ mục địch tích cực mới giúp được !
(Nhờ các bạn trên diễn đàn xóa giúp từ nào có chữ "Ô" hoặc "u") |
Thử công thức với Code của Thầy @ndu96081631Nhờ các anh chị và các thầy giúp bài như file đính kèm ạ
=JoinText(" ",IFERROR(TRIM(MID(SUBSTITUTE(" "&C6," ",REPT(" ",999)),AGGREGATE(15,6,ROW($1:$50)/(1-MMULT(N(ISNUMBER(SEARCH({"ô","ố","ồ","ổ","ỗ","ộ","u","ú","ù","ủ","ũ","ụ"},TRIM(MID(SUBSTITUTE(" "&C6," ",REPT(" ",999)),ROW($1:$50)*999,999))))),ROW($1:$12)^0)),ROW($1:$50))*999,999)),""))
ui, ui!Thử công thức với Code của Thầy @ndu96081631
Công thức hơi dài
Mã:=JoinText(" ",IFERROR(TRIM(MID(SUBSTITUTE(" "&C6," ",REPT(" ",999)),AGGREGATE(15,6,ROW($1:$50)/(1-MMULT(N(ISNUMBER(SEARCH({"ô","ố","ồ","ổ","ỗ","ộ","u","ú","ù","ủ","ũ","ụ"},TRIM(MID(SUBSTITUTE(" "&C6," ",REPT(" ",999)),ROW($1:$50)*999,999))))),ROW($1:$12)^0)),ROW($1:$50))*999,999)),""))
Dùng code củ chuối này thử.ui, ui!
Em cảm ơn anh ạ!
Công thức quá vĩ đại
Anh oi, có cách nào để công thức ngắn gọn không hở anh?
Public Function GPE_Filter(sValue As String) As String
Dim Arr, i%, s$
Arr = Split(sValue, " ")
s = ""
For i = 0 To UBound(Arr)
If (Check_Value(CStr(Arr(i)))) Then
If s = "" Then
s = Arr(i)
Else
s = s & " " & Arr(i)
End If
End If
Next i
GPE_Filter = s
End Function
Public Function Check_Value(s As String) As Boolean
Dim Arr, i%
Arr = Array("ô", ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), "u", "ú", "ù", ChrW(7911), ChrW(361), ChrW(7909))
For i = LBound(Arr) To UBound(Arr)
If (InStr(1, s, Arr(i)) > 0) Or (InStr(1, s, UCase(Arr(i))) > 0) Then
Check_Value = False
Exit Function
End If
Next
Check_Value = True
End Function
=GPE_Filter(C6)
Biểu diễn một cái cho anh em học hỏi với.Dùng Regex, chỉ cần tìm từ có chứa ký tự, replace nó, trim là xong.
Tôi có code, nhưng đợi thớt sửa ví dụ của mình cho hợp lệ đã.Biểu diễn một cái cho anh em học hỏi với.
Em cảm ơn anh nhiều ạDùng code củ chuối này thử.
Hàm dùng như sau:Mã:Public Function GPE_Filter(sValue As String) As String Dim Arr, i%, s$ Arr = Split(sValue, " ") s = "" For i = 0 To UBound(Arr) If (Check_Value(CStr(Arr(i)))) Then If s = "" Then s = Arr(i) Else s = s & " " & Arr(i) End If End If Next i GPE_Filter = s End Function Public Function Check_Value(s As String) As Boolean Dim Arr, i% Arr = Array("ô", ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), "u", "ú", "ù", ChrW(7911), ChrW(361), ChrW(7909)) For i = LBound(Arr) To UBound(Arr) If (InStr(1, s, Arr(i)) > 0) Or (InStr(1, s, UCase(Arr(i))) > 0) Then Check_Value = False Exit Function End If Next Check_Value = True End Function
Mã:=GPE_Filter(C6)
Cháu cảm ơn bác đêm khuya mà bác vẫn quan tâm đến chúng cháu ạTôi có code, nhưng đợi thớt sửa ví dụ của mình cho hợp lệ đã.
Nếu có hàm Textjoin có thể dùng công thức này:Nhờ các anh chị và các thầy giúp bài như file đính kèm ạ
=TEXTJOIN("",TRUE,IF(ISERROR(MATCH(FIND(" ",C6&" ",ROW(1:1000)),IF(MATCH(MID(C6,ROW(1:1000),1),{"ô","ố","ồ","ổ","ỗ","ộ","u","ú","ù","ủ","ũ","ụ"},),FIND(" ",C6&" ",ROW(1:1000))),)),MID(C6,ROW(1:1000),1),""))
Pattern này có vẻ chưa đúng, do macth có khoảng trắng đầu và cuối chuỗi nên replace sẽ bị mất khoảng trắng của từ tiếp theo, nên 2 từ gần nhau sẽ replace được 1 từ, bạn thử với chuỗi "u u u u u"Function XoaTu(ByVal chuoi As String, ByVal kytu As String)
' code xoa nhung tu trong chuoi co chua ky tu kytu
Static rx As Object
Dim i As Integer
If rx Is Nothing Then
Set rx = CreateObject("vbscript.regexp")
rx.ignorecase = True
rx.Global = True
End If
rx.Pattern = Replace(" [^p ]*[p].*? ", "p", kytu)
XoaTu = Application.Trim(rx.Replace(" " & Replace(chuoi, " ", " ") & " ", " "))
' chú ý: phải chỉnh dấu cách ở chuỗi thành 2 dấu cách vì regex sẽ match từ trước và nuốt mất dấu cách từ kế tiếp
End Function
View attachment 234381
Pattern này có vẻ chưa đúng, do macth có khoảng trắng đầu và cuối chuỗi nên replace sẽ bị mất khoảng trắng của từ tiếp theo, nên 2 từ gần nhau sẽ replace được 1 từ, bạn thử với chuỗi "u u u u u"
Cái phần "chú ý" tôi mới thêm để giải thích. Nhưng cái phần replace môt space thành hai spaces đã có từ trước rồi....
XoaTu = Application.Trim(rx.Replace(" " & Replace(chuoi, " ", " ") & " ", " "))
' chú ý: phải chỉnh dấu cách ở chuỗi thành 2 dấu cách vì regex sẽ match từ trước và nuốt mất dấu cách từ kế tiếp
End Function
...
Có thể nó bị lỗi khác , bạn thử =XoaTu("u u u u","ôốồổỗộuúùủũụ") đúng ra nó phải trả về empty, nhưng kết quả là "u u"Cái phần "chú ý" tôi mới thêm để giải thích. Nhưng cái phần replace môt space thành hai spaces đã có từ trước rồi.
Trong kết quả thử ở bài trên. Nếu space bị nuốt thì "cuối phố" phải còn lại "phố"
cụm từ "chẳng hiểu vì sao không đóng bao giờ" phải còn lại "chẳng vì không bao giờ"
Bài thử của tôi cho ra không có "phố", và "chẳng vì giờ"
Có lẽ khác version , tôi vẫn chạy ra "u u" cả 2019 và 365Để xem lại.
Đã thử:
View attachment 234383
Hay là code tôi đang chạy nó khác version? Dò không thấy, để post lại đúng code đang chạy:
Function XoaTu(ByVal chuoi As String, ByVal kytu As String)
' code xoa nhung tu trong chuoi co chua ky tu kytu
Static rx As Object
Dim i As Integer
If rx Is Nothing Then
Set rx = CreateObject("vbscript.regexp")
rx.ignorecase = True
rx.Global = True
End If
rx.Pattern = Replace(" [^p ]*[p].*? ", "p", kytu)
XoaTu = Application.Trim(rx.Replace(" " & Replace(chuoi, " ", " ") & " ", " "))
End Function
bạn có thể dùng code này để cắt dấu tiềng việt. Sau đó dùng SUBSTITUTE để loại bỏ chữ U đi là xongCó thể nó bị lỗi khác , bạn thử =XoaTu("u u u u","ôốồổỗộuúùủũụ") đúng ra nó phải trả về empty, nhưng kết quả là "u u"
Function TV(ByVal Text As String) As String
On Error Resume Next
Dim CharCode, ResText As String, i As Long, tmp As String
tmp = Text
CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
For i = 0 To UBound(CharCode)
tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1))
tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1)))
Next
TV = tmp
End Function
Đâu cần xóa dấu làm gì bạn, nếu code dùng Regexp vẫn có thể nhận dạng được, mà cái trên chỉ là ví dụ thôi chứ mục đích của bài replace cả cụm từ chứa kí tự đó bạn ạ.bạn có thể dùng code này để cắt dấu tiềng việt. Sau đó dùng SUBSTITUTE để loại bỏ chữ U đi là xong
Mã:Function TV(ByVal Text As String) As String On Error Resume Next Dim CharCode, ResText As String, i As Long, tmp As String tmp = Text CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _ ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _ ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _ ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _ ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _ ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _ ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _ ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _ ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925)) ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy" For i = 0 To UBound(CharCode) tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1)) tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1))) Next TV = tmp End Function
Chú ý cái phần ".*?", với dấu hỏi để buộc nó không tham lam (non greedy).Có lẽ khác version , tôi vẫn chạy ra "u u" cả 2019 và 365
Có lẽ do khác version, chỗ greedy tôi bỏ "?" nó vẫn lấy dài nhất, tôi không hiểu chỗ "[^p ]*" nếu mặc định là lấy dài nhất tức là có khoảng trắng.Chú ý cái phần ".*?", với dấu hỏi để buộc nó không tham lam (non greedy).
Có thể do cái cỗ máy VBScript.Regexp của bạn nó thuộc version khác, và code "không tham lam" khác.
Tôi không thử trên Mac được vì Mac không có VBScript. Mấy cái máy chạy Unix chắc cũng chịu thua thôi.
Đây anh ơi. Khoẳng trắng lấy vào từ trước rồi."[^p ]*" phần này được dùng để buộc * không chứa luôn ký tự cần tìm
Nếu không có phần này, tôi bị nó xoá không hết. Nhưng chắc \S* cũng chả sao.
Tuy nhiên phần chống tham lam (?) thì không thể thiếu, vì nó dùng để chóng xoá nhiều hơn mong muốn. Muốn thử phần này, bạn phải thử câu có nhiều từ khác nhau.
mục đích của cstr làm gì vậy, hỏi ngơ tí nhéDùng code củ chuối này thử.
Hàm dùng như sau:Mã:Public Function GPE_Filter(sValue As String) As String Dim Arr, i%, s$ Arr = Split(sValue, " ") s = "" For i = 0 To UBound(Arr) If (Check_Value(CStr(Arr(i)))) Then If s = "" Then s = Arr(i) Else s = s & " " & Arr(i) End If End If Next i GPE_Filter = s End Function Public Function Check_Value(s As String) As Boolean Dim Arr, i% Arr = Array("ô", ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), "u", "ú", "ù", ChrW(7911), ChrW(361), ChrW(7909)) For i = LBound(Arr) To UBound(Arr) If (InStr(1, s, Arr(i)) > 0) Or (InStr(1, s, UCase(Arr(i))) > 0) Then Check_Value = False Exit Function End If Next Check_Value = True End Function
Mã:=GPE_Filter(C6)
em biết em sai rồi! huhuMình đoán chắc đó là một hàm gì đó trong VBA
Tôi nhớ ra rồi. Lỗi do tôi có thành kiến với các ký hiệu "word boundary" khi áp dụng cho unicode tiếng Việt. Có một số regex engines hoạtn động chập choạng chỗ này.Có lẽ do khác version, chỗ greedy tôi bỏ "?" nó vẫn lấy dài nhất, tôi không hiểu chỗ "[^p ]*" nếu mặc định là lấy dài nhất tức là có khoảng trắng.
nếu tôi viết theo regexp thì :
rx.Pattern = Replace("\S*[p]\S*", "p", kytu)
XoaTu = Application.Trim(rx.Replace(chuoi, " "))
...