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.

Recorra las filas que contengan fechas de forma mensual.

Estoy tratando de realizar un bucle condicional de “sumif y countif” en un rango dinámico.

Si se cumplen alguna de las condiciones, se proporciona una respuesta a una celda “Output” adyacente de cada fila y luego el bucle continúa en cada fila del rango hasta completarlo.

Las tablas/hojas de cálculo contienen productos repetidos y varios valores, a menudo en una fecha específica. El código a continuación funciona, pero solo cumple el 50% de lo que quiero.

Quiero aplicar un bucle secundario que aplique los cálculos del primer bucle mencionado anteriormente a los datos en incrementos de 30 días o mensuales, es decir, el bucle de countif y sumif se aplica solo a las filas entre el 1 de enero de 2020 y el 31 de enero de 2020, en lugar de a todo el rango (a partir de la fecha mínima en el rango). Luego, el bucle continúa con, por ejemplo, el 1 de febrero de 2020 al 28 de febrero de 2020, o los siguientes 30 días después de los primeros 30 días, y realiza el cálculo nuevamente. Las fechas a menudo se repiten para cada fila de datos, lo que hace las cosas un poco más complicadas.

Datos de ejemplo:

Fecha || Precio cambiante || Producto || Salida
11/16/2019 $23 Apple Demasiado grande
11/16/2019 $50 Apple Demasiado grande
11/17/2019 $23 Apple Demasiado grande
11/21/2019 $10 Naranja Demasiado grande
11/16/2019 $5 Naranja Demasiado grande
11/21/2019 $5 Naranja Demasiado grande
11/21/2019 $5 Naranja Demasiado grande
12/23/2019 $23 Apple Comprar
12/23/2019 $20 Apple Comprar

Sub Macro_1

Application.ScreenUpdating = False
'variables
Dim rngCriteria As Range
Dim rngSum As Range
Set rngCriteria = Range("M2:M200") 
Set rngSum = Range("L2:L200")
Dim rngResult As Long
Dim rngResult2 As Long
Dim cell As Range

'Loop para realizar countif y sumif
For Each cell In Worksheets("Sheet1").Range("N2:N200")
    rngResult = WorksheetFunction.SumIf(rngCriteria, cell.Offset(0,-1).Value, rngSum)
    rngResult2 = WorksheetFunction.CountIf(rngCriteria, cell.Offset(0,-1).Value)
    If rngResult > 50 Or rngResult2 > 2 Then
        cell.Value = "Demasiado grande"
    Else
        cell.Value = "Comprar"
    End If
Next cell

Application.ScreenUpdating = True

End Sub
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar un bucle secundario que aplique el bucle de countif y sumif a los datos en incrementos de 30 días o mensuales, puedes agregar un bucle for anidado dentro del bucle existente. Aquí tienes un código actualizado que agrega el bucle secundario:

    Sub Macro_1()
    
    Application.ScreenUpdating = False
    'variables
    Dim rngCriteria As Range
    Dim rngSum As Range  
    Set rngCriteria = Range("M2:M200") 
    Set rngSum = Range("L2:L200")
    Dim rngResult As Long
    Dim rngResult2 As Long
    Dim cell As Range
    
    'Bucle para realizar countif y sumif
    For Each cell In Worksheets("Sheet1").Range("N2:N200")
        'Bucle anidado para aplicar cálculos en incrementos de 30 días
        For i = 1 To 12 'Puedes ajustar la cantidad de incrementos según sea necesario
            startDate = DateSerial(2020, i, 1)
            endDate = DateSerial(2020, i + 1, 0)
            If endDate > Range("A1").Value Then 'Verifica si la fecha de finalización está más allá del rango de datos
                endDate = Range("A1").Value
            End If
    
            'Aplica los bucles countif y sumif dentro del rango de fechas
            rngResult = WorksheetFunction.SumIfs(rngSum, rngCriteria, cell.Offset(0, -1).Value, Range("A2:A200"), ">=" & startDate, Range("A2:A200"), "<=" & endDate)
            rngResult2 = WorksheetFunction.CountIfs(rngCriteria, cell.Offset(0, -1).Value, Range("A2:A200"), ">=" & startDate, Range("A2:A200"), "<=" & endDate)
    
            'Establece el valor de la celda de salida en función de los cálculos
            If rngResult > 50 Or rngResult2 > 2 Then
                cell.Offset(0, 1 + i) = "Muy grande"
            Else
                cell.Offset(0, 1 + i) = "Comprar"
            End If
        Next i
    Next cell
    
    Application.ScreenUpdating = True
    
    End Sub
    

    En esta implementación, el bucle for anidado recorre cada mes (desde enero hasta diciembre en este ejemplo) y establece las fechas de inicio y fin para cada mes en función de la iteración del bucle. Los bucles countif y sumif luego utilizan estas fechas como criterios adicionales para realizar los cálculos solo dentro del mes específico. El valor de salida se escribe en una celda adyacente en la misma fila, desplazado por el número de iteraciones del bucle (1 más el índice del mes en este caso).

Comments are closed.