2

我的情况

我编写此代码的主要原因是检查 IP 地址是内部连接还是外部连接。

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

“BE-ABCDDD-DDS 172.16.23.3”

我的问题

我想检查一个单元格是否在“172.31”之间包含一个 IP 地址“172.16”。在上面的示例中,它将返回一个值 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”。在这一刻。

提前致谢

4

2 回答 2

0

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

一旦引用了它,就可以使用正则表达式在字符串中搜索给定的匹配模式。这是“可能有效的 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,它应该很容易检查你的状况。

希望这可以帮助!

于 2013-02-28T10:36:13.773 回答
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
于 2013-02-28T15:00:39.917 回答