[HỎI] xin hỏi Hàm/ code tách chuỗi sau chữ số cuối cùng? (1 người xem)

  • Thread starter Thread starter otonhot
  • Ngày gửi Ngày gửi

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

otonhot

Thành viên mới
Tham gia
21/3/13
Bài viết
18
Được thích
9
Mình có rất nhiều ô có cấu trúc số-đơn vị tính hay nóichung la số-chuỗi đằng sau:
- Số có thể dạng 1,234 hoặc 1,234.56 hoặc 1234
- Đơn vị (hay chuỗi liền sau chữ số cuối cùng) gồm có Kí tự chữ a-z & có thể dấu “.” , “-“ , “/”, " ". Ví dụ M/T, M.Tons, M-T …

VD: 1,234 Mts => Mts ; 1,234.56M/Tons. => M/Tons.
Các bạn xem ví dụ như file.

Nói tóm lại là mình muốn lấy chuỗi kí tự bất kì sau chữ số cuối cùng!

Xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Mình có rất nhiều ô có cấu trúc số-đơn vị tính hay nóichung la số-chuỗi đằng sau:
- Số có thể dạng 1,234 hoặc 1,234.56 hoặc 1234
- Đơn vị (hay chuỗi liền sau chữ số cuối cùng) gồm có Kí tự chữ a-z & có thể dấu “.” , “-“ , “/”, " ". Ví dụ M/T, M.Tons, M-T …

VD: 1,234 Mts => Mts ; 1,234.56M/Tons. => M/Tons.
Các bạn xem ví dụ như file.

Nói tóm lại là mình muốn lấy chuỗi kí tự bất kì sau chữ số cuối cùng!

Xin cảm ơn.

Dùng hàm tự tạo xem sao. Lấy chuỗi sau ký tự số cuối cùng
 

File đính kèm

Upvote 0
Dùng hàm tự tạo xem sao. Lấy chuỗi sau ký tự số cuối cùng
Tks bạn. Mình thấy dòng DONVI = DONVI này thừa?
Mã:
Public Function DONVI(DL As String)
Dim Mau, i As Long
Mau = "0123456789"
    For i = Len(DL) To 1 Step -1
        If InStr(1, Mau, Mid(DL, i, 1), 1) > 0 Then
            DONVI = Trim(Right(DL, Len(DL) - i))
            Exit For
        End If
    Next i
'DONVI = DONVI
End Function
Bài này liệu có dùng được VBScript RegExp? hoặc là cách nào không dùng vòng lặp???
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có rất nhiều ô có cấu trúc số-đơn vị tính hay nóichung la số-chuỗi đằng sau:
- Số có thể dạng 1,234 hoặc 1,234.56 hoặc 1234
- Đơn vị (hay chuỗi liền sau chữ số cuối cùng) gồm có Kí tự chữ a-z & có thể dấu “.” , “-“ , “/”, " ". Ví dụ M/T, M.Tons, M-T …

VD: 1,234 Mts => Mts ; 1,234.56M/Tons. => M/Tons.
Các bạn xem ví dụ như file.

Nói tóm lại là mình muốn lấy chuỗi kí tự bất kì sau chữ số cuối cùng!

Xin cảm ơn.
Thêm 1 hàm: =GPE(A3)
[GPECODE=vb]Public Function GPE(Str As String) As String
Dim L As Long, i As Long
L = Len(Str)
For i = L To 1 Step -1
If IsNumeric(Mid(Str, i, 1)) Then
GPE = Application.WorksheetFunction.Trim(Mid(Str, i + 1, L))
Exit For
End If
Next i
End Function[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có rất nhiều ô có cấu trúc số-đơn vị tính hay nóichung la số-chuỗi đằng sau:
- Số có thể dạng 1,234 hoặc 1,234.56 hoặc 1234
- Đơn vị (hay chuỗi liền sau chữ số cuối cùng) gồm có Kí tự chữ a-z & có thể dấu “.” , “-“ , “/”, " ". Ví dụ M/T, M.Tons, M-T …

VD: 1,234 Mts => Mts ; 1,234.56M/Tons. => M/Tons.
Các bạn xem ví dụ như file.

Nói tóm lại là mình muốn lấy chuỗi kí tự bất kì sau chữ số cuối cùng!

Xin cảm ơn.

Bài này chắc phải dùng VBA thôi.

Hàm tự tạo:

Mã:
Function GetText(ByVal FullText As String) As String
    GetText = Trim(FullText)
    If GetText > "" Then
        Dim s As Long
        Dim KyTu As String
        For s = 0 To 9
            GetText = Replace(GetText, s, "")
        Next
        For s = 1 To Len(GetText)
            KyTu = Left(GetText, 1)
            If LCase(KyTu) = UCase(KyTu) Then
                GetText = Replace(GetText, KyTu, "", 1, 1)
            Else
                Exit For
            End If
        Next
    End If
End Function

Cách dùng:

=GetText(A3)

=GetText("1,234Mts")
 

File đính kèm

Upvote 0
Mình có rất nhiều ô có cấu trúc số-đơn vị tính hay nóichung la số-chuỗi đằng sau:
- Số có thể dạng 1,234 hoặc 1,234.56 hoặc 1234
- Đơn vị (hay chuỗi liền sau chữ số cuối cùng) gồm có Kí tự chữ a-z & có thể dấu “.” , “-“ , “/”, " ". Ví dụ M/T, M.Tons, M-T …

VD: 1,234 Mts => Mts ; 1,234.56M/Tons. => M/Tons.
Các bạn xem ví dụ như file.

Nói tóm lại là mình muốn lấy chuỗi kí tự bất kì sau chữ số cuối cùng!

Xin cảm ơn.
Nếu dùng Code bạn tìm hiểu thử trong VBA vbScript Regexp
với Pattern là
Mã:
[a-zA-Z]+(?:/|\.|-| )[a-zA-Z]+(?=$)
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu loại bỏ số hoàn toàn thì làm như bài #5, nhưng nếu trong cái "đuôi" nó có chứa số mà muốn giữ lại thì dùng hàm này:

Mã:
Function GetText(ByVal FullText As String) As String
    GetText = Trim(FullText)
    If GetText > "" Then
        Dim s As Long
        Dim KyTu As String
        For s = 1 To Len(GetText)
            KyTu = Left(GetText, 1)
            If LCase(KyTu) = UCase(KyTu) Then
                GetText = Replace(GetText, KyTu, "", 1, 1)
            Else
                Exit For
            End If
        Next
    End If
End Function

=GetText("1,234.000 GPE123")
 
Upvote 0
Thêm 1 hàm: =GPE(A3)
[GPECODE=vb]Public Function GPE(Str As String) As String
Dim L As Long, i As Long
L = Len(Str)
For i = L To 1 Step -1
If IsNumeric(Mid(Str, i, 1)) Then
GPE = Application.WorksheetFunction.Trim(Mid(Str, i + 1, L))
Exit For
End If
Next i
End Function[/GPECODE]
Có thể "chế biến" cách khác được không ạ? Thực sự là mình không muốn dùng WorksheetFuntion trong hàm vì có thể hàm đó còn phát triển dùng cho các ứng dụng khác, VD Word VBA chẳng hạn

Bài này chắc phải dùng VBA thôi.

Hàm tự tạo:

Mã:
Function GetText(ByVal FullText As String) As String
    GetText = Trim(FullText)
    If GetText > "" Then
        Dim s As Long
        Dim KyTu As String
        For s = 0 To 9
            GetText = Replace(GetText, s, "")
        Next
        For s = 1 To Len(GetText)
            KyTu = Left(GetText, 1)
            If LCase(KyTu) = UCase(KyTu) Then
                GetText = Replace(GetText, KyTu, "", 1, 1)
            Else
                Exit For
            End If
        Next
    End If
End Function

Cách dùng:

=GetText(A3)

=GetText("1,234Mts")

Hàm này rườm rà nên ứng dụng phải xem xét ạ.
Em thấy trên GPE có nhiều bài dùng VBScript RegExp, liệu bài này có áp dụng được không ạ?
 
Upvote 0
Tks bạn. Mình thấy dòng DONVI = DONVI này thừa?
Mã:
Public Function DONVI(DL As String)
Dim Mau, i As Long
Mau = "0123456789"
    For i = Len(DL) To 1 Step -1
        If InStr(1, Mau, Mid(DL, i, 1), 1) > 0 Then
            DONVI = Trim(Right(DL, Len(DL) - i))
            Exit For
        End If
    Next i
'DONVI = DONVI
End Function
Bài này liệu có dùng được VBScript RegExp? hoặc là cách nào không dùng vòng lặp???

Ok. Dùng VBScript RegExp giải quyết chắc là được nhưng giờ mới đang ngâm cứu.
 
Upvote 0
Hàm này rườm rà nên ứng dụng phải xem xét ạ.
Em thấy trên GPE có nhiều bài dùng VBScript RegExp, liệu bài này có áp dụng được không ạ?

Code sử dụng thư viện của VBScript với ứng dụng Class của nó là RegExp. Đứng về góc độ lập trình thì để làm được việc ngắn gọn, các nhà lập trình cũng phải viết những mã lệnh xử lý và có lẽ vẫn là dùng vòng lặp. Quá trình làm việc đó được gói trong một Class với hàm Replace. Việc ngắn gọn đó là do ta nhìn về hình thức thôi.
 
Upvote 0
Có thể "chế biến" cách khác được không ạ? Thực sự là mình không muốn dùng WorksheetFuntion trong hàm vì có thể hàm đó còn phát triển dùng cho các ứng dụng khác, VD Word VBA chẳng hạn

Hàm của Ba Tê tại ảnh kỹ nên mới dùng WF chứ không dùng cũng đúng với yêu cầu vậy!

Mã:
Public Function GPE(Str As String) As String
    Dim L As Long, i As Long
    L = Len(Str)
    For i = L To 1 Step -1
       If IsNumeric(Mid(Str, i, 1)) Then
           GPE = Trim(Mid(Str, i + 1, L))
           Exit For
       End If
    Next i
 End Function
 
Upvote 0
Nếu dùng Code bạn tìm hiểu thử trong VBA vbScript Regexp
với Pattern là
Mã:
[a-zA-Z]+(?:/|\.|-| )[a-zA-Z]+

Mình đã thử nhưng pattern trên lại lấy phần số ạ. Mình muốn lấy chuỗi sau chữ số cuối cùng.
PHP:
Sub RegExp()
With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "[a-zA-Z]+(?:/|\.|-| )[a-zA-Z]+"
      MsgBox .Replace("1,234 M/Tons", "") '=> kết quả 1,234 (Mình muốn kết quả là M/Tons.)
End With
End Sub

Mình nghĩ sẽ dùng cách của Bate, dễ hiểu, dễ dùng, dễ sửa chữa. Tks
Hàm của Ba Tê tại ảnh kỹ nên mới dùng WF chứ không dùng cũng đúng với yêu cầu vậy!

Mã:
 Public Function GPE(Str As String) As String
     Dim L As Long, i As Long
     L = Len(Str)
     For i = L To 1 Step -1
        If IsNumeric(Mid(Str, i, 1)) Then
            GPE = Trim(Mid(Str, i + 1, L))
            Exit For
        End If
     Next i
  End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã thử nhưng pattern trên lại lấy phần số ạ. Mình muốn lấy chuỗi sau chữ số cuối cùng.
PHP:
Sub RegExp()
With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "[a-zA-Z]+(?:/|\.|-| )[a-zA-Z]+"
      MsgBox .Replace("1,234 M/Tons", "") '=> kết quả 1,234 (Mình muốn kết quả là M/Tons.)
End With
End Sub
Dùng execute nhé, ở đây bạn lại Replace nên còn lại phần số là đúng rồi
tôi có đính chính lại Pattern là:
Mã:
[a-zA-Z]+(?:/|\.|-| )[a-zA-Z]+(?=$)
(bổ sung thêm Lookahead tại cuối dòng)
 
Upvote 0
Mình đã thử nhưng pattern trên lại lấy phần số ạ. Mình muốn lấy chuỗi sau chữ số cuối cùng.
PHP:
Sub RegExp()
With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "[a-zA-Z]+(?:/|\.|-| )[a-zA-Z]+"
      MsgBox .Replace("1,234 M/Tons", "") '=> kết quả 1,234 (Mình muốn kết quả là M/Tons.)
End With
End Sub
Nếu dùng RegExp thì Pattern phải là ".*\d"
Code như vầy
PHP:
Function GetStr(Str As String) As String
With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = ".*\d"
      GetStr = Trim(.Replace(Str, ""))
End With
End Function
 
Upvote 0
Nếu muốn công thức thì cũng có luôn.
Công thức mảng:
Mã:
=TRIM(REPLACE(A3,1,MAX(IF(COUNTIF(A3,LEFT(A3,ROW(INDIRECT("A1:A"&LEN(A3))))&(COLUMN($A$1:$J$1)-1)&"*")>0,ROW(INDIRECT("A1:A"&LEN(A3))),""))+1,""))
Excel 2007+
 

File đính kèm

Upvote 0
Em thấy công thức này chưa có sai sót gì.
=TRIM(RIGHT(A3,LEN(A3)-MAX(IF(ISNUMBER(--MID(A3,ROW($1:$256),1)),ROW($1:$256),""))))
 
Upvote 0
Regex:

Đây là hàm tự tạo, phải không?
Cứ mỗi lần tính một ô lại gọi hàm CreateObject để nó tạo một đối tượng Regex mới à?

Giải pháp Regex trong trường hợp này có thể nói là quá phí phạm.
(nếu nhất định muốn dùng thì cũng nên tìm cách bảo vệ đối tượng Regex, chỉ tạo một lần thôi, không để nó chết khi hàm thoát ra)
 
Upvote 0
Em thấy công thức này chưa có sai sót gì.
=TRIM(RIGHT(A3,LEN(A3)-MAX(IF(ISNUMBER(--MID(A3,ROW($1:$256),1)),ROW($1:$256),""))))

Công thức mảng mà tham chiếu đến 256 dòng như thế thì cũng quá phí. Cần bao nhiêu thì lấy bao nhiêu thôi.
 
Upvote 0

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

Back
Top Bottom