Macro que guarde fórmula en una variable, por ejemplo buscarv y ejecute en todos las filas que estén en blanco

Expertos buenas tardes:

Resulta que estoy trabajando un archivo de excel, que tiene aprox. 300.000 mil registros, por lo tanto hace que si trato de hacer un buscarv y lo copio para todas las filas, dura calculando como 3 horas, mi pregunta es la siguiente, es posible por ejemplo hacer una macro que guarde la fórmula en una variable por ejemplo ese buscarv, y lo corra por todas las celdas que estén en blanco ejemplo de la columna "c", y me pegue solamente el resultado, no necesito que deje la fórmula en la celda, solo el resultado, ¿mi segunda pregunta es... Es verdad que de esta manera es mucho más rápido?, colocando el resultado del calculo que se hace desde vba, y no formulando desde el mismo excel, ¿cuándo el numero de inf es tan grande? Gracias...

Respuesta
1

Con VBA podría ser más rápido, ya que una vez puesto el resultado, ya no se vuelve a recalcular, con las fórmulas cada vez que insertar una fórmula todas las fórmulas se recalculan.

Envíame una muestra de tu archivo y me dices en en qué columna tienes el buscarv y me pones un ejemplo del resultado, explícame con colores y con comentarios.

Recuerda enviar solamente una muestra.

Hola Dnate ya te envie el archivo para tu revisión , grácias

Te envié el archivo con 2 opciones, prueba cuál de las 2 macros es más rápida.

Sub macro1()
'Por.Dante Amor
    Application.ScreenUpdating = False
    u = Range("A" & Rows.Count).End(xlUp).Row
    Set r = Range("A1:A" & u)
    For i = 2 To u
        If Cells(i, "E") = "" Then
            cad = Cells(i, "B") & Cells(i, "C") & Cells(i, "D")
            Set b = r.Find(cad, lookat:=xlWhole)
            If Not b Is Nothing Then
                Cells(i, "E") = Cells(b.Row, "E")
                Cells(i, "F") = Cells(b.Row, "F")
            End If
        End If
    Next
End Sub

Opción 2

Sub macro2()
'Por.Dante Amor
    Application.ScreenUpdating = False
    u = Range("A" & Rows.Count).End(xlUp).Row
    Range("E2:F" & u).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
    Range("E2:F" & u).Copy
    Range("E2").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
End Sub

Hola dante te respondí el mail, aun no cierro la pregunta vale... gracias

Tienes que enviarme ejemplos reales.

Si, señor, no supe expresarme, ya te envíe el archivo con la info real, muchas gracias

Te anexo otra macro. En mis pruebas la macro dura 2 minutos, revisé algunos resultados.

Revisa todos los resultados y dime si es lo que necesitas.

Sub BuscarNit()
'Por.Dante Amor
    Application.ScreenUpdating = False
    '
    u = Range("F" & Rows.Count).End(xlUp).Row
    With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("A2:A" & u), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("E2:E" & u), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("F2:F" & u), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A1:G" & u)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Columns("H").ClearContents
    Columns("C").Replace What:="#N/A", Replacement:=""
    '
    n = 2
    For i = 2 To u
        If Cells(i, "C") = "" Then
            Application.StatusBar = i & " de " & u
            una = True
            sigue = False
            Set r = Range("F" & n & ":F" & i - 1)
            Set b = r.Find(Cells(i, "F"), LookAt:=xlWhole)
            If Not b Is Nothing Then
                ncell = b.Address
                If b.Row <> i Then
                    Do
                        If Cells(b.Row, "A") = Cells(i, "A") And _
                            Cells(b.Row, "E") = Cells(i, "E") Then
                            If una Then
                                nit = Cells(b.Row, "C")
                                nom = Cells(b.Row, "D")
                                una = False
                                sigue = True
                            Else
                                If nit <> Cells(b.Row, "C") Then
                                    sigue = False
                                    Exit Do
                                End If
                            End If
                        End If
                        Set b = r.FindNext(b)
                    Loop While Not b Is Nothing And b.Address <> ncell And b.Row <> i
                End If
                If sigue Then
                    Cells(i, "C") = nit
                    Cells(i, "D") = nom
                    Cells(i, "H") = "Completado"
                Else
                    Cells(i, "H") = "Tiene varios NIT"
                End If
            End If
            n = i
        End If
    Next
    Application.StatusBar = False
    Application.ScreenUpdating = True
    MsgBox "Proceso terminado"
End Sub

Saludos.Dante Amor

Si es lo que necesitas. No olvides valorar la respuesta.

Queda pendiente por valorar esta respuesta.

Al final de mi respuesta dice: “Es una buena respuesta” y puedes seleccionar una de 3 opciones:

  • Excelente
  • Si
  • No

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas