Option Explicit Sub ConsolidarKPIsVentas() Dim wb As Workbook Dim wsKpi As Worksheet Dim wsMes As Worksheet Dim meses As Variant Dim mes As Variant Dim i As Long Dim lastRow As Long Dim colVentas As Long, colEstado As Long Dim rCell As Range ' Variables para cálculos Dim totalVentasMes As Double, totalVentasGral As Double Dim numVentasMes As Long, numVentasGral As Long Dim pagadasMes As Long, pagadasGral As Long Dim filaDestino As Long Set wb = ThisWorkbook meses = Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio") ' 1. Crear o limpiar la hoja KPIs On Error Resume Next Set wsKpi = wb.Worksheets("KPIs") On Error GoTo 0 If wsKpi Is Nothing Then Set wsKpi = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count)) wsKpi.Name = "KPIs" Else wsKpi.Cells.Clear End If ' 2. Escribir encabezados wsKpi.Range("A1:F1").Value = Array("Mes", "Ventas Totales USD", "Número de Ventas", "Ticket Promedio USD", "Ventas Pagadas", "Tasa de Ventas Efectivas") filaDestino = 2 ' 3. Procesar cada mes For Each mes In meses On Error Resume Next Set wsMes = wb.Worksheets(CStr(mes)) On Error GoTo 0 If Not wsMes Is Nothing Then lastRow = wsMes.Cells(wsMes.Rows.Count, 1).End(xlUp).Row If lastRow > 1 Then ' Buscar columnas dinámicamente colVentas = 0: colEstado = 0 For i = 1 To wsMes.Cells(1, wsMes.Columns.Count).End(xlToLeft).Column If wsMes.Cells(1, i).Value = "Ventas_USD" Then colVentas = i If wsMes.Cells(1, i).Value = "Estado" Then colEstado = i Next i ' Validar existencia de columnas If colVentas = 0 Or colEstado = 0 Then MsgBox "Error: Falta columna 'Ventas_USD' o 'Estado' en la hoja " & mes, vbCritical Exit Sub End If ' Inicializar contadores mensuales totalVentasMes = 0: numVentasMes = 0: pagadasMes = 0 ' Recorrer datos del mes For i = 2 To lastRow numVentasMes = numVentasMes + 1 totalVentasMes = totalVentasMes + Val(Replace(Replace(wsMes.Cells(i, colVentas).Value, "USD", ""), "$", "")) If wsMes.Cells(i, colEstado).Value = "Pagado" Then pagadasMes = pagadasMes + 1 Next i ' Escribir resultados mensuales wsKpi.Cells(filaDestino, 1).Value = mes wsKpi.Cells(filaDestino, 2).Value = totalVentasMes wsKpi.Cells(filaDestino, 3).Value = numVentasMes wsKpi.Cells(filaDestino, 4).Value = IIf(numVentasMes > 0, totalVentasMes / numVentasMes, 0) wsKpi.Cells(filaDestino, 5).Value = pagadasMes wsKpi.Cells(filaDestino, 6).Value = IIf(numVentasMes > 0, pagadasMes / numVentasMes, 0) ' Acumular para el total consolidado totalVentasGral = totalVentasGral + totalVentasMes numVentasGral = numVentasGral + numVentasMes pagadasGral = pagadasGral + pagadasMes filaDestino = filaDestino + 1 End If End If Set wsMes = Nothing Next mes ' 4. Fila de Total Consolidado wsKpi.Cells(filaDestino, 1).Value = "Total Consolidado" wsKpi.Cells(filaDestino, 2).Value = totalVentasGral wsKpi.Cells(filaDestino, 3).Value = numVentasGral wsKpi.Cells(filaDestino, 4).Value = IIf(numVentasGral > 0, totalVentasGral / numVentasGral, 0) wsKpi.Cells(filaDestino, 5).Value = pagadasGral wsKpi.Cells(filaDestino, 6).Value = IIf(numVentasGral > 0, pagadasGral / numVentasGral, 0) ' 5. Formato With wsKpi .Range("A1:F1").Font.Bold = True .Range(filaDestino & ":" & filaDestino).Font.Bold = True .Columns("B:B").NumberFormat = "$ #,##0.00" .Columns("D:D").NumberFormat = "$ #,##0.00" .Columns("F:F").NumberFormat = "0.00%" .Columns("A:F").AutoFit End With MsgBox "Reporte de KPIs generado correctamente en la hoja 'KPIs'.", vbInformation End Sub