Rút cụm ký tự từ chuỗi

Liên hệ QC

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)
 

File đính kèm

  • lấy ký tự trong chuỗi.xlsx
    11.7 KB · Đọc: 66
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

  • LOC KY TU HAM JIONTEX 16.9.xls
    40.5 KB · Đọc: 12
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

  • lấy ký tự trong chuỗi www.rar
    15.7 KB · Đọc: 27
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

  • Book11.xls
    28 KB · Đọc: 13
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".
 
Web KT
Back
Top Bottom