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

时间:2018-12-27 20:25:44

标签: excel vba excel-vba

Examples of what I'm trying to do

是否可以使用VBA捕获并使用文本字符串中的第一个数字,如果没有数字,则仅使用1?

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

我现在想做的是考虑文本中没有数字(应为= 1),还是有数字,但它在中间但位置移动了(因此,中间语句不起作用) 。如果可能的话,将不胜感激任何建议或朝正确方向发展。

 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

2 个答案:

答案 0 :(得分:6)

这是一个使用正则表达式执行所需功能的函数。它使用此正则表达式:

^\D*(\d)

打破常规

  • ^字符串的开头
  • \D* 不是数字的任何字符(大写D),其*量词表示 0次或更多次
  • (...)捕获组-它将捕获您要保留的文本并作为 submatch
  • 返回
  • \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

您既可以在VBA中使用此功能,也可以将其用作工作表功能。

在VBA中使用:

Msgbox getFirstDigit("Test String 123")

在工作表中使用

=getFirstDigit($A$1)

答案 1 :(得分:1)

没有export class StockMovementComponent implements OnInit{ disableButton: boolean = true; draggableOptions : SortablejsOptions = { animation: 150, onUpdate: () => this.dragDropDataSuccess(), scroll: true, scrollSensitivity: 100 }; constructor(){} ngOnInit() {} dragDropDataSuccess(){ this.disableButton = false; } }

的变体
RegExp

测试

enter image description here