【发布时间】:2018-03-13 20:47:48
【问题描述】:
我有一行这样的值,如何将文本“ABCD”之后的前两位数字提取到另一个单元格、任何公式或 vba?中间可能有几个字符,有时甚至没有。
- ABCD 10 sadkf sdfas
- ABCD-20sdf asdf
- ABCD 40
- ABCD50 asdf
【问题讨论】:
标签: vba excel excel-formula
我有一行这样的值,如何将文本“ABCD”之后的前两位数字提取到另一个单元格、任何公式或 vba?中间可能有几个字符,有时甚至没有。
【问题讨论】:
标签: vba excel excel-formula
一般来说,在 StackOverflow 中显示一些代码总是一个好主意。因此,你表明你已经尝试了一些东西,并给出了一些答案的方向。
关于前两位数字的提取,有很多方法可以做到这一点。从 RegEx 开始,以简单的字符循环结束并检查每个字符。
这是循环选项:
Public Function ExtractTwoDigits(inputString As String) As Long
Application.Volatile
Dim cnt As Long
Dim curChar As String
For cnt = 1 To Len(inputString)
curChar = Mid(inputString, cnt, 1)
If IsNumeric(curChar) Then
If Len(ExtractTwoDigits) Then
ExtractTwoDigits = ExtractTwoDigits & curChar
Exit Function
Else
ExtractTwoDigits = curChar
End If
End If
Next cnt
ExtractTwoDigits = -1
End Function
Application.Volatile 确保每次都重新计算公式;inputString 中不存在两位数,则-1 是答案;IsNumeric检查里面的字符串是否为数字;1、3、4 或 5 数字。类似这样的=ExtractTwoDigits("tarato123ra2",4),返回1232。【讨论】:
正则表达式版本:
Public Function GetFirstTwoNumbers(ByVal strInput As String) As Integer
Dim reg As New RegExp, matches As MatchCollection
With reg
.Global = True
.Pattern = "(\d{2})"
End With
Set matches = reg.Execute(strInput)
If matches.Count > 0 Then
GetFirstTwoNumbers = matches(0)
Else
GetFirstTwoNumbers = -1
End If
End Function
你必须在 extras->references 下启用Microsoft Regular Expressions 5.5。模式(\d{2}) 匹配 2 位数字,返回值为数字,如果不存在 -1。
注意:它只提取2个连续的数字。
如果将此函数放入模块中,则可以像普通公式一样使用它。
Here 一个进入正则表达式的好网站。
【讨论】: