如何检查字符串是否只包含vba中的数字

时间:2014-04-20 01:29:48

标签: string excel vba excel-vba isnumeric

我想从像这样的字符串中解析出年份信息

$ 8995 2008年4月18日本田思域混合动力车8995美元(Orem)pic map cars&卡车 - 由所有者

由于我在线检索此字符串,有时年份元素不在同一个地方。我这样做的方法是使用split函数按空格分割字符串,然后检查数组的每个节点是否只包含数字。

但是当我使用函数IsNumeric时,它也返回“$ 8995”节点为true。

检查字符串是否仅包含数字,没有“$”,没有“。”而不是其他任何内容的好方法是什么?

或者在我的情况下,是否有更好的方法来检索年份信息?

感谢。

4 个答案:

答案 0 :(得分:1)

是否所有带有“年”的字符串都会有类似日期的子字符串?如果是这种情况,您可以循环查找字符串,查找看起来像日期的第一组三个,从中提取年份:

Option Explicit
Function FindYear(S As String) As Long
    Dim SS As Variant
    Dim sDate As String
    Dim I As Long, J As Long

SS = Split(S, " ")
For I = 0 To UBound(SS) - 2
    sDate = ""
    For J = 0 To 2
        sDate = " " & sDate & " " & SS(I + J)
    Next J
    sDate = Trim(sDate)
    If IsDate(sDate) Then
        FindYear = Year(sDate)
        Exit Function
    End If
Next I
End Function

答案 1 :(得分:1)

这可以使用Like运算符以单行代码的形式完成

Function StringIsDigits(ByVal s As String) As Boolean
    StringIsDigits = Len(s) And (s Like String(Len(s), "#"))
End Function

答案 2 :(得分:0)

如果不使用正则表达式或一些非常复杂的逻辑,那么很难完美。

此代码将返回纯数字子字符串,但在您的示例中,它将返回“18”和“2008”。您显然可以尝试添加更多逻辑来禁止“18”(但允许“13”或“09”等,但就像我说的那样开始变得复杂。我很乐意帮助它,但不知道到底是什么你想要,我认为现在最好把它留给你。

Const str$ = "$8995 Apr 18 2008 Honda Civic Hybrid $8995 (Orem) pic map cars & trucks - by owner"
Option Explicit
Sub FindNumericValues()

Dim var() As String
Dim numbers As Variant

var = Split(str, " ")

numbers = GetNumerics(var)

MsgBox Join(numbers, ",")

End Sub

Function GetNumerics(words() As String) As Variant
Dim tmp() As Variant
Dim i As Integer
Dim n As Integer
Dim word As Variant
Dim bNumeric As Boolean

For Each word In words
    n = 0
    bNumeric = True
    Do While n < Len(word)
    n = n + 1
        If Not IsNumeric(Mid(word, n, 1)) Then
            bNumeric = False
            Exit Do
        End If
    Loop
    If bNumeric Then
        ReDim Preserve tmp(i)
        tmp(i) = word
        i = i + 1
    End If
Next

GetNumerics = tmp
End Function

答案 3 :(得分:0)

您可以使用RegEx解析年份:

Public Function GetYear(someText As String) As Integer
    With CreateObject("VBScript.RegExp")
        .Global = False
        .MultiLine = False
        .IgnoreCase = True
        .Pattern = " [\d]{4} "
        If .Test(testString) Then
            GetYear = CInt(.Execute(testString)(0))
        Else
            GetYear = 9999
        End If
    End With
End Function

示例代码:

Public Const testString As String = "$8995 Apr 18 2008 Honda Civic Hybrid $8995 (Orem) pic map cars & trucks - by owner "

Public Function GetYear(someText As String) As Integer
    With CreateObject("VBScript.RegExp")
        .Global = False
        .MultiLine = False
        .IgnoreCase = True
        .Pattern = " [\d]{4} "
        If .Test(testString) Then
            GetYear = CInt(.Execute(testString)(0))
        Else
            GetYear = 9999
        End If
    End With
End Function

Sub Foo()
    Debug.Print GetYear(testString) '// "2008"
End Sub