Numeración automática de 3 condiciones

Hola expertos, tengo una duda y acudo a vosotros ya que no puedo resolverla por mi mismo.
Tengo tres columnas ( A B C) que se corresponden a las coordenadas POR Y y Z de un punto en el espacio.
Tengo un listado de coordenadas en las cuales se repiten varias veces las mismas coordenadas.
Hasta ahora numeraba los puntos a mano, haciendo autofiltro y activando uno por uno para saber los que se repetían, pero debido al numero de puntos ya no es viable.
En resumen, necesito una orden que me identifique las tres coordenadas de cada fila y la numere si no se repiten anteriormente, y si se repite darle el valor que se le dio anteriormente...
Pondré un breve ejemplo:
A B C D
1 1 1 1
0.25 1 1 2
3 2 1.5 3
1 1 1 1
En la columna DE pocría la numeración automática. Como A4 B4 C4 coinciden los valores con A1 B1 C1, numero estas tres coordenadas como 1 (D4)
Espero vuestra sabia respuesta.
Un saludo.

1 Respuesta

Respuesta
1
Te dejo un procedimiento que hace lo que buscas. Espero que te sirva bien.
Un saludo
Option Explicit
Sub numerarCeldas()
    Dim numFilas As Long
    Dim i As Long
    Dim j As Long
    Dim n As Long
    ' Buscamos el número de filas que tiene la tabla
numFilas = buscarUltimoNumeroFila()
    ' Definimos unas matrices para almacenar los valores
    ReDim matDatos(1 To numFilas, 1 To 3) As Double
    ReDim matNum(1 To numFilas) As Long
    ' Leemos los datos
    For i = 1 To numFilas
        matDatos(i, 1) = Cells(i, 1)
        matDatos(i, 2) = Cells(i, 2)
        matDatos(i, 3) = Cells(i, 3)
    Next i
    ' Asignamos un valor a cada fila
    n = 0
    For i = 1 To numFilas
        For j = 1 To i - 1  ' Comprobamos si ya existe
            If matDatos(i, 1) = matDatos(j, 1) And _
               matDatos(i, 2) = matDatos(j, 2) And _
               matDatos(i, 3) = matDatos(j, 3) Then Exit For
        Next j
        If j > i - 1 Then
            ' No hay otra igual
            n = n + 1
            matNum(i) = n
          Else
            ' Está repetido
            matNum(i) = matNum(j)
        End If
    Next i
    ' Ponemos los valores en la columna D
    For i = 1 To numFilas
        Cells(i, 4) = matNum(i)
    Next i
End Sub
Private Function buscarUltimoNumeroFila() As Long
    Dim i As Long
    i = 1
    Do While Cells(i, 1) <> ""
        i = i + 100
    Loop
    Do While Cells(i, 1) = ""
        i = i - 1
        If i = 0 Then Exit Do
    Loop
    buscarUltimoNumeroFila = i
End Function
Perfecto! Gracias por la macro, no podía adaptarse mejor a mis cálculos.
Quisiera hacerte una consulta más.
Estas coordenadas son el inicio y fin de las aristas de una figura geométrica.
Necesito ordenar de menor a mayor el orden de los nudos, ejemplo
G H I
1 1 2
2 2 3
3 5 7
En la columna G (aristas), en H(nudo1) y en I (nudo 2) se deben de ordenar los datos obtenidos en la macro anterior,
¿Se podría implementar esto en dicha macro?
He intentado hacer esto con la orden Buscarh (BUSCARV($G2;$D$2:$E$241;2;1) pero solo me encuentra un valor (el primero que encuentra).
Muchísimas gracias.
Un saludo.
Supongo que sería ordenar la matriz. Pero hay que tener en cuenta que, una vez ordenados los datos, hay que reescribir tu tabla.
El código completo sería algo así:
Option Explicit
Sub numerarCeldas()
    Dim numFilas As Long
    Dim i As Long
    Dim j As Long
    Dim n As Long
    ' Buscamos el número de filas que tiene la tabla
numFilas = buscarUltimoNumeroFila()
    ' Definimos unas matrices para almacenar los valores
    ReDim matDatos(1 To numFilas, 1 To 3) As Double
    ReDim matNum(1 To numFilas) As Long
    ' Leemos los datos
    For i = 1 To numFilas
        matDatos(i, 1) = Cells(i, 1)
        matDatos(i, 2) = Cells(i, 2)
        matDatos(i, 3) = Cells(i, 3)
    Next i
    ' Ordenamos los datos
    ordenarDatosMatriz matDatos()
    ' Asignamos un valor a cada fila
    n = 0
    For i = 1 To numFilas
        For j = 1 To i - 1  ' Comprobamos si ya existe
            If matDatos(i, 1) = matDatos(j, 1) And _
               matDatos(i, 2) = matDatos(j, 2) And _
               matDatos(i, 3) = matDatos(j, 3) Then Exit For
        Next j
        If j > i - 1 Then
            ' No hay otra igual
            n = n + 1
            matNum(i) = n
          Else
            ' Está repetido
            matNum(i) = matNum(j)
        End If
    Next i
    ' Ponemos los valores en la columna D
' (ahora también escribimos los datos de las columnas A, B y C
    For i = 1 To numFilas
        Cells(i, 1) = matDatos(i, 1)
        Cells(i, 2) = matDatos(i, 2)
        Cells(i, 3) = matDatos(i, 3)
        Cells(i, 4) = matNum(i)
    Next i
End Sub
Private Function buscarUltimoNumeroFila() As Long
    Dim i As Long
    i = 1
    Do While Cells(i, 1) <> ""
        i = i + 100
    Loop
    Do While Cells(i, 1) = ""
        i = i - 1
        If i = 0 Then Exit Do
    Loop
    buscarUltimoNumeroFila = i
End Function
Sub ordenarDatosMatriz(ByRef matDatos() As Double)
    Dim i As Integer
    Dim j As Integer
    Dim n As Integer
    Dim aux As Double
    Dim snCambiar As Boolean
    n = UBound(matDatos, 1)
    For i = 1 To n - 1
        For j = 1 To n - i
            ' Cambiaremos si el primer valor es mayor que el primer valor de la siguiente
            ' fila o, siendo igual, el segundo valor es mayor que el de la siguente fila
            ' o, siendo los dos primeros iguales, el tercer valor de la fila es mayor que
            ' el tercer valor de la fila siguiente.
            snCambiar = matDatos(j, 1) > matDatos(j + 1, 1) Or _
                       (matDatos(j, 1) = matDatos(j + 1, 1) And _
                        matDatos(j, 2) > matDatos(j + 1, 2)) Or _
                       (matDatos(j, 1) = matDatos(j + 1, 1) And _
                        matDatos(j, 2) = matDatos(j + 1, 2) And _
                        matDatos(j, 3) > matDatos(j + 1, 3))
            If snCambiar Then
                aux = matDatos(j, 1)
                matDatos(j, 1) = matDatos(j + 1, 1)
                matDatos(j + 1, 1) = aux
                aux = matDatos(j, 2)
                matDatos(j, 2) = matDatos(j + 1, 2)
                matDatos(j + 1, 2) = aux
                aux = matDatos(j, 3)
                matDatos(j, 3) = matDatos(j + 1, 3)
                matDatos(j + 1, 3) = aux
            End If
        Next j
    Next i
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas