Поскольку IP-адреса представлены в виде строк, любое сравнение будет выполнено для кодов символов ASCII, содержащих строки, которые будут возвращать нежелательные результаты, если все разделы IP-адреса не будут дополнены тремя символами с начальными нулями (например, "192.168.001.050"
).
При заполнении сравнение строк будет работать, потому что символы будут сравниваться с символами в одной и той же позиции в каждой строке, и в силу того факта, что коды символов ASCII для числовых символов являются последовательными и увеличиваются с числовыми значениями.
Для интерпретации строк в виде числового диапазона в том формате, в котором они отображаются в данный момент (т. Е. Без нулей заполнения), потребуется написать функцию для анализа каждого раздела строки, разделенной точкой, и сравнить числовое значение каждого раздела.
Одним из способов достижения этого является преобразование 4 байтов, представленных адресом IPv4, в 32-разрядное целое число (которое, к сожалению, необходимо будет представить с использованием Double, поскольку VBA не поддерживает 32-разрядные целые числа без знака), а затем просто сравнивая два числовых значения, используя стандартные реляционные операторы.
Вот краткий пример:
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
(к сожалению, VBA также не имеет оператора побитового сдвига, в противном случае это будет еще короче)
Диапазон 192.168.1.10
до 192.168.1.50
затем становится:
?IPValue("192.168.1.10")
3232235786
?IPValue("192.168.1.50")
3232235826
Который, после определения функции в общедоступном модуле, вы можете использовать в своем выражении SQL следующим образом:
UPDATE [IP Address Range] SET [IP Address Range].Division = "Local"
WHERE
IPValue([IP Address Range].[IP Addresses])
BETWEEN IPValue("192.168.1.10") AND IPValue("192.168.1.50")