Excel 从字母数字字符串中提取第一个数字
是否可以使用VBA捕获并使用文本字符串中的第一个数字,如果没有数字,则只使用1 我目前使用的代码是查看AC列,找到一个特定的文本,然后使用该文本的前两个字母和最右边的数字,并替换N列中相应的行 我现在要做的是解释文本中没有数字(应该=1),或者有数字,但它在中间,但位置在移动(因此mid语句不起作用)。如果这是可能的任何建议或推动在正确的方向将不胜感激Excel 从字母数字字符串中提取第一个数字,excel,vba,Excel,Vba,是否可以使用VBA捕获并使用文本字符串中的第一个数字,如果没有数字,则只使用1 我目前使用的代码是查看AC列,找到一个特定的文本,然后使用该文本的前两个字母和最右边的数字,并替换N列中相应的行 我现在要做的是解释文本中没有数字(应该=1),或者有数字,但它在中间,但位置在移动(因此mid语句不起作用)。如果这是可能的任何建议或推动在正确的方向将不胜感激 Dim wsl As Worksheet Dim LR As Long, i As Long mydate = Format(Date,
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
下面是一个函数,它使用正则表达式来完成您需要的操作。它使用以下正则表达式:
^\D*(\d)
打破模式
字符串的开头^
任何非数字(大写D)的字符,带有表示0次或更多次的\D*
量词*
捕获组-它将捕获您想要保留的文本并作为子匹配返回(…)
任何数值(0-9)\d
string123
-您希望返回123
,您可以将上述正则表达式中的(\d)
更改为(\d+)
。+
是一个量词,表示\d
中的一个或多个
请参阅上的这个正则表达式。绿色突出显示的部分是从下面的函数返回的内容
创建函数/UDF
您可以在VBA和中使用此函数作为工作表函数
在VBA中使用:
Msgbox getFirstDigit("Test String 123")
在工作表中使用
=getFirstDigit($1澳元)
不带RegExp的变体
Public Function firstIntInString(testStr As String) As Integer
Dim x%
For x = 1 To Len(testStr)
If Mid(testStr, x, 1) Like "#" Then
firstIntInString = Mid(testStr, x, 1)
Exit For
Else
firstIntInString = 1 'in case when string doesn't contains digits
End If
Next x
End Function
第一位数字?如果文本字符串是TEST123TEST
-您想要1
还是123
?@K.Dᴀᴠɪs我真的很惊讶,所以我没听清楚这个标题,你通常不能只说“如果其他的话”或者类似的任何东西。抱歉没有说得更具体。我已经添加了一张我正在处理的图像。突出显示的部分是期望的结果,而非突出显示的部分是我必须处理的一组示例。我不确定这是否可能超出no#=1,但我希望有人能有一些想法。谢谢!!!!谢谢感谢你就同一代码发布了一个新问题!我的评论没有讽刺意味。这是网站应该如何运作的-不同的问题会得到不同的帖子。我觉得有必要发表评论这一事实应该告诉你,人们会有多频繁地用项目更新来发布他们的第一个问题,即使这个问题与o无关最初的帖子我不习惯使用函数,但我会给它一个测试,看看它是如何运行的。我习惯于将所有内容写入宏中。如果我理解您在代码中试图做什么,那么这行:wsl.Range(“N”&I)=“WR”和Right(wsl.Range(“AC”&I),1)
看起来是这样的:wsl.Range(“N”&I)=“WR”和getFirstDigit(wsl.范围(“AC”和i))
非常好-Regex对我来说仍然像魔术一样,也许有一天我会深入研究它…很好。为什么它不需要对库的引用,或者是真的?上面不需要你设置引用的原因是因为我使用了后期绑定@vbasic208。如果你想使用早期绑定,你可以设置对Microsoft VBScript的引用正则表达式5.5
并将with语句更改为with New RegExp
,而不是使用CreateObject()
。很好,但是…OP要求的是值,而不是第一个整数的位置。这就是为什么1是默认值。如何使用“int(Mid(testStr,…”,以便返回值始终为int。@user1016274我演示了方法(之前的版本也已经足够了),如果您突然不知道如何从这个函数返回字符串,那么只需在函数声明部分将替换为Integer
,将替换为string
。
Public Function firstIntInString(testStr As String) As Integer
Dim x%
For x = 1 To Len(testStr)
If Mid(testStr, x, 1) Like "#" Then
firstIntInString = Mid(testStr, x, 1)
Exit For
Else
firstIntInString = 1 'in case when string doesn't contains digits
End If
Next x
End Function