2016-04-01 10 views
-1

Ich behalte eine Tabelle mit allen meinen IP-Adressen in meinem Heimnetzwerk. Ich habe einen Umfang von 50 Adressen für die statische Konfiguration festgelegt und von denen habe ich ein paar "Gruppen" für bestimmte Arten von Geräten wie Computer oder Media Player NAS etc. definiert. Aus diesem Grund habe ich ungenutzte Adressen zwischen anderen, die mich führt zu meiner eigentlichen Frage. Wie schreibe ich eine Formel in Excel, die die verfügbaren Adressen bestimmt und auch möchte ich die nächste und dritte verfügbare Adresse auch, die ich durch eine Dezimalzahl wie 1 oder 2 oder 3Berechnen von unbenutzten IP-Adressen in Excel

enter image description here begrenzen würde

Antwort

0

Sie könnten dies auf ein paar sehr kreative Weisen tun, ich bin nicht sehr gut mit Formeln, aber wenn VBA in Ordnung ist, kann ich das tun.

Public Sub GetIPs() 

Dim RngArr As Variant 
Dim IPRange(0 To 255) As Boolean 'you may want to change this to account for reserved IPs 
Dim Rw As Long 
Dim Results As Worksheet 

RngArr = Sheet1.UsedRange.Columns("A:C").Value 

If Not IsArray(RngArr) Then Exit Sub 'make sure we have more than 1 cell of data 

For Rw = LBound(RngArr, 1) To UBound(RngArr, 1) 
    If RngArr(Rw, 2) Like "*.*.*.*" Then 'Just a very simple wilcard search for an IP 
     IPRange(CByte(Split(RngArr(Rw, 2), ".")(3))) = True 'set IPRange to true on the index/IP number 
    End If 
Next Rw 

Set Results = ThisWorkbook.Sheets.Add 

For Rw = LBound(IPRange, 1) To UBound(IPRange, 1) 
    Results.Cells(1 + Rw, 1).Value = "192.168.1." & Rw 
    If IPRange(Rw) = True Then 
     Results.Cells(1 + Rw, 2).Value = "Taken" 
    Else 
     Results.Cells(1 + Rw, 2).Value = "Available" 
    End If 
Next Rw 
End Sub 

Dies setzt voraus, Ihr Blatt ist (Codename) Sheet1 (das ist der Name es in den VBA-Fenstern Eigenschaften hat) entsprechend ändern. Es geht auch davon aus, dass Ihre IP-Daten in den Spalten B ein neues Blatt mit einer Liste aller genommenen und verfügbaren IP-Adressen erstellen, bearbeiten Sie einfach wie benötigt.

+0

Dies ist eine Art von was ich betrachtete, wenn dies auf eine Weise funktionieren könnte, dass ich die erste zweite und dritte verfügbare IP hätte, wäre ich perfekt.Ich habe versucht, es mit einer vlookup und if-Anweisung (getrennt und zusammen als eine Formel) zu verwenden, aber ich konnte kein Argument erhalten, das erste, zweite oder dritte – Henk

+0

gut, wenn Sie diese Methode verwenden wollten, können Sie entweder einfach die Schleife Taken/Available Spalte und listet die verfügbaren IPs auf, oder ändern Sie einfach den ursprünglichen Code (die letzte Schleife), um Taken IPS zu ignorieren und stattdessen die verfügbaren IPs aufzulisten –

0

Ich habe einige IP (sowohl IPv4 und IPv6) Routinen für Excel erstellt. Ich habe einen, SubnetIPv4(IPv4 As String, Bits As Integer, Offset As Long) As String:

Warnung: Ich schuf diese als schnell-und-schmutzige Lösungen, und ich habe sie seit mehreren Jahren nicht verwendet.

Dies ist eine gemeinsame Funktion für die anderen Funktionen:

Function CountStr(Source As String, Target As String) As Integer 
    Dim c, i As Integer 
    c = 0 
    If Not ((Source = "") Or (Target = "")) Then 
     For i = 1 To Len(Source) 
      If Mid(Source, i, Len(Target)) = Target Then 
       c = c + 1 
      End If 
     Next 
    End If 
    CountStr = c 
End Function 

IPv4:

Hinweise:

  1. Makros müssen
  2. IPv4 ist ein String aktiviert sein, Darstellen einer IPv4-Adresse in Dezimalpunkt Format
  3. Bits eine ganze Zahl (0 bis 32), die die Anzahl von Maskenbits
  4. Offset ist eine ganze Zahl, die die Host-Adresse in das Subnetz Offset
  5. Verwenden 0 Offset wird ein Teilnetz für jede IP-Adresse zurück
  6. Verwendung einer IPv4-Adresse 255.255.255.255 und 0 Offset wird eine Maske von Bits Größe

