nguyendinhvinh0410
Thành viên mới

- Tham gia
- 8/5/13
- Bài viết
- 25
- Được thích
- 0
Mình muốn lấy một cụm ký tự bất kỳ từ một chuỗi có sẵn, mong các pro giúp đỡ! (file đính kèm)
E rằng bài này không thể dùng công thức thường giải quyết được
(dùng VBA thì không có vấn đề gì)
vba cũng mệt nha, nó một đóng "hăm bà lăng" ko biết khúc nào ráp vô khúc nào.......hihihic...đã thử viế một hơi mệt quá........bỏ..hihihihiih
Mình thấy JoinText xơi được đấy nhé (nhưng mà không biết tác giả có chịu VBA hay không)
Ngoài ra thì tin rằng RegEx càng xơi tốt bài này
Em thấy bài này không có quy luật nào cả, bác ra tay 1 phen đi để đàn em được mở rộng tầm mắt.
Hơn nữa bác rất giỏi trong việc sử dụng hàm JoinText
Chỗ màu đỏ xem như là từ điển. Vậy ta làm như sau:mình muốn lấy các tự "ĐX";"NT4";"VT10";"NT101";"NT2122";"NT19";"NT20" chuỗi nào có các cụm ký tự đó thì sẽ lấy ra
={"ĐX","NT4","VT10","NT101","NT2122","NT19","NT20"}
Function JoinText(ByVal Delimiter As String, ParamArray Arrays()) As String
Dim aTmp, arr(), Item, tmp As String
Dim i As Long, n As Long
'On Error Resume Next
For i = LBound(Arrays) To UBound(Arrays)
aTmp = Arrays(i)
If Not IsArray(aTmp) Then aTmp = Array(aTmp)
For Each Item In aTmp
If TypeName(Item) <> "Error" Then
tmp = CStr(Item)
n = n + 1
ReDim Preserve arr(1 To n)
arr(n) = tmp
End If
Next
Next
If n Then JoinText = Join(arr, Delimiter)
End Function
=JoinText("",MID(C4,SEARCH(dic,C4),LEN(dic)))
=JoinText("",IF(SEARCH(dic,C4),dic))
Quy luật người ta nói trong file đó:
Chỗ màu đỏ xem như là từ điển. Vậy ta làm như sau:
1> Đặt name
Đặt 1 name có tên là dic, với Refers to:
2> Code VBA:Mã:={"ĐX","NT4","VT10","NT101","NT2122","NT19","NT20"}
3> Công thức trên Sheet:Mã:Function JoinText(ByVal Delimiter As String, ParamArray Arrays()) As String Dim aTmp, arr(), Item, tmp As String Dim i As Long, n As Long 'On Error Resume Next For i = LBound(Arrays) To UBound(Arrays) aTmp = Arrays(i) If Not IsArray(aTmp) Then aTmp = Array(aTmp) For Each Item In aTmp If TypeName(Item) <> "Error" Then tmp = CStr(Item) n = n + 1 ReDim Preserve arr(1 To n) arr(n) = tmp End If Next Next If n Then JoinText = Join(arr, Delimiter) End Function
hoặc:Mã:=JoinText("",MID(C4,SEARCH(dic,C4),LEN(dic)))
Cả 2 công thức đều là mảng, phải Ctrl + Shift + Enter nhéMã:=JoinText("",IF(SEARCH(dic,C4),dic))
Cách làm của anh quá hay rồi, tuy nhiên vẫn có 1 trường hợp( màu vàng) chưa đúng ý của chủ Topic thì phải
Mình muốn lấy một cụm ký tự bất kỳ từ một chuỗi có sẵn, mong các pro giúp đỡ! (file đính kèm)
Public Function TachChuoi(ByVal ChuoiTim As String, ByVal ChuoiChuan As Range) As String
Dim Arr, i As Byte
Arr = ChuoiChuan
For i = 1 To UBound(Arr, 1)
If Len(TachChuoi) = 0 Then
If InStr(1, ChuoiTim, Arr(i, 1)) Then TachChuoi = Arr(i, 1)
ElseIf InStr(1, ChuoiTim, Arr(i, 1)) Then
If InStr(1, ChuoiTim, TachChuoi & Arr(i, 1)) Then
TachChuoi = TachChuoi & Arr(i, 1)
Else
TachChuoi = Arr(i, 1) & TachChuoi
End If
End If
Next i
End Function
Tình cờ đọc được tài liệu hướng dẫn sử dụng RegEx sực nhớ đến bài gợi ý của thầy nên em áp dụng luôn. Lâu lâu không thấy thấy ol thấy nhớ quá.Cái đó tôi có thấy nhưng JoinText làm việc theo nguyên tắc duyệt các phần tử trong mảng, cái nào nhìn thấy trước thì lấy ra trước
Lưu ý: mảng ở đây chính là các phần tử trong dic (đã đặt name)
---------------
Nếu chủ topic không chịu kết quả này thì các bạn cứ tìm cách khác vậy (RegEx như tôi gợi ý ở trên chẳng hạn)
[/COLOR]Function Rut(ByVal ref As String) As String
Dim rx As Object, arr As Object, i As Integer
ref = Replace(ref, ChrW(272), "D", 1, 1)
Set rx = CreateObject("VBscript.Regexp")
With rx
.Pattern = "[A-Z]{2}[0-9]{0,4}"
.Global = True
If .test(ref) Then Set arr = .Execute(ref)
End With
For i = 0 To arr.Count - 1
If arr(i) <> "NT1" Then
Rut = Rut & arr(i)
Rut = Replace(Rut, "D", ChrW(272), 1, 1)
End If
Next
End Function[COLOR=#000000]
Tình cờ đọc được tài liệu hướng dẫn sử dụng RegEx sực nhớ đến bài gợi ý của thầy nên em áp dụng luôn. Lâu lâu không thấy thấy ol thấy nhớ quá.
Code:
Function Rut(ByVal ref As String) As String
Dim rx As Object, arr As Object, i As Integer
ref = Replace(ref, ChrW(272), "D", 1, 1)
Set rx = CreateObject("VBscript.Regexp")
With rx
.Pattern = "[A-Z]{2}[0-9]{0,4}"
.Global = True
If .test(ref) Then Set arr = .Execute(ref)
End With
For i = 0 To arr.Count - 1
If arr(i) <> "NT1" Then
Rut = Rut & arr(i)
Rut = Replace(Rut, "D", ChrW(272), 1, 1)
End If
Next
End Function
Ha ha. Check kĩ rồi đại ka, đại ka "xem" có sửa gì ở dữ liệu gốc không? Cứ đưa đây dữ liệu 100 dòng đầy pattern nào cũng có. Ha haPattern sai rồi.
Rut("1_1HH_ĐXNT4-47-1") = "HHĐXNT4" ---> HH không phải là ký tự muốn lấy
Thế sư huynh phải gặp Huuthang_bd yêu cầu đến đâu thì làm đến đấy không có chuyện dùng xô thay ly để uống nước. Ha haNgó cái pattern thì biết nó sai rồi. Ví dụ chỉ là chứng minh.
tb. đừng có ka kiếc với tôi. Tôi không dùng ngôn ngữ giang hồ.
Ngó cái pattern thì biết nó sai rồi. Ví dụ chỉ là chứng minh.
tb. đừng có ka kiếc với tôi. Tôi không dùng ngôn ngữ giang hồ.
.Pattern = "[A-Z]{2}[0-9]{0,4}"
Vậy Pattern đúng ở đây là gì vậy "chàng". "Thiếp" muốn nghe góp ý của "chàng".cái pattern hoang đường như này
mà cũng dám đưa vào code để xài , người khác góp ý có vẻ không "ăn lời" , chắc không giao lưu tiếp được rồiMã:.Pattern = "[A-Z]{2}[0-9]{0,4}"
Mình cũng muốn xem tài 1 sao vàng đây ^^Vậy Pattern đúng ở đây là gì vậy "chàng". "Thiếp" muốn nghe góp ý của "chàng".
đơn giản : không biết . Lêu lêu (khi nào chủ topic nêu đích danh : mời Doveandrose viết giúp đoạn code thì đó là chuyện khác =)))Vậy Pattern đúng ở đây là gì vậy "chàng". "Thiếp" muốn nghe góp ý của "chàng".
Hihi nếu chặt ra thì thêm if left(arr(i), 2) =”DX” or left(arr(i), 2) =”NT” or left(arr(i), 2) = "VT" or left(arr(i), 3) <> "NT1" ....nhưng làm biếng ^^. Thậm chí có thể tạo ra một darr = array( "DX1, "VT10"...) để Instr. Thứ tự trong chuỗi không bao giờ bị đảo ngược tùy theo vị trí xuất hiện. Partern là định dạng thô, còn muốn định dạng tinh thì dùng if với instr. Partern của mình chuẩn VetMini là một bạn đanh đáđơn giản : không biết . Lêu lêu (khi nào chủ topic nêu đích danh : mời Doveandrose viết giúp đoạn code thì đó là chuyện khác =)))