从网上找到的,有一小点改动

Attribute VB_Name = "模块1"' 本模块代码来自 http://www.anyweb.co.nz/tutorial/excelipOption Explicit
Public Const OCTET4 As Double = 256# * 256# * 256# * 256#
Public Const OCTET3 As Double = 256# * 256# * 256#
Public Const OCTET2 As Double = 256# * 256#
Public Const OCTET1 As Double = 256#Function IPIncrease(inpIP As String, Optional inpStep As Integer) As String
' by oicu: 第二个变量是确定计算后面第几个IP/子网,删了没用到的变量Dim i As Integer, j As Integer, k As IntegerDim ipComp As VariantDim ipOctets As VariantDim ipMask As IntegerDim ipAddress As DoubleipComp = Split(inpIP, "/")k = UBound(ipComp)ipMask = 32If k = 1 ThenipMask = CInt(ipComp(1))ElseIf k <> 0 ThenReturnEnd IfIf inpStep = 0 Then inpStep = 1ipAddress = ConvertIPToDecimal(ipComp(0))ipAddress = ipAddress + inpStep * 2 ^ (32 - ipMask)IPIncrease = ConvertDecimalToIP(ipAddress)If k = 1 Then IPIncrease = IPIncrease & "/" & ipComp(1)
End FunctionFunction ConvertIPToDecimal(ByVal inpIP As String) As DoubleDim retValue As DoubleDim ipOctets As Variant, ipComp As VariantipComp = Split(inpIP, "/")If UBound(ipComp) > 0 Then inpIP = ipComp(0)retValue = 0ipOctets = Split(inpIP, ".")If UBound(ipOctets) = 3 ThenretValue = OCTET3 * CDbl(ipOctets(0)) + _OCTET2 * CDbl(ipOctets(1)) + _OCTET1 * CDbl(ipOctets(2)) + _CDbl(ipOctets(3))End IfConvertIPToDecimal = retValue
End FunctionFunction ConvertDecimalToIP(ByVal inpNum As Double) As StringDim ipOctets(3) As StringDim tempOctet As DoubleDim retValue As StringretValue = ""If inpNum < OCTET4 ThentempOctet = Int(inpNum / OCTET3)ipOctets(0) = CStr(tempOctet)inpNum = inpNum - OCTET3 * tempOctettempOctet = Int(inpNum / OCTET2)ipOctets(1) = CStr(tempOctet)inpNum = inpNum - OCTET2 * tempOctettempOctet = Int(inpNum / OCTET1)ipOctets(2) = CStr(tempOctet)inpNum = inpNum - OCTET1 * tempOctetipOctets(3) = CStr(Int(inpNum))retValue = Join(ipOctets, ".")End IfConvertDecimalToIP = retValue
End Function
Attribute VB_Name = "模块2"
Option Explicit
' Author: oicu#lsxk.org'转换点分十进制掩码为bit位数,strmask为字符型掩码,形如255.255.255.0
Function ConvertMaskBit(strMask As String) As StringDim intMask As DoubleintMask = ConvertIPToDecimal(strMask)
ConvertMaskBit = CStr(32 - Log(2 ^ 32 - intMask) / Log(2))End Function'strIP点分十进制IP,形如192.168.1.0/24,如不带掩码,1返回本身,2认为为32位掩码,3,4,5将返回空
'intcontrol,为0返回子网,1返回掩码,2返回广播地址,3返回子网取小IP,4返回子网最大IP,5返回子网可用地址数
Function SubnetMask(strIP As String, Optional intControl As Integer) As StringDim k%Dim varComp As VariantDim strSubnet As StringDim strMask As StringDim intMask As IntegerDim strBroadcast As StringApplication.Volatile'Dim buffer As String'Dim strHost As String'buffer = Trim(strIP)'intMask = Mid(buffer, InStr(buffer, "/") + 1, 2)'intMask = IIf(intMask > 32, 32, intMask)'strHost = Left(buffer, InStr(buffer, "/") - 1)varComp = Split(Trim(strIP), "/")k = UBound(varComp)intMask = 32If k = 1 ThenintMask = CInt(varComp(1))If intMask > 32 Then intMask = 32ElseIf k <> 0 ThenReturnEnd IfstrMask = ConvertDecimalToIP(2 ^ 32 - 2 ^ (32 - intMask))strSubnet = Subnet(CStr(varComp(0)), strMask)strBroadcast = ConvertDecimalToIP(2 ^ (32 - intMask) - 1)strBroadcast = Subnet(strSubnet, strBroadcast, 1)Select Case intControlCase 0  'SubnetSubnetMask = strSubnetCase 1  'Subnet MaskSubnetMask = strMaskCase 2  'BroadcastSubnetMask = strBroadcastCase 3  'Min Host IPIf intMask < 31 Then SubnetMask = IPIncrease(strSubnet, 1)Case 4  'Max Host IPIf intMask < 31 Then SubnetMask = IPIncrease(strBroadcast, -1)'SubnetMask = IPIncrease(strSubnet, 2 ^ (32 - intMask) - 2)Case 5SubnetMask = IIf(intMask < 31, CStr(2 ^ (32 - intMask) - 2), "0")'SubnetMask = CStr(WorksheetFunction.Max(2 ^ (32 - intMask) - 2, 0))End Select
End Function' 注意数组大小
' 以前版本当部门超过32767会出错,和intMask无关,是i的问题
Function Dep(strCheckIP As String, DepList As Range) As StringDim arrayResult(40000)Dim arraySubnet(40000)Dim arrayBroadcast(40000)Dim varDep As Variant' Dim varComp As Variant' Dim intMask As IntegerDim i As Long' Dim k%Application.Volatile' 每一次调用都会循环一次,不要奔溃哦,懒得改了!For i = 1 To DepList.Rows.CountarrayResult(i) = DepList.Cells(i, 1)varDep = Trim(DepList.Cells(i, 2))' varComp = Split(Trim(DepList.Cells(i, 2)), "/")' k = UBound(varComp)' intMask = 32' If k = 1 Then'     intMask = CInt(varComp(1))' ElseIf k <> 0 Then'     Return' End If' arraySubnet(i) = CStr(varComp(0))' arrayBroadcast(i) = IPIncrease(CStr(varComp(0)), 2 ^ (32 - intMask) - 1)arraySubnet(i) = SubnetMask(CStr(varDep), 0)arrayBroadcast(i) = SubnetMask(CStr(varDep), 2)If ConvertIPToDecimal(strCheckIP) >= ConvertIPToDecimal(arraySubnet(i)) And _ConvertIPToDecimal(strCheckIP) <= ConvertIPToDecimal(arrayBroadcast(i)) ThenDep = arrayResult(i)Exit Function' Else'     Dep = "-"   ' IP所属部门找不到默认设为空,需要设别的字符的在这里设End IfNext
End Function' 我添加的,strcheckIP为要查找的IP,deplist为子网地域范围,depcol为部门所在列,ipcol为子网所在列
Function getDep(strCheckIP As String, DepList As Range, depCol As Integer, ipCol As Integer) As StringDim arrayResult(40000)Dim arraySubnet(40000)Dim arrayBroadcast(40000)Dim varDep As Variant' Dim varComp As Variant' Dim intMask As IntegerDim i As Long' Dim k%Application.Volatile' 每一次调用都会循环一次,不要奔溃哦,懒得改了!For i = 1 To DepList.Rows.CountarrayResult(i) = DepList.Cells(i, depCol)varDep = Trim(DepList.Cells(i, ipCol))arraySubnet(i) = SubnetMask(CStr(varDep), 0)arrayBroadcast(i) = SubnetMask(CStr(varDep), 2)If ConvertIPToDecimal(strCheckIP) >= ConvertIPToDecimal(arraySubnet(i)) And _ConvertIPToDecimal(strCheckIP) <= ConvertIPToDecimal(arrayBroadcast(i)) ThengetDep = arrayResult(i)Exit FunctionElsegetDep = ""   ' IP所属部门找不到默认设为空,需要设别的字符的在这里设End IfNext
End FunctionFunction Subnet(strIP1 As String, strIP2 As String, Optional intControl As Integer) As StringDim strSplitIP1() As StringDim strSplitIP2() As StringDim strResult As StringDim i%strSplitIP1 = Split(strIP1, ".")strSplitIP2 = Split(strIP2, ".")'If UBound(strSplitIP1) <> 3 Or UBound(strSplitIP2) <> 3 Then Exit FunctionIf intControl = 0 ThenFor i = 0 To 3  ' 十进制可以直接进行逻辑运算strResult = strResult & CStr(strSplitIP1(i) And strSplitIP2(i)) & "."NextElseIf intControl = 1 ThenFor i = 0 To 3strResult = strResult & CStr(strSplitIP1(i) Or strSplitIP2(i)) & "."NextEnd IfSubnet = Left(strResult, Len(strResult) - 1)
End Function