Diese Funktion zurück, wenn der str bestimmen ing eine IPv4-Adresse:

Function IsIPv4(IPv4 As String) As Boolean 
    Dim s As String 
    On Error GoTo InvalidIPv4 
    s = SubnetIPv4(IPv4, 32, 0) 
    IsIPv4 = True 
    Exit Function 
InvalidIPv4: 
    IsIPv4 = False 
End Function 

Diese Funktion wird eine IPv4-Adresse zurück:

Function SubnetIPv4(IPv4 As String, Bits As Integer, Offset As Long) As String 
    Dim a() As String 
    Dim c, d, i As Integer 
    Dim m As Long 
    Dim s As String 
    If IPv4 = "" Then 
     GoTo InvalidIPv4 
    End If 
    c = CountStr(IPv4, ".") 
    If c <> 3 Then 
     GoTo InvalidIPv4 
    End If 
    c = CountStr(IPv4, "..") 
    If c > 1 Then 
     GoTo InvalidIPv4 
    End If 
    If (Left(IPv4, 1) = ".") Or (Right(IPv4, 1) = ".") Then 
     GoTo InvalidIPv4 
    End If 
    a = Split(IPv4, ".") 
    If UBound(a) <> 3 Then 
     GoTo InvalidIPv4 
    End If 
    On Error GoTo InvalidIPv4 
    For i = 0 To 3 
     If (Len(a(i)) > 0) And (Len(a(i)) < 4) Then 
      a(i) = CInt(a(i)) 
      If (a(i) < 0) Or (a(i) > 255) Then 
       GoTo InvalidIPv4 
      End If 
     Else 
      GoTo InvalidIPv4 
     End If 
    Next 
    If (Bits < 0) Or (Bits > 32) Then 
     GoTo InvalidIPv4 
    End If 
    c = Bits Mod 8 
    d = Bits \ 8 
    If (Bits <> 0) And (c = 0) Then 
     c = 8 
     d = d - 1 
    End If 
    m = 0 
    For i = 0 To 7 
     m = m * 2 
     If c > 0 Then 
      m = m + 1 
      c = c - 1 
     End If 
    Next 
    a(d) = CStr(CLng(a(d)) And m) 
    For i = d + 1 To 3 
     a(i) = "0" 
    Next 
    If Offset < 0 Then 
     GoTo InvalidIPv4 
    End If 
    m = 0 
    For i = 1 To (32 - Bits) 
     m = m * 2 
     m = m + 1 
    Next 
    If Offset > m Then 
     GoTo InvalidIPv4 
    End If 
    m = Offset 
    For i = 3 To 0 Step -1 
     a(i) = a(i) + (m Mod 256) 
     m = m \ 256 
    Next 
    s = "" 
    For i = 0 To 3 
     s = s + CStr(a(i)) + "." 
    Next 
    s = Left(s, Len(s) - 1) 
    SubnetIPv4 = s 
    Exit Function 
InvalidIPv4: 
    Error (3) 
End Function 

IPv6:

Hinweise:

  1. Makros muss aktiviert sein
  2. IPv6 ist eine Zeichenfolge eine IPv6-Adresse darstellt, die in Standardformat (führenden 0s sind optional und :: works)
  3. Bits eine ganze Zahl (0 bis 128), die die Anzahl von Maskenbits
  4. ein String Offset ist die Host-Adresse darstellt Offset in die Subnetz im Standardformat (führende 0-en sind optional und :: Werke)
  5. Verwendung entsprechender Offset zu 0 (::, ::0, 0:0:0:0:0:0:0:0 usw.)
  6. Verwendung einer IPv6-Adresse 0 ein Subnetz für jede IP-Adresse zurückund Offset entspricht 0 eine Maske von Bits Größe zurück

Diese Funktion wird ermittelt, ob der String-Adresse eine IPv6 ist:

Function IsIPv6(IPv6 As String) As Boolean 
    Dim s As String 
    On Error GoTo InvalidIPv6 
    s = SubnetIPv6(IPv6, 128, "::") 
    IsIPv6 = True 
    Exit Function 
InvalidIPv6: 
    IsIPv6 = False 
End Function 

Diese Funktion eine IPv6-Adresse wird zurückkehren:

