Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何检查单元格是否包含有效的IPv6地址?_Vba_Excel_Excel Formula_Ipv6 - Fatal编程技术网

Vba 如何检查单元格是否包含有效的IPv6地址?

Vba 如何检查单元格是否包含有效的IPv6地址?,vba,excel,excel-formula,ipv6,Vba,Excel,Excel Formula,Ipv6,我必须使用VBA excel检查单元格值是否为有效的IPv6地址。IPv6地址如下所示: 2001:0000:3238:DFE1:0063:0000:0000:FEFB 使用缩写形式的IPv6时出现的问题如下: dec0::0A68:0300 这也是一个有效的IPv6地址 如何正确处理此问题?如果使用Microsoft VBScript regular Expressions 5.5,则可以从中提取正则表达式,将其合并到VBA中。库(在VB编辑器中通过工具->引用找到它)。代码如下-疯狂的正则表

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

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

使用缩写形式的IPv6时出现的问题如下:

dec0::0A68:0300

这也是一个有效的IPv6地址


如何正确处理此问题?

如果使用Microsoft VBScript regular Expressions 5.5,则可以从中提取正则表达式,将其合并到VBA中。库(在VB编辑器中通过工具->引用找到它)。代码如下-疯狂的正则表达式

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
将此代码放入
模块
,然后您可以在
工作表
中使用此功能:


你能用ping键输入地址吗?如果是这样,您可以使用尝试解析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

我认为您应该使用,尽管我从未使用过它们,也不知道它们是如何工作的。再看一看。我知道如何使用正则表达式,但逻辑是问题所在,如何过滤有效的IP地址?唯一的问题是,如果我这样做,它不会过滤:dec0:,但有时不工作的模式。似乎完美的ipv6正则表达式是一个有点困惑。你可以搜索SO和internet,如果你找到了,可以插入更好的东西。我在密码里写的是一个获得了很多支持票的密码。祝你好运。很好的解决方案,谢谢。