模块3在模块1不可用时代替模块1

Attribute VB_Name = "模块3"
Option Explicit
' Author: oicu#lsxk.orgFunction Mask2CIDR(strMask As String) As String' 点分十进制掩码转CIDR掩码Dim CIDR As IntegerDim varMask As StringDim i%CIDR = 0varMask = IP2Bin(strMask)For i = 1 To 32CIDR = Mid(varMask, i, 1) + CIDRNextMask2CIDR = CIDR
End FunctionFunction IP2Bin(strIPAddress As String) As String  '将IP转化为32位二进制/8位二进制Dim intMod As Integer                          '这个也许还有用,把IP转为二进制表示Dim strBin As StringDim varIP As DoubleDim varComp As VariantDim k%strBin = ""' k = InStrRev(strIPAddress, ".")' k = InStr(strIPAddress, ".")varComp = Split(strIPAddress, ".")k = UBound(varComp)If k = 3 ThenvarIP = ConvertIPToDecimal(strIPAddress)ElsevarIP = CDbl(strIPAddress)End IfIf varIP = 0 Then IP2Bin = CStr(OutZero(32)): Exit FunctionDo While varIP <> 1'intMod = varIP Mod 2 '取余数Mod及整除\运算时不能超过Long的范围intMod = varIP - (Fix(varIP / 2) * 2) '溢出, 换算法varIP = Int(varIP / 2) '取整数strBin = CStr(intMod) & strBinLoopIP2Bin = "1" & strBinIf k = 3 ThenIP2Bin = OutZero(32 - Len(IP2Bin)) + IP2BinElseIP2Bin = Right(String(8, "0") & IP2Bin, 8)'IP2Bin = Replace(Space(8 - Len(IP2Bin)), " ", "0") & IP2BinEnd If
End FunctionFunction Bin2IP(strBin As String) As String  '将32位二进制数转为IP, 8位二进制转为十进制Dim i%, k%Dim dblDec As Doublek = Len(strBin)dblDec = 0For i = 1 To kdblDec = Mid(strBin, i, 1) * 2 ^ (32 - i) + dblDecNextIf k = 32 ThenBin2IP = ConvertDecimalToIP(dblDec)ElseBin2IP = dblDecEnd If
End FunctionFunction OutZero(intNum As Integer) As String  '输出n个0,上边有2个替代方法Dim i%OutZero = ""If intNum <> 0 ThenFor i = 1 To intNumOutZero = OutZero + "0"NextEnd If
End FunctionFunction Subnet2(strIP As String, strMask As String) As StringDim i%Dim varSubnet As StringDim varIP As StringDim varMask As StringvarSubnet = ""varIP = IP2Bin(strIP)varMask = IP2Bin(strMask)' vba里超出long范围后没办法按位逻辑与, 换个算法,明显这样很麻烦,不如模块2里直接And得方便' ip地址的每位二进制数与子网掩码的每位二进制数相乘For i = 1 To 32varSubnet = varSubnet & Mid(varIP, i, 1) * Mid(varMask, i, 1)NextSubnet2 = Bin2IP(varSubnet)
End FunctionFunction Subnet3(strIP As String, strMask As String) As String
'大于128.0.0.1的IP地址转成十进制后超出long范围, 不能And运算,这个函数不能使用,做反面教材的Dim varSubnet As StringDim varIP As StringDim varMask As StringvarSubnet = ""varIP = ConvertIPToDecimal(strIP)varMask = ConvertIPToDecimal(strMask)Subnet3 = ConvertDecimalToIP(varIP And varMask)
End Function

