Validación de celda Dirección IP

Necesito colocarle validación a un rango de celdas para que solo puedan ingresar datos con el formato ###.###.###.### donde cada grupo separado por punto (.) no puede ser mayor a 255 (el dato es la ip de un pc).
Pensaba separar el dato mediante la función "extrae" y "encontrar", pero en el 3 grupo la fórmula ya está muy larga...
Luego pensé en utilizar macros para guardar cada dato en una variable y validar desde ahí, pero no se por donde empezar.
¿Alguien me puede dar una sugerencia?

1 Respuesta

Respuesta
1
Prueba con la siguiente fórmula en la validación:
=Y(--IZQUIERDA(A1;ENCONTRAR(".";A1)-1)<256;--(MED(SUSTITUIR(A1;".";REPETIR(" ";99));99;99))<256;--(MED(SUSTITUIR(A1;".";REPETIR(" ";99));198;99))<256;--RECORTAR(DERECHA(SUSTITUIR(A1;".";REPETIR(" ";99));99))<256)
El problema es que la fórmula admitirá signos negativos y positivos (por ejemplo, 123.123.123.+123). Complicándola más es posible filtrar uno de los dos signos. Los dos no se puede al mismo tiempo porque la fórmula excedería los 255 caracteres que permite Excel como máximo para las validaciones. Por ejemplo, para verificar que no haya signos +:
=Y(--IZQUIERDA(A1;ENCONTRAR(".";A1)-1)<256;--(MED(SUSTITUIR(A1;".";REPETIR(" ";99));99;99))<256;--(MED(SUSTITUIR(A1;".";REPETIR(" ";99));198;99))<256;--RECORTAR(DERECHA(SUSTITUIR(A1;".";REPETIR(" ";99));99))<256;ESERROR(ENCONTRAR("+";A1)))
Quizás tengas que sustituir los puntos y comas por comas, dependiendo de la configuración regional del equipo.
Ok, funciona, pero...
1. Si se colocan comas, no sale error. Para eso utilizo la siguiente macro:
Private Sub Worksheet_Change(ByVal Target As Range)
[...]
' Cambiar comas por puntos en IP
    If Target.Count = 1 Then
        If (Target.Column = 29 And Target.Row < 2002) Then
           Range(Target.Address).Replace What:=",", Replacement:="."
        End If
    End If

[...] 
End Sub
Osea que si ingresan 126,1,1,1 queda como 126.1.1.1. El problema es que la validación se hace antes de que la macro se ejecute, así que no funciona.
2. Si agregan un grupo de más no lo esta validando. Si ingresan 126.1.2.3.4 no sale error. Solo valida el 126, 1, 2 y 4. Y como cumple con los requisitos...
=Y(--IZQUIERDA(M88;ENCONTRAR(".";M88)-1)<256;--MED(SUSTITUIR(M88;".";REPETIR(" ";99));99;99)<256;--MED(SUSTITUIR(M88;".";REPETIR(" ";99));198;99)<256;--MED(SUSTITUIR(M88;".";REPETIR(" ";99));298;99)<256;MED(SUSTITUIR(M88;".";REPETIR(" ";99));398;99)="")
Pero es muy largo y no me lo acepta "Validación de datos". Sería colocar la fórmula en una celda y que el criterio de validación lo tome de esa celda.
Por ahora omitiré el caso con los signos. No quiero saturar la hoja de fórmulas, ya que debe validar 2002 registros, sin contar con las fórmulas existentes. Pero me preocupa las comas... Gracias!
De no ser por la limitación de 255 caracteres para la fórmula de la validación se podrían sustituir en la fórmula las comas por puntos, pero como la limitación existe no hay nada que se pueda hacer.
Como ya estás usando código en el libro, supongo que no te importará usar un poco más, así que creo que lo mejor es lo que tú dices: poner una función de validación en alguna columna libre y que el criterio de validación del rango AC1:AC2002 lo tome de esa columna. Por ejemplo:
Public Function ValidarIP(ByVal rCelda As Range) As Boolean
    Dim vMtr As Variant, n As Integer
    vMtr = Split(rCelda.Value, ".")
    'Comprobar que no haya más de 4 grupos
    If UBound(vMtr) - LBound(vMtr) > 4 Then
        Exit Function
    End If
    'Comprobar que ningún grupo > 255
    For n = LBound(vMtr) To UBound(vMtr)
        If CInt(vMtr(n)) > 255 Then Exit Function
    Next n
    ValidarIP = True
End Function
Uff, muy bien!
Mejor utilizo formato condicional y el siguiente módulo:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim IP As Variant, n As Integer
    Range(Target.Address).Replace What:=",", Replacement:="."
    IP = Split(Target.Offset, ".")
    'Comprobar que no la celda no esté vacía
    If Target.Offset = "" Then
        GoTo salir
    Else
        'Comprobar que no haya más de 4 grupos
        If UBound(IP) = 3 Then
            For n = LBound(IP) To UBound(IP)
                'Comprobar que ningún grupo > 255
                If CInt(IP(n)) > 255 Then
                    MsgBox "Valor " & CInt(IP(n)) & " no válido"
                    Target.Offset = ""
                    GoTo salir
                End If
            Next n
        Else
            MsgBox "IP " & Target.Offset & " no válida"
            Target.Offset = ""
            GoTo salir
        End If
    End If
salir:
End Sub

<span style="font-style: normal;">Te agradezco mucho!</span>

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas