es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El método más rápido para lograr esta coincidencia de resultados utilizando Excel VBA.

Tengo un rango con varias series de fechas y valores.

Entrada

Imagen de entrada

Salida

Y necesito esta salida, una serie de fechas (usando la fecha mínima y la fecha máxima de la entrada).

Si la fecha de salida coincide con la fecha de entrada de una serie, establezca el valor de este día, de lo contrario establezca un 0. He intentado todo tipo de bucles pero tengo 40 series de fechas y valores (80 columnas x 2000 filas) y no consigo nada rápido.

Imagen de salida

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para automatizar este proceso, puedes usar código VBA para recorrer cada fecha en el rango de salida, comprobar si coincide con alguna de las fechas en el rango de entrada y establecer el valor correspondiente. Aquí tienes un ejemplo de código:

    Sub EstablecerValoresDeSalida()
        Dim rangoEntrada As Range, rangoSalida As Range
        Dim rangoFechasSalida As Range, rangoFechasEntrada As Range, rangoValoresEntrada As Range
    
        Set rangoEntrada = Range("B2:E9") 'cambia al rango de entrada correspondiente
        Set rangoSalida = Range("G2:J9") 'cambia al rango de salida correspondiente
    
        'obtener el rango de fechas para entrada y salida
        Set rangoFechasEntrada = rangoEntrada.Columns(1)
        Set rangoFechasSalida = rangoSalida.Columns(1)
    
        'encontrar la fecha mínima y máxima de la entrada
        Dim fechaMinima As Date, fechaMaxima As Date
        fechaMinima = WorksheetFunction.Min(rangoFechasEntrada)
        fechaMaxima = WorksheetFunction.Max(rangoFechasEntrada)
    
        'establecer las fechas de salida utilizando la mínima y máxima de la entrada
        For i = 1 To rangoFechasSalida.Rows.Count
            rangoFechasSalida.Cells(i, 1) = DateAdd("d", i - 1, fechaMinima)
        Next i
    
        'establecer los valores de salida
        For i = 1 To rangoSalida.Rows.Count
            For j = 2 To rangoSalida.Columns.Count
                Dim fechaSalida As Date, fechaCoincidencia As Range
                fechaSalida = rangoFechasSalida.Cells(i, 1)
    
                'encontrar la fecha coincidente en el rango de entrada
                Set fechaCoincidencia = rangoFechasEntrada.Find(What:=fechaSalida, LookIn:=xlValues, LookAt:=xlWhole)
                If Not fechaCoincidencia Is Nothing Then
                    'establecer el valor si la fecha coincide
                    rangoSalida.Cells(i, j) = rangoEntrada.Cells(fechaCoincidencia.Row, j)
                Else
                    'establecer 0 si no se encuentra la fecha
                    rangoSalida.Cells(i, j) = 0
                End If
            Next j
        Next i
    End Sub
    

    En este código, primero definimos los rangos de entrada y salida, y obtenemos el rango de fechas para ambos. Luego encontramos las fechas mínima y máxima del rango de entrada, y establecemos las fechas de salida añadiendo un número de días a la fecha mínima. Finalmente, recorremos cada celda en el rango de salida, encontramos la fecha coincidente en el rango de entrada (si la hay) y establecemos el valor correspondiente. Si no se encuentra la fecha, la establecemos en 0. Esto debería ser mucho más rápido que recorrer todas las celdas en ambos rangos.

Comments are closed.