转载于:https://my.oschina.net/u/574158/blog/2990542

用于excel(或wps)中进行ip处理转换的vbs模块相关推荐

  1. excel插入html文本,带有标签的HTML文本,用于Excel单元格中的格式化文本

    你们都有有效的解决方案,而且只有少数几个你可以实现这个 . 工具需要的是正则表达式,linq,搜索引擎,vb.net或C#和互联网 . 搜索"html table to dataset&qu ...

  2. excel或者wps中 日期计算函数应用

    妹纸问我怎么实现员工劳动合同起止日期差值,于是屁颠屁颠查了查资料,实验了一番 软件环境:WPS2013个人免费版 需求说明:计算员工劳动合同终止日期与起始日期天数差值 先要讲一下基本函数 1.DATE ...

  3. python中时间格式的转换(time模块)

    1.Unix时间戳 Unix时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数.例如:xxxxxxxx.xxxxx,单位 ...

  4. 电子表格分两级:Excel和WPS是一级,未来5年,75%的人将用二级

    你印象中的电子表格软件是哪些? 估计绝大多数人,都认为电子表格软件不就是Excel和WPS吗?顶多再加上永中office么,难道还有其他的电子表格软件不成? 没有错,excel和WPS,还有永中,确实 ...

  5. 整理数据时用到的EXCEL(WPS)公式整理

    最近在整理系统基础数据(机构和人员),并把数据导入数据库,整理过程中查询使用了一些公式,为了方便自己以后学习巩固也方便他人查阅,在此把我遇到的做一个整理汇总~~废话不多开始啦 一.提取姓名中的姓(包括 ...

  6. NAT技术配置(内外网IP地址转换)

    NAT技术配置(内外网IP地址转换) 一. 什么是NAT?     NAT是将IP数据报文头中的IP地址转换成另一个IP地址的过程,主要用于实现内部地址(私有IP地址)访问外部地址(公有IP地址)的功 ...

  7. 如何在Excel/WPS表格中实现IP归属地查询?

    给您一个IP地址,您能查出它的归属地是哪座城市吗?今天小编就教给大家如何在Excel/WPS表格中使用IP归属地查询公式.使用公式前需要去腾讯位置服务申请key和Secret key,网址:腾讯位置服 ...

  8. wps怎么导入access_mysql数据库中的表格数据如何导入wps中的excel,请问该怎么去做 | excel连接access数据库...

    怎么把excel文件里的数据导入SQL数据库? 导据不一定要用OPENSET函数以用更简单的方法,步骤如下: 1.双击打sqlserver,右击需要导入数据的数据库,如图所示. 2.点击任务,再点击任 ...

  9. 5 个用于在 Linux 终端中查找域名 IP 地址的命令

    5 个用于在 Linux 终端中查找域名 IP 地址的命令 本教程介绍了如何在 Linux 终端验证域名或计算机名的 IP 地址.本教程将允许你一次检查多个域.你可能已经使用过这些命令来验证信息.但是 ...

最新文章

  1. 嵌入式linux hdmi分辨率,【Firefly3399Pro】rk3399pro在Framebuffer状态命令行模式中强制HDMI输出固定分辨率...
  2. idea dump分析工具_实战:OOM 后我如何分析解决的
  3. 2打开md文件_File Cabinet Pro for Mac(菜单栏文件管理器)
  4. linux pstree乱码,pstree下显示乱码解决
  5. 面向对象的三大特征,封装、继承、多态的个人理解以及代码分析
  6. 第五十六期:百度CTO王海峰CNCC2019演讲:深度学习平台支撑产业智能化
  7. Ghost 基于 Node.js 构建的开源博客平台
  8. Mybatis: 接口编程的实现
  9. JAVA POI读取Excel中Cell为null的处理
  10. C# 将彩色PDF转为灰度
  11. 分享:映像编辑工具Ghostexp
  12. java获取本机物理ip地址吗_Java获取本机所有ip地址
  13. python 通达信公式函数,python使用通达信公式,请人用python编写如下公式,我对编程一窍不通...
  14. 内存超频时序怎么调_憋了很久的问题:内存时序有什么用?超频时怎么调?
  15. xs2鸿蒙系统,华为Mate XS2来了,搭载麒麟9000,依旧安卓10版本
  16. ARVR | 5大AR应用程序开发工具简介
  17. cmakeLists.txt中增加-g选项不生效/gcc -s参数
  18. 429. N 叉树的层序遍历 c++ 队列
  19. 【cartographer_ros】一 : ros系统下的快速安装
  20. 马斯克再次在推特闯祸 年产50万辆电动汽车推文涉嫌违反和解协议

热门文章

  1. 小红书话题笔记是什么意思?话题笔记发布步骤流程分享
  2. 微信授权登录,authorize不执行;uniapp 获取用户信息权限失败;无法通过wx.getUserInfo与<button open-type=“getUserInfo“/>获取用户个人信息
  3. Xgboost实践 | 第一名天池o2o优惠券的使用预测思路完整版
  4. Mysql- --DQl语句(select数据查询语言,多表查询,View试图)linux常用(重点)
  5. android应用程序隐私设置在哪,手机权限设置在哪里_手机设置应用软件权限的具体步骤...
  6. 20201203 aaaaabbbbbccccc
  7. 前端练手项目 HTML 游戏叠高塔(包含源码)
  8. 解决Macbook互联网不能共享 因为它是受802.1X保户问题
  9. HTML/CSS+JavaScript+jQuery
  10. c++ mupdf 提取pdf文件里面图片