Function SubnetIPv6(IPv6 As String, Bits As Integer, Offset As String) As String 
    Dim a() As String 
    Dim c, d, i As Integer 
    Dim m As Long 
    Dim s, t As String 
    If IPv6 = "" Then 
     GoTo InvalidIPv6 
    End If 
    c = CountStr(IPv6, ":") 
    If (c < 2) Or (c > 8) Then 
     GoTo InvalidIPv6 
    End If 
    d = CountStr(IPv6, "::") 
    If d > 1 Then 
     GoTo InvalidIPv6 
    End If 
    If (Left(IPv6, 1) = ":") And (Not (Left(IPv6, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 
    If (Right(IPv6, 1) = ":") And (Not (Right(IPv6, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 
    s = IPv6 
    If d = 1 Then 
     If Left(s, 2) = "::" Then 
      s = "0" + s 
     End If 
     If Right(s, 2) = "::" Then 
      s = s + "0" 
     End If 
     t = ":" 
     For i = c To 7 
      t = t + "0:" 
     Next 
     s = Replace(s, "::", t) 
    End If 
    a = Split(s, ":") 
    If UBound(a) <> 7 Then 
     GoTo InvalidIPv6 
    End If 
    On Error GoTo InvalidIPv6 
    For i = 0 To 7 
     If (Len(a(i)) > 0) And (Len(a(i)) < 5) Then 
      a(i) = WorksheetFunction.Hex2Dec(a(i)) 
     Else 
      GoTo InvalidIPv6 
     End If 
    Next 
    If (Bits < 0) Or (Bits > 128) Then 
     GoTo InvalidIPv6 
    End If 
    c = Bits Mod 16 
    d = Bits \ 16 
    If (Bits <> 0) And (c = 0) Then 
     c = 16 
     d = d - 1 
    End If 
    m = 0 
    For i = 0 To 15 
     m = m * 2 
     If c > 0 Then 
      m = m + 1 
      c = c - 1 
     End If 
    Next 
    a(d) = CStr(CLng(a(d)) And m) 
    For i = d + 1 To 7 
     a(i) = "0" 
    Next 
    If Offset = "" Then 
     GoTo InvalidIPv6 
    End If 
    c = CountStr(Offset, ":") 
    If (c < 2) Or (c > 8) Then 
     GoTo InvalidIPv6 
    End If 
    d = CountStr(Offset, "::") 
    If d > 1 Then 
     GoTo InvalidIPv6 
    End If 
    If (Left(Offset, 1) = ":") And (Not (Left(Offset, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 
    If (Right(Offset, 1) = ":") And (Not (Right(Offset, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 
    s = Offset 
    If d = 1 Then 
     If Left(s, 2) = "::" Then 
      s = "0" + s 
     End If 
     If Right(s, 2) = "::" Then 
      s = s + "0" 
     End If 
     t = ":" 
     For i = c To 7 
      t = t + "0:" 
     Next 
     s = Replace(s, "::", t) 
    End If 
    b = Split(s, ":") 
    If UBound(b) <> 7 Then 
     GoTo InvalidIPv6 
    End If 
    On Error GoTo InvalidIPv6 
    For i = 0 To 7 
     If (Len(b(i)) > 0) And (Len(b(i)) < 5) Then 
      b(i) = WorksheetFunction.Hex2Dec(b(i)) 
     Else 
      GoTo InvalidIPv6 
     End If 
    Next 
    c = Bits Mod 16 
    d = Bits \ 16 
    If (Bits <> 0) And (c = 0) Then 
     c = 16 
     d = d - 1 
    End If 
    m = 0 
    For i = 0 To 15 
     m = m * 2 
     If c > 0 Then 
      m = m + 1 
      c = c - 1 
     End If 
    Next 
    For i = 0 To d - 1 
     If b(i) <> "0" Then 
      GoTo InvalidIPv6 
     End If 
    Next 
    If b(d) <> CStr(CLng(b(d)) And m) Then 
     GoTo InvalidIPv6 
    End If 
    For i = 7 To d Step -1 
     a(i) = CStr(CLng(a(i)) + CLng(b(i))) 
    Next 
    s = "" 
    For i = 0 To 7 
     s = s + WorksheetFunction.Dec2Hex(a(i)) + ":" 
    Next 
    s = Left(s, Len(s) - 1) 
    SubnetIPv6 = s 
    Exit Function 
InvalidIPv6: 
    Error (3) 
End Function 
Verwandte Themen