Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 从字母数字字符串中提取第一个数字_Excel_Vba - Fatal编程技术网

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

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,

是否可以使用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

下面是一个函数,它使用正则表达式来完成您需要的操作。它使用以下正则表达式:

^\D*(\d)
打破模式
  • ^
    字符串的开头
  • \D*
    任何数字(大写D)的字符,带有表示0次或更多次的
    *
    量词
  • (…)
    捕获组-它将捕获您想要保留的文本并作为子匹配返回
  • \d
    任何数值(0-9)
注意:如果您希望它捕获多于第一个数字(例如
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