Calcular distancia (filas) entre dos mismos valores en una tabla


0

Tengo un código VBA para calcular la distancia entre dos celdas con los mismos valores en una tabla. Solo necesito la diferencia de fila entre las celdas que pueden estar en diferentes columnas como se ve en la imagen. Solo necesito distancia en el eje "Y", no en el eje "X". Este código tiene la funcionalidad y el diseño que necesito, pero también calcula la distancia en el eje "X".

En la imagen de ejemplo a continuación, en la columna B, B5: Central coincide con el más cercano (abajo) B12: Central , y la distancia (el número de filas entre ellos) es 6. Y en E1: 250 coincide con el G16 más cercano : 250 , y la distancia es 13.

ingrese la descripción de la imagen aquí

El código que tengo es este:

Option Explicit

Sub main()
    Dim cell As Range, f As Range
    Dim rowOffset As Long

    With Worksheets("gaps").Range("A2:F10") '<--| change this to your actual range of interest
        For Each cell In .SpecialCells(xlCellTypeConstants, xlNumbers)
            rowOffset = 1
            Set f = .Find(what:=cell, after:=cell, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious)
            If Not f Is Nothing And f.Row <= cell.Row Then rowOffset = cell.Row - f.Row + 1
            cell.offset(, .Columns.Count + 1) = rowOffset '<--| the "+1" offset results range one column away from values range: adjust it as per your needs
        Next cell
    End With
End Sub

Respuestas:


1

Calcule las filas

Sub main4()
Dim cell As Range, f As Range
Dim RowOffset As String
With Worksheets("gaps").Range("A2:F10") '<--| change this to your actual range of interest
    For Each cell In .SpecialCells(xlCellTypeConstants, xlNumbers)
        RowOffset = "na"
        Set f = .Find(what:=cell, after:=cell, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlNext)
        If (f.Row <> cell.Row) Or (f.Row <> cell.Row) Then RowOffset = f.Row - cell.Row
        cell.Offset(, .Columns.Count + 1) = RowOffset '<--| the "+1" offset results range one Row away from values range: adjust it as per your needs
    Next cell
End With
End Sub

calcular columnas

Sub main2()
Dim cell As Range, f As Range
Dim ColOffset As String
With Worksheets("gaps").Range("A2:F10") '<--| change this to your actual range of interest
    For Each cell In .SpecialCells(xlCellTypeConstants, xlNumbers)
        ColOffset = "na"
        Set f = .Find(what:=cell, after:=cell, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlNext)
        If (f.Column <> cell.Column) Or (f.Row <> cell.Row) Then ColOffset = f.Column - cell.Column
        cell.Offset(, .Columns.Count + 1) = ColOffset '<--| the "+1" offset results range one column away from values range: adjust it as per your needs
    Next cell
End With
End Sub

O incluso mejor, puede indicar tanto la fila como la columna en la celda:

Sub main3()
Dim cell As Range, f As Range
Dim Offset As String

With Worksheets("gaps").Range("A2:F10") '<--| change this to your actual range of interest
    For Each cell In .SpecialCells(xlCellTypeConstants, xlNumbers)
        Offset = "na"
        Set f = .Find(what:=cell, after:=cell, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlNext)
        If (f.Column <> cell.Column) Or (f.Row <> cell.Row) Then Offset = (f.Column - cell.Column) & ";" & (f.Row - cell.Row)
        cell.Offset(, .Columns.Count + 1) = Offset '<--| the "+1" offset results range one column away from values range: adjust it as per your needs
    Next cell
End With
End Sub

Gracias por sus sugerencias Los probé a los dos. El primero es lo que realmente necesito. pero produce muchos NA, -1, -2, 1,0,2. Creo que también coincide con dígitos individuales con números de dos dígitos. Por ejemplo, parece coincidir 2 con 12, o 20 etc. Busco una coincidencia exacta y cuando el código la encuentra, trae el número de filas entre la celda principal y la celda objetivo.
user761065

si usa main3 () podrá localizar exactamente qué celda coincide con qué celda. por favor da las dos coincidencias que no funcionan. (funciona bien de mi lado y "na" no se encuentra para ningún partido)
Jonathan

Preparé un libro de datos de muestra 1drv.ms/x/s!AoGkZUHlKui9gQ8NBaB1fllfYkXi Aquí puede ver los resultados que obtengo para main2 y los resultados esperados para las dos primeras filas.
user761065

¿Cómo se calcula 10 en O2
Jonathan

C2: 3 y C13: 3, entre ellos 10 filas. Actualicé la imagen en la pregunta, se muestra allí.
user761065

0

Aquí hay una solución que encontré para este problema que aborda los problemas que tenía en los códigos ofrecidos.

Sub Intervals()
    Dim r As Range, c As Range
    With Cells(1).CurrentRegion
        With .Offset(1).Resize(.Rows.Count - 1)
            For Each r In .Cells
                Set c = .Find(r.Value, r, , 1, , , 2)
                If (c.Address <> r.Address) * (c.Row > r.Row) Then
                    r.Offset(, 13) = c.Row - r.Row - 1
                Else
                    r.Offset(, 13) = "na"
                End If
            Next
        End With
    End With
End Sub 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.