Excel VBA检查InStr函数中的值

时间:2013-02-28 10:16:46

标签: excel vba

我的情况

我制作此代码的主要原因是检查IP地址是实习连接还是外部连接。

我的数据表中的单元格不仅包含IP地址值,还可以包含其他类型的文本。 F.E. :

“BE-ABCDDD-DDS 172.16.23.3”

我的问题

我想检查一个单元格是否包含“172.31”之间的“172.16”的IP地址 在上面的示例中,它将返回值true / Intern。如果单元格的值为 “172.32”将返回false / extern。

这是我的代码:

For Each source In Range("E6", Range("E" & Rows.Count).End(xlUp))      
    If (InStr(source, "-10.") <> 0 Or InStr(source, "-192.168.") <> 0 Or InStr(source, "-  172.") <> 0) And InStr(source.Offset(0, 22).Value, "Extern") = 0 Then
source.Offset(0, 22) = "Intern"
    End If
Next source

正如您在我的代码中所看到的,它仅检查“172”。此刻。

提前致谢

2 个答案:

答案 0 :(得分:0)

我强烈建议使用正则表达式。如果您使用的是VBA,则可以在VBA项目中引用Microsoft VBScript Regular Expressions库。

一旦引用了引用,就可以使用正则表达式搜索字符串以查找给定的匹配模式。下面是“可能有效的IP字符串”的示例VBScript正则表达式友好表达式:\ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3}

这将匹配一个序列为4,1-3位数字的字符串,其中包含句点,例如127.0.0.1但也可能是955.556.234.234。所以一旦你有一个匹配的字符串,我会在你认为IP'有效'之前验证代码中的ip组件。一旦你拥有一个有效的IP,就应该检查一下你的情况。

希望这有帮助!

答案 1 :(得分:0)

您可以/应该将该测试分解为自己的功能。这是一个解析字符串的例子。

Sub Main()

    Dim rCell As Range

    For Each rCell In Sheet1.Range("A1:A5").Cells
        If IsInternal(rCell.Value) Then
            Debug.Print rCell.Address, rCell.Value
        End If
    Next rCell

End Sub

Public Function IsInternal(sIpAdd As String) As Boolean

    Dim bReturn As Boolean
    Dim lIpStart As Long
    Dim lSecQuad As Long

    Const sIPSTART As String = "172."
    Const lMIN As Long = 16
    Const lMAX As Long = 31

    'Default to false unless we explictly set it to true
    bReturn = False

    'See if 172. exists in the string
    lIpStart = InStr(1, sIpAdd, sIPSTART)

    'If 172. exists
    If lIpStart > 0 Then
        'Parse out the second quadrant
        lSecQuad = Val(Mid(sIpAdd, lIpStart + Len(sIPSTART), 2))

        'See if the second quadrant is in range
        'and set to true if so
        bReturn = lSecQuad >= lMIN And lSecQuad <= lMAX
    End If

    IsInternal = bReturn

End Function