Mình cần xin hàm cải tiến của hàm GetNumberIf trong file đính kèm

Liên hệ QC

ManhDuc1382

Supreme Сasual Dating - Verified Maidens
Tham gia
5/3/20
Bài viết
46
Được thích
16
Giới tính
Nam
Nghề nghiệp
Health
Chào các bạn. Mình có code của hàm GetNumberIf giúp lấy ra số từ chuỗi, tuy nhiên mình đang muốn cải tiến hàm này với khả năng tách ra các số có điều kiện. Mình có ghi rất chi tiết mong muốn của mình trong file đính kèm, các bạn giúp mình với nhé, mình cảm ơn --=0

Code hàm GetNumberIf cũ

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


Hàm GetNumberIf cải tiến (GetNumberIfNew)
Công thức hàm GetNumberIf cải tiến:
=GetNumberIfNew(Chuỗi gốc, Ký tự ngăn cách (Optional = "z" nếu không có), Các điều kiện)
Trong đó:
Chuỗi gốc có thể có các ký tự ngăn cách là , ; . Dấu cách
Điều kiện được viết như sau:
Số 0 đại diện cho số: Số được tách ra gồm các kiểu: Số nguyên dương ( nếu có dấu trừ, ví dụ -9.6 thì lấy ra 9.6 ), nếu có số trong dấu ngoặc đơn (8.5) thì lấy ra cả số trong dấu ngoặc đơn (8.5) , số ngăn cách bởi dấu phẩy 9,6 số ngăn cách bởi dấu chấm 8.5
Nếu số 0 đứng trước dấu & : (0&"Chuỗi") : Điều kiện là số đứng trước chuỗi
Nếu số 0 đứng sau dấu & : ("Chuỗi"&0) : Điều kiện là số đứng sau chuỗi
Dấu * biểu thị cho một hoặc nhiều ký tự hoặc không có gì ( >= 0 ký tự )
Dấu ? biểu thị cho một ký tự
4.5ac ; 65bc , 7,7ac . c 884.5z7,7z88=GetNumberIfNew(E13 , "z" , 0&"ac" , "c"&0)
4.5 acb 65 bc , 7,7acx ; (88)bcd4.5z7,7z(88)=GetNumberIfNew(E14 , , 0&"ac?" , 0&"bc?")
4.5 acbbb 65 bc ; 77acx , acxx -8877z88=GetNumberIfNew(E15 , "z" , 0&"ac?" , "ac*"&0)
-4.5 acbb , 65 bc (7,7) acx . dac 884.5z(7,7)z88=GetNumberIfNew(E16 , "z" , 0&"ac*" , "*ac*&0)
4.5mnacbb , 65 bc , (7.7) kacx4.5z(7.7)=GetNumberIfNew(E17 , "z" , 0&"*ac*")
 

File đính kèm

  • Cần xin hàm GetNumberIf cải tiến.xlsm
    17.9 KB · Đọc: 27
Lần chỉnh sửa cuối:
Các bạn giúp mình với nhé --=0 --=0 --=0
 
Upvote 0
Nên ghi yêu cầu chi tiết trong bài viết của mình, kể cả code. File đính kèm để minh họa thêm. Không nên để tất cả trong file.
Cảm ơn bạn, mình đã sửa lại bài viết chi tiết hơn rồi nhé
Bạn @HeSanbi giúp mình với nhé, mình nhớ hàm này do bạn viết, mong là cải tiến được --=0 --=0 --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Mình sợ là ngài thăng rồi nên hổng có chứng (tức không linh) --=0
nói sao thì mình cũng cảm ơn bạn HeSanbi nhiều lắm vì nhờ hàm đó của bạn ấy mà mình cũng giải quyết được bài toán mình đặt ra ở bài viết này, chỉ là công thức hơi dài thôi :yu: nhìn chung là mình cũng có phương án giải quyết bài này rồi, hì hì, chúc bạn ngủ ngon nhé :{{:hypocrite::icecream:
 
Upvote 0
Mong muốn của bạn rất khó:


-----------------------------
JavaScript:
Function NumberIFS(ByVal Text As String, _
                         ByVal Hyphen As String, _
                         ParamArray Patterns()) As String
  Dim M, N, I&, j&, S$, L$, R$, T$, T1$, T2$, LN&, IL As Boolean, IR As Boolean, RS$, k
  LN = Len(Text): If LN < 2 Then Exit Function
  Static RE As Object
  If RE Is Nothing Then
    Set RE = VBA.CreateObject("VBScript.RegExp")
  End If
  Const PN = "\-?(\(?\-?\d+[.,]?\d*\)?)"
  With RE
    .Global = False
    For Each M In Patterns
      If M <> "" Then
        Select Case True
        Case Left(M, 1) = "0": T = Mid(M, 2): GoSub rep
          L = L & IIf(L = "", "", "|") & "(?:" & T & ")"
        Case Right(M, 1) = "0": T = Left(M, Len(M) - 1): GoSub rep
          R = R & IIf(R = "", "", "|") & "(?:" & T & ")"
        End Select
      End If
    Next
    If R <> "" Then R = "(?: *" & R & ") *" & PN & "$"
    If L <> "" Then L = PN & "(?: *" & L & ")" & "$"
    T = Left(Text, 1)
    For k = 2 To LN
      T1 = Mid(Text, k, 1)
      T = T & T1
      GoSub RE
    Next
    If T2 <> "" Then
      NumberIFS = RS & IIf(RS = "", "", Hyphen) & T2
    Else
      NumberIFS = RS
    End If
Exit Function
rep:
  T = Replace(T, "?", "(?:[A-z])")
  T = Replace(T, "*", "(?:[A-z]*)")
Return
RE:
  If R <> "" Then
    .Pattern = R
    If .test(T) Then
      IR = True: T2 = .Execute(T)(0).submatches(0)
    Else
      If IR Then IR = False: GoSub res: T = T1
    End If
  End If
  If L <> "" Then
    .Pattern = L
    If .test(T) Then
      IL = True: T2 = .Execute(T)(0).submatches(0)
    Else
      If IL Then IL = False: GoSub res: T = T1
    End If
  End If
Return
End With
res:
  If Not T1 Like "[A-z]" Then
    RS = RS & IIf(RS = "", "", Hyphen) & T2
  End If
  T2 = ""
Return
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mong muốn của bạn rất khó:


-----------------------------
JavaScript:
Function NumberIFS(ByVal Text As String, _
                         ByVal Hyphen As String, _
                         ParamArray Patterns()) As String
  Dim M, N, I&, j&, S$, L$, R$, T$, T1$, T2$, LN&, IL As Boolean, IR As Boolean, RS$, k
  LN = Len(Text): If LN < 2 Then Exit Function
  Static RE As Object
  If RE Is Nothing Then
    Set RE = VBA.CreateObject("VBScript.RegExp")
  End If
  Const PN = "\-?(\(?\d+(?:[.,]\d+)?\)?)"
  With RE
    .Global = False
    For Each M In Patterns
      If M <> "" Then
        Select Case True
        Case Left(M, 1) = "0": T = Mid(M, 2): GoSub rep
          L = L & IIf(L = "", "", "|") & "(?:" & T & ")"
        Case Right(M, 1) = "0": T = Left(M, Len(M) - 1): GoSub rep
          R = R & IIf(R = "", "", "|") & "(?:" & T & ")"
        End Select
      End If
    Next
    If R <> "" Then R = "(?: *" & R & ") *" & PN & "$"
    If L <> "" Then L = PN & "(?: *" & L & ")" & "$"
    T = Left(Text, 1)
    For k = 2 To LN
      T1 = Mid(Text, k, 1)
      T = T & T1
      GoSub RE
    Next
    If T2 <> "" Then
      NumberIFS = RS & IIf(RS = "", "", Hyphen) & T2
    Else
      NumberIFS = RS
    End If
Exit Function
rep:
  T = Replace(T, "?", "(?:[A-z])")
  T = Replace(T, "*", "(?:[A-z]*)")
Return
RE:
  If R <> "" Then
    .Pattern = R
    If .test(T) Then
      IR = True: T2 = .Execute(T)(0).submatches(0)
    Else
      If IR Then IR = False: GoSub res: T = T1
    End If
  End If
  If L <> "" Then
    .Pattern = L
    If .test(T) Then
      IL = True: T2 = .Execute(T)(0).submatches(0)
    Else
      If IL Then IL = False: GoSub res: T = T1
    End If
  End If
Return
End With
res:
  If Not T1 Like "[A-z]" Then
    RS = RS & IIf(RS = "", "", Hyphen) & T2
  End If
  T2 = ""
Return
End Function
Mình cảm ơn bạn rất rất nhiều :yahoo: bài này mà chỉ cần một công thức là giải quyết được thì phải gọi là vô cùng bá đạo luôn :1a: có gì thắc mắc mình sẽ hỏi bạn thêm nhé --=0 Điều tuyệt vời nhất trong ngày hôm nay là nhận được món quà này của bạn :D
 
Upvote 0
Mong muốn của bạn rất khó:


-----------------------------
JavaScript:
Function NumberIFS(ByVal Text As String, _
                         ByVal Hyphen As String, _
                         ParamArray Patterns()) As String
  Dim M, N, I&, j&, S$, L$, R$, T$, T1$, T2$, LN&, IL As Boolean, IR As Boolean, RS$, k
  LN = Len(Text): If LN < 2 Then Exit Function
  Static RE As Object
  If RE Is Nothing Then
    Set RE = VBA.CreateObject("VBScript.RegExp")
  End If
  Const PN = "\-?(\(?\d+(?:[.,]\d+)?\)?)"
  With RE
    .Global = False
    For Each M In Patterns
      If M <> "" Then
        Select Case True
        Case Left(M, 1) = "0": T = Mid(M, 2): GoSub rep
          L = L & IIf(L = "", "", "|") & "(?:" & T & ")"
        Case Right(M, 1) = "0": T = Left(M, Len(M) - 1): GoSub rep
          R = R & IIf(R = "", "", "|") & "(?:" & T & ")"
        End Select
      End If
    Next
    If R <> "" Then R = "(?: *" & R & ") *" & PN & "$"
    If L <> "" Then L = PN & "(?: *" & L & ")" & "$"
    T = Left(Text, 1)
    For k = 2 To LN
      T1 = Mid(Text, k, 1)
      T = T & T1
      GoSub RE
    Next
    If T2 <> "" Then
      NumberIFS = RS & IIf(RS = "", "", Hyphen) & T2
    Else
      NumberIFS = RS
    End If
Exit Function
rep:
  T = Replace(T, "?", "(?:[A-z])")
  T = Replace(T, "*", "(?:[A-z]*)")
Return
RE:
  If R <> "" Then
    .Pattern = R
    If .test(T) Then
      IR = True: T2 = .Execute(T)(0).submatches(0)
    Else
      If IR Then IR = False: GoSub res: T = T1
    End If
  End If
  If L <> "" Then
    .Pattern = L
    If .test(T) Then
      IL = True: T2 = .Execute(T)(0).submatches(0)
    Else
      If IL Then IL = False: GoSub res: T = T1
    End If
  End If
Return
End With
res:
  If Not T1 Like "[A-z]" Then
    RS = RS & IIf(RS = "", "", Hyphen) & T2
  End If
  T2 = ""
Return
End Function
Bạn ơi bạn xem giúp mình với nhé, có một số chỗ mà nếu dùng hàm của bạn thì bị thiếu mất phần đằng sau dấu phẩy, bạn xem giúp mình nhé --=0
 

File đính kèm

  • Hàm NumberIFS.xlsm
    22.5 KB · Đọc: 8
Upvote 0
@ManhDuc1382
Bạn sửa hằng Const PN thành:
Const PN = "\-?(\(?\-?\d+[.,]?\d*\)?)"
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom