Rút cụm ký tự từ chuỗi (8 người xem)

Liên hệ QC

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

Bạn thử cách lấy từ NT4: cho vào ô E4 hàm MID(C4;FIND("NT4";C4;1);3) rồi kéo xuống
 
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
 
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
 
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

Quy luật người ta nói trong file đó:
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
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:
Mã:
={"ĐX","NT4","VT10","NT101","NT2122","NT19","NT20"}
2> Code VBA:
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
3> Công thức trên Sheet:
Mã:
=JoinText("",MID(C4,SEARCH(dic,C4),LEN(dic)))
hoặc:
Mã:
=JoinText("",IF(SEARCH(dic,C4),dic))
Cả 2 công thức đều là mảng, phải Ctrl + Shift + Enter nhé
 
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:
Mã:
={"ĐX","NT4","VT10","NT101","NT2122","NT19","NT20"}
2> Code VBA:
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
3> Công thức trên Sheet:
Mã:
=JoinText("",MID(C4,SEARCH(dic,C4),LEN(dic)))
hoặc:
Mã:
=JoinText("",IF(SEARCH(dic,C4),dic))
Cả 2 công thức đều là mảng, phải Ctrl + Shift + Enter nhé

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
 

File đính kèm

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

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)
 
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)

Em xin thử 1 hàm sau

PHP:
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
 

File đính kèm

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)
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:
Mã:
[/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]
 

File đính kèm

Lần chỉnh sửa cuối:
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

Pattern sai rồi.
Rut("1_1HH_ĐXNT4-47-1") = "HHĐXNT4" ---> HH không phải là ký tự muốn lấy
 
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ồ.
 
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ồ.
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 ha
 
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ồ.

cái pattern hoang đường như này
Mã:
.Pattern = "[A-Z]{2}[0-9]{0,4}"
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ồi
 
cái pattern hoang đường như này
Mã:
.Pattern = "[A-Z]{2}[0-9]{0,4}"
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ồi
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 =)))
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 đá
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom