Cần xin hàm tách số ra khỏi chuỗi có ngăn cách bởi ký hiệu tùy chọn

Liên hệ QC

hktanh

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
22/8/19
Bài viết
112
Được thích
8
Giới tính
Nam
Chào các bạn. Mình đang cần xin hàm tự tạo có thể tách số ra khỏi chuỗi như sau:
Giả sử ký hiệu ngăn cách là chữ z , chuỗi cần tách số là 34,17hkp6.796qq256mnp468
Các số 34,17 ; 6.796 có thể là số thập phân nên giữ nguyên, các số của kết quả ngăn cách nhau bởi ký hiệu z nên kết quả sẽ là 34,17z6.796z256z468
Trường hợp có số âm trong dấu ngoặc đơn, ví dụ (99) hoặc có dấu trừ đằng trước, ví dụ -34 thì hàm sẽ lấy số trong dấu ngoặc đơn (99) thì lấy 99 , -34 thì lấy 34, tức là mình muốn lấy ra những số không âm, số thập phân ngăn cách bởi dấu chấm hoặc phẩy thì vẫn giữ nguyên. Phần trình bày các kết quả mong muốn mình có viết trong file, cảm ơn các bạn đã giúp đỡ
 

File đính kèm

  • Cần giúp hàm tách số ra khỏi chuỗi có ngăn cách bởi ký hiệu.xlsx
    9.8 KB · Đọc: 20
Bạn có thể sử dụng Hàm tự tạo dưới đây.

---------------------
PHP:
Public Function GetNumberIf(ByVal Text As String) As String
  'Static RE As Object'
  With VBA.CreateObject("VBScript.RegExp")
    .Global = 1: .MultiLine = 1
    .Pattern = "(\d+(?:[.,][\d]+)?)\D*"
    If .test(Text) Then
      Text = .Replace(Text, "z$1")
      GetNumberIf = VBA.Mid(Text, 2)
    End If
  End With
End Function
 
Upvote 0
Bạn có thể sử dụng Hàm tự tạo dưới đây.

---------------------
PHP:
Public Function GetNumberIf(ByVal Text As String) As String
  'Static RE As Object'
  With VBA.CreateObject("VBScript.RegExp")
    .Global = 1: .MultiLine = 1
    .Pattern = "(\d+(?:[.,][\d]+)?)\D*"
    If .test(Text) Then
      Text = .Replace(Text, "z$1")
      GetNumberIf = VBA.Mid(Text, 2)
    End If
  End With
End Function
mình cảm ơn nhé, chúc bạn năm mới gặp nhiều may mắn và thành công trong công việc nhé ;)
 
Upvote 0
Hoặc thử:
PHP:
Function TachSo(ByVal s As String, Optional ByVal n As String = "z") As String
Dim i As Long, t As String
For i = 1 To Len(s)
    t = Mid(s, i, 1)
    If IsNumeric(t) = False And t <> "." And t <> "," Then Mid(s, i, 1) = " "
Next

TachSo = Replace(Application.Trim(s), " ", n)
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Hoặc thử:
PHP:
Function TachSo(ByVal s As String, Optional ByVal n As String = "z") As String
Dim i As Long, t As String
For i = 1 To Len(s)
    t = Mid(s, i, 1)
    If IsNumeric(t) = False And t <> "." And t <> "," Then Mid(s, i, 1) = " "
Next

TachSo = Replace(Application.Trim(s), " ", n)
End Function
thank kiu bạn :")))
 
Upvote 0
Gọn hơn một chút:
PHP:
Function TachSo2(ByVal s As String, Optional ByVal n As String = "z") As String
Dim i As Long
For i = 1 To Len(s)
    If InStr(1, "0123456789.,", Mid(s, i, 1)) = 0 Then Mid(s, i, 1) = " "
Next

TachSo2 = Replace(Application.Trim(s), " ", n)
End Function
 
Upvote 0
Gọn hơn một chút:
PHP:
Function TachSo2(ByVal s As String, Optional ByVal n As String = "z") As String
Dim i As Long
For i = 1 To Len(s)
    If InStr(1, "0123456789.,", Mid(s, i, 1)) = 0 Then Mid(s, i, 1) = " "
Next

TachSo2 = Replace(Application.Trim(s), " ", n)
End Function
Bạn ơi, hàm của bạn khi trong chuỗi có dấu chấm hoặc dấu phẩy mà không phải là số thì nó vẫn hiểu là số nhé, ví dụ ở đây mình có chuỗi mnp.abc,def345pp99mm88 thì kết quả nó trả về là .z,z345z99z88 mà đúng ra phải là 345z99z88 bạn nhé :victory:
Bài đã được tự động gộp:

??? tra cứu gì vậy bạn
 

File đính kèm

  • Thử hàm 1.xlsm
    15.6 KB · Đọc: 8
Upvote 0
Bạn ơi, hàm của bạn khi trong chuỗi có dấu chấm hoặc dấu phẩy mà không phải là số thì nó vẫn hiểu là số nhé, ví dụ ở đây mình có chuỗi mnp.abc,def345pp99mm88 thì kết quả nó trả về là .z,z345z99z88 mà đúng ra phải là 345z99z88 bạn nhé :victory:
Bẫy lỗi thêm, phần này bạn tự làm.
 
Upvote 0
Nếu bạn không muốn sử dụng Regular Expression thì vận dụng hàm tự tạo dưới đây:

-------------------
PHP:
Function GetNumberIf2(ByVal Text As String, _
             Optional ByVal Hyphen As String = "z") As String
  Dim i As Long, t$, S$, N$, O$, B As Boolean
  For i = 1 To VBA.Len(Text)
    t = VBA.Mid(Text, i, 1)
    If t Like "*[0-9]*" Then
      S = S & N & O & t: O = "": B = True: N = ""
    ElseIf t Like "*[.,]*" Then
      If B Then O = t: B = False Else If O <> "" Then O = "": N = Hyphen
    Else
      N = Hyphen: O = "": B = False
    End If
  Next
  GetNumberIf2 = S
End Function
-------------------

Sửa lại hàm sử dụng Regular Expression để tránh trường hợp dấu . hoặc , đứng trước số (",34")

-------------------

PHP:
Public Function GetNumberIf(ByVal Text As String, _             
                                 Optional ByVal Hyphen As String = "z") As String
  Static RE As Object
  If RE Is Nothing Then
        Set RE = VBA.CreateObject("VBScript.RegExp")
      With RE
        .Global = 1: .MultiLine = 1
        .Pattern = "\D*(\d+(?:[.,]\d+)?)\D*"
      End With
  End If
  If RE.test(Text) Then
    Text = RE.Replace(Text, Hyphen & "$1")
    GetNumberIf = VBA.Mid(Text, 2)
  End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn không muốn sử dụng Regular Expression thì vận dụng hàm tự tạo dưới đây:

-------------------
PHP:
Function GetNumberIf2(ByVal Text As String, _
             Optional ByVal Hyphen As String = "z") As String
  Dim i As Long, t$, S$, N$, O$, B As Boolean
  For i = 1 To VBA.Len(Text)
    t = VBA.Mid(Text, i, 1)
    If t Like "*[0-9]*" Then
      S = S & N & O & t: O = "": B = True: N = ""
    ElseIf t Like "*[.,]*" Then
      If B Then O = t: B = False Else If O <> "" Then O = "": N = Hyphen
    Else
      N = Hyphen: O = "": B = False
    End If
  Next
  GetNumberIf2 = S
End Function
-------------------

Sửa lại hàm sử dụng Regular Expression để tránh trường hợp dấu . hoặc , đứng trước số (",34")

-------------------

PHP:
Public Function GetNumberIf(ByVal Text As String, _            
                                 Optional ByVal Hyphen As String = "z") As String
  Static RE As Object
  If RE Is Nothing Then
        Set RE = VBA.CreateObject("VBScript.RegExp")
      With RE
        .Global = 1: .MultiLine = 1
        .Pattern = "\D*(\d+(?:[.,]\d+)?)\D*"
      End With
  End If
  If RE.test(Text) Then
    Text = RE.Replace(Text, Hyphen & "$1")
    GetNumberIf = VBA.Mid(Text, 2)
  End If
End Function
Bạn quá là tài giỏi luôn ấy, like mạnh cho bạn :1a::1a::1a:
 
Upvote 0
Web KT
Back
Top Bottom