从字母数字字符串中提取第一个数字

Dek*_*eke 4 excel vba excel-vba

我正在尝试做的例子

是否可以使用VBA来捕获和使用文本字符串中的第一个数字,如果没有数字,那么只使用1?

我正在使用的代码是查看列AC并查找特定文本,然后使用该文本的前两个字母和最右边的数字并替换N列中的相应行.

我现在尝试做的是考虑文本中没有数字(应该= 1),或者存在但是它在中间但位置移动(因此mid语句不起作用).如果这是可能的任何建议或推进正确的方向将不胜感激.

 Dim wsl As Worksheet
 Dim LR As Long, i As Long

 mydate = Format(Date, "YYMMDD")

 Set wsl = LagoDLFile.Sheets("cid_SeventhAvenue_" & mydate & "")
 LR = wsl.Range("AC" & wsl.Rows.Count).End(xlUp).Row

 For i = 2 To LR
     If wsl.Range("AC" & i) Like "*EOC*" Then
         wsl.Range("N" & i) = "EOC"
     ElseIf wsl.Range("N" & i) Like "700" Then
         wsl.Range("N" & i) = "CHK"
     ElseIf wsl.Range("AC" & i) Like "*CTOB*" Then
         wsl.Range("N" & i) = "COF"
     ElseIf wsl.Range("AC" & i) Like "EXOBC*" Then
         wsl.Range("N" & i) = "WR" & Right(wsl.Range("AC" & i), 1)
     ElseIf Left(wsl.Range("AC" & i), 3) = "OBC" Then
         wsl.Range("N" & i) = "OB" & Right(wsl.Range("AC" & i), 1)
     ElseIf Left(wsl.Range("AC" & i), 3) = "IFC" Then
         wsl.Range("N" & i) = "IF" & Right(wsl.Range("AC" & i), 1)
     ElseIf Left(wsl.Range("AC" & i), 3) = "IBC" Then
         wsl.Range("N" & i) = "IB" & Right(wsl.Range("AC" & i), 1)
     End If
 Next i
 End Sub
Run Code Online (Sandbox Code Playgroud)

K.D*_*ᴠɪs 6

这是一个使用正则表达式来执行所需操作的函数.它使用这个正则表达式:

^\D*(\d)
Run Code Online (Sandbox Code Playgroud)

打破模式

  • ^ 字符串的开头
  • \D*任何不是数字(大写字母D)的字符,其*量词表示0次或更多次
  • (...)捕获组 - 它将捕获您要保留的文本并将其作为子匹配返回
  • \d 任何数值(0-9).

注意:如果您希望它捕获超过第一个数字(例如string123- 您想要返回123,您可以(\d)将上述正则表达式更改为(\d+).这+是一个量词,表示一个或多个\d.

Regex101上看到这个正则表达式的工作.绿色突出显示部分是从以下功能返回的内容.

创建函数/ UDF

Public Function getFirstDigit(testString As String) As String ' or As long

    With CreateObject("VBScript.RegExp")
        .Pattern = "^\D*(\d)"
        .Global = False
        If .test(testString) Then
            getFirstDigit = .Execute(testString)(0).SubMatches(0)
        Else
            getFirstDigit = "1"
        End If
    End With

End Function
Run Code Online (Sandbox Code Playgroud)

您可以在VBA和工作表函数中使用此功能.

在VBA中使用:

Msgbox getFirstDigit("Test String 123")
Run Code Online (Sandbox Code Playgroud)

在工作表中使用

=getFirstDigit($A$1)
Run Code Online (Sandbox Code Playgroud)

  • 非常好 - 正则表达式对我来说仍然像魔术一样,也许有一天我会潜入它... (2认同)
  • 上面不需要你设置引用的原因是因为我使用了后期绑定,@ VBasic2008.如果你想使用早期绑定,你可以设置对"Microsoft VBScript Regular Expressions 5.5"的引用,并将with语句更改为`With New RegExp`而不是使用`CreateObject()`. (2认同)