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)
这是一个使用正则表达式来执行所需操作的函数.它使用这个正则表达式:
^\D*(\d)
Run Code Online (Sandbox Code Playgroud)
^ 字符串的开头\D*任何不是数字(大写字母D)的字符,其*量词表示0次或更多次(...)捕获组 - 它将捕获您要保留的文本并将其作为子匹配返回\d 任何数值(0-9).注意:如果您希望它捕获超过第一个数字(例如
string123- 您想要返回123,您可以(\d)将上述正则表达式更改为(\d+).这+是一个量词,表示一个或多个\d.
在Regex101上看到这个正则表达式的工作.绿色突出显示部分是从以下功能返回的内容.
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)
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |