我在表格中有一个IP地址列表。我最近决定按IP地址划分它们的名称(我现在无法给出更好的名称-它们的组织单位?无论如何,无论在这里还是在那里)。
我想要做的是更新IP地址范围的划分。例如,我想更新IP地址192.168.1.10-192.168.1.50来划分Local。我知道是这样的,我只是想不通:
UPDATE [IP Address Range]
SET [IP Address Range].Division = Local
WHERE [IP Address Range].[IP Addresses] >192.168.1.10 <192.168.1.50
我在正确的轨道上吗?
答案 0 :(得分:2)
由于IP地址是用字符串表示的,所以将对包含字符串的ASCII字符代码进行任何比较,除非将IP地址的所有部分都填充为三个前导零的字符,否则将返回不希望的结果。 new_values
)。
使用填充,可以进行字符串比较,因为可以将字符与每个字符串中相同位置的字符进行比较,并且数字字符的ASCII字符代码是连续的,并且随着数字值的增加而增加。
将字符串解释为当前出现的格式(即不带填充零)的数值范围时,需要编写一个函数来解析以句点分隔的字符串的每个部分,并比较每个部分的数值。
实现此目的的一种方法是将IPv4地址表示的4个字节转换为32位整数(不幸的是,由于VBA不支持32位无符号整数,因此必须使用Double表示),然后只需使用标准关系运算符比较两个数值即可。
这是一个简单的例子:
old_values
(不幸的是,VBA也没有按位移位运算符,否则它会更短)
从"192.168.001.050"
到Function IPValue(IPAddr As String) As Double
Dim byt
Dim fac As Long: fac = 16777216
For Each byt In Split(IPAddr, ".")
IPValue = IPValue + fac * byt
fac = fac / 256
Next byt
End Function
的范围变为:
192.168.1.10
192.168.1.50
在公共模块中定义函数后,您可以按以下方式在SQL语句中使用:
?IPValue("192.168.1.10")
3232235786