【问题标题】:How to increment an IP address based on a former line?如何根据前一行增加 IP 地址?
【发布时间】:2017-03-30 07:25:52
【问题描述】:

首先,我是一个完全的 VBA 程序。我正在学习,因为我们在工作中使用了很多 excel,而且通常这些表格只是基本的,对他们来说没有任何智慧。我正在尝试制作一个简单的宏,它在工作表顶部创建一个新行,然后根据前面的行用一些空白和一些信息填充它。到目前为止一切顺利,但我现在正处于我希望它填充下一个 IP 的地步,它应该从前一行读取。到目前为止,这是我的代码,我正在努力在 Range("G2").Value = 之后填写什么,以使其增加 G3 中的 IP fround。

Sub newloc()
Range("A2").EntireRow.Insert
Range("D2").Value = "Odense C"
Range("F2").Formula = "=F3 + 1"
Range("G2").Value =
Range("H2").Formula = "=H3 + 1"

End Sub

如您所见,代码非常简单,而且我对 VBA 脚本还不太了解,请提供简单明了的答案。最好是我可以复制粘贴的东西,然后对功能进行解释,这样我就可以理解为什么它突然起作用了。

【问题讨论】:

  • 请提供您的工作表截图以清楚了解您的问题
  • 您可能必须创建一个函数来检查您可以访问的最大 IP 范围。有时您是否也不必增加1以上?似乎比像 F 和 H 列添加 1 更复杂
  • 实际上这个只需要增加 8,但这是整个事情的一个连续因素,所以我想在看到它的整体完成后自己修复它。

标签: excel vba increment


【解决方案1】:

试试这个。它最多计数到 254,然后在下一个时执行“+1”。

Sub newloc()
    Range("A2").EntireRow.Insert
    Range("D2").Value = "Odense C"
    Range("F2").Formula = "=F3 + 1"
    Range("H2").Formula = "=H3 + 1"

    Arr = Split(Range("G3").Value, ".")
    If Arr(3) = 254 Then
        Arr(3) = 1
        If Arr(2) < 254 Then
            Arr(2) = Arr(2) + 1
        Else
            Arr(2) = 1
            If Arr(1) < 254 Then
                Arr(1) = Arr(1) + 1
            Else
                Arr(1) = 1
                If Arr(0) < 254 Then
                    Arr(0) = Arr(0) + 1
                Else
                    MsgBox "Error! No more IP's available"
                End If
            End If
        End If
    Else
        Arr(3) = Arr(3) + 1
    End If

    Range("G2").Value = Join(Arr, ".")


End Sub

在上图中,我编辑了单元格以模拟更大的范围。

【讨论】:

    【解决方案2】:

    在 OP 的进一步规范之后编辑

    您可能想要使用此功能:

    Optiion Explicit
    
    Function GetNextIPAddress(baseIP As String) As String
        Dim numbersArr As Variant
        Dim iPos As Long, iNum As Long
    
        numbersArr = Split(baseIP, ".") '<--| get all numbers delimited by a "." from passed string into an array
        For iNum = UBound(numbersArr) To 0 Step -1
            If numbersArr(iNum) <> "254" Then Exit For
        Next iNum
    
        If iNum = -1 Then
            GetNextIPAddress = "Error"
        Else
            iPos = InStrRev(baseIP, numbersArr(iNum))
            GetNextIPAddress = Left(baseIP, iPos - 1) & numbersArr(iNum) + 1 & Right(baseIP, Len(baseIP) - (iPos + Len(numbersArr(iNum))) + 1)
        End If
    End Function
    

    在你的 mnain 代码中被利用如下

    Range("G2").Value = GetNextIPAddress(Range("G3").Value)
    

    【讨论】:

    • 这看起来很有希望,但这可能只是我缺乏 VB 知识,但它只会产生运行时错误 13 “类型不匹配” 我打赌这是一个简单的错误。我只是将函数放在模块开头的 sub 之外,并在 sub 内添加了 range("G2") 行
    • 1) 将整个函数代码(从Function GetNextIPAddress(baseIP As String) As StringEnd Function,包括这些)放在任何模块中以及任何其他函数或子代码之外 2) 通过以下方式在任何其他子代码中使用它诸如someRange.Value = GetNextIPAddress(someOtherRange.Value) 之类的语句,其中someRangesomeOtherRange 都必须是有效的范围引用
    • 它现在可以工作了,但与@bzimor 的帖子存在相同的问题,它不会在 254 之后增加下一个八位字节。我需要一些帮助才能使最大数字为 254,然后它会增加下一个八位字节,而不是在最后一个八位字节中继续上升。
    • 好吧,那么根据本网站规则,您应该将答案标记为已接受,因为它解决了您的 original 问题,没有提及任何“254”问题。无论如何,请参阅已编辑的帖子。但请记住,如果答案在您最初发布时确实/没有解决您的问题,请接受/不接受答案。如果出现新问题(很常见),请发新帖
    • @user3598756 他确实说过 IP。众所周知,IP 在 1->255 范围内运行(不知道他为什么要 254)。请链接到这些规则。
    【解决方案3】:

    改变了!

    把这个函数:

    Function getNextIp(getIp As String) As String
    Dim numArr As Variant
    numArr = Split(getIp, ".")
    If numArr(3) = 255 Then
        If numArr(2) = 255 Then
            If numArr(1) = 255 Then
                getNextIp = (numArr(0) + 1) & "." & "1" & "." & "1" & "." & "1"
            Else
                getNextIp = numArr(0) & "." & (numArr(1) + 1) & "." & "1" & "." & "1"
            End If
        Else
                getNextIp = numArr(0) & "." & numArr(1) & "." & (numArr(2) + 1) & "." & "1"
        End If
    Else
                getNextIp = numArr(0) & "." & numArr(1) & "." & numArr(2) & "." & (numArr(3) + 1)
    End If
    End Function
    

    之后你的代码会是这样的:

    Dim IpText As String
    Sub newloc()
       Range("A2").EntireRow.Insert
       Range("D2").Value = "Odense C"
       Range("F2").Formula = "=F3 + 1"
       IpText = Range("G3").Value
       Range("G2").Value = getNextIp(IpText)
       Range("H2").Formula = "=H3 + 1"
    
    End Sub
    

    【讨论】:

    • 为什么要使用全局变量?
    • 这是一个很好的开始,但是当 IP 到达 255 时它有点毁了,因为它应该将下一个八位字节增加 1 而不是 255。任何可能的补充来解决这个问题?
    猜你喜欢
    • 2018-12-08
    • 2011-10-08
    • 1970-01-01
    • 2018-05-07
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多