【问题标题】:How to check if a cell contains valid IPv6 address?如何检查单元格是否包含有效的 IPv6 地址?
【发布时间】:2016-06-20 11:34:23
【问题描述】:

我必须使用 VBA excel 检查单元格值是否是有效的 IPv6 地址。 IPv6 地址如下所示:

2001:0000:3238:DFE1:0063:0000:0000:FEFB

像这样使用短形式的 IPv6 的问题:

dec0::0A68:0300

这也是一个有效的 IPv6 地址。

我应该如何正确处理?

【问题讨论】:

  • 我认为您应该使用Regular Expressions,尽管我从未使用过它们,也不知道它们是如何工作的。也可以看看this
  • 我知道如何使用正则表达式,但逻辑是问题,如何过滤有效的IP地址?

标签: vba excel excel-formula ipv6


【解决方案1】:

如果您使用 Microsoft VBScript 正则表达式 5.5,则可以从 thread 获取正则表达式并将其合并到 VBA 中。库(在 VB 编辑器中使用 Tools->References 找到它)。代码如下 - 疯狂的正则表达式!

Option Explicit

Function IsIPv6(ByVal strIn As String) As Boolean

    Dim objRegex As New RegExp
    Dim strPattern As String

    strPattern = "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,7}:|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|"
    strPattern = strPattern & "[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|"
    strPattern = strPattern & ":((:[0-9a-fA-F]{1,4}){1,7}|"
    strPattern = strPattern & ":)|"
    strPattern = strPattern & "fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|"
    strPattern = strPattern & "::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|"
    strPattern = strPattern & "(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|"
    strPattern = strPattern & "1{0,1}[0-9]){0,1}[0-9])|"
    strPattern = strPattern & "([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|"
    strPattern = strPattern & "(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|"
    strPattern = strPattern & "(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"

    objRegex.Pattern = strPattern
    IsIPv6 = objRegex.Test(strIn)

End Function

Sub Test()

    Debug.Print IsIPv6("2001:0000:3238:DFE1:0063:0000:0000:FEFB")
    Debug.Print IsIPv6("dec0::0A68:0300")
    Debug.Print IsIPv6("foo")

End Sub

将此代码放在Module 中,然后您可以在Worksheet 中使用此功能:

【讨论】:

  • 唯一的问题是,如果我这样做,它不是过滤器:dec0:::::::::::::::::0B58:0100 或 feeeeec0::0eeeeeeA58: 0100 所以它几乎是完美的,但有时无法正常工作。
  • 似乎完美的 ipv6 正则表达式有点令人费解。您可以搜索 SO 和互联网,如果找到它,可以插入更好的东西。我在代码中输入的代码获得了很多赞成票。祝你好运。
  • 不错的解决方案,感谢。
【解决方案2】:

你能ping地址吗?如果是这样,您可以使用Win32_PingStatus 尝试解析 IP,这适用于 IPv4、v6,甚至只是主机名。像这样的:

Function IsValidIP(strHost As String) As Boolean

Dim strQuery As String
strQuery = "select * from Win32_PingStatus where Address = '" & strHost & "'"

Dim colItems As Object
Set colItems = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)

IsValidIP = False

Dim objItem As Object
For Each objItem In colItems
    If IsObject(objItem) Then
        If objItem.PrimaryAddressResolutionStatus = 0 Then
            IsValidIP = True
            Exit Function
        Else
            'Could do select case here to handle other return codes.
        End If
    End If
Next

End Function

【讨论】:

    猜你喜欢
    • 2013-06-21
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2023-02-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多