Realizar una resta entre el numero máximo y mínimo de una columna con macros

Necesito una macro que me busque el valor máximo y mínimo de una columna y los reste, el resultado se muestra de la siguiente manera:

Ahora bien, el bloque de código que tengo con el que hice las pruebas y no me funciona es el siguiente:

For j = 6 To nc - 2
    For i = 2 To n
       tot = Application.Max(hTemp.Cells(i, j)) - Application.Min(hTemp.Cells(i, j))
    Next i
    hTemp.Cells(n + 2, j) = Format(tot, "#,##0.00;-#.##0,00")
Next j

Cuando ejecuto esta macro el resultado es cero en todas la columnas de mi listbox y es erróneo porque en algunas columnas los valores no son iguales como se pueden fijar en la imagen.

¿Qué puedo hacer?

2 respuestas

Respuesta
1

No entiendo de dónde quieres obtener el máximo. En tu ejemplo se aprecia un listbox. Por eso mi confusión, ¿quieres el máximo de una columna de la hoja de excel o de una columna del listbox?

Tendrás que explicar con detalle y ejemplos lo que tienes y lo que necesitas. Olvídate del código, en esa parte yo te ayudo, pero sí debes ser más claro con los ejemplos.

Te explico, quiero ubicar el máximo y el mínimo en cada columna del listbox y restar esos valores y como se aprecia en la imagen mostrarlos ahí mismo en el listbox, Es decir coloco el rango de fechas y al dar click en el me botón  ubica los datos entre ese rango por columnas y justo de estas columnas es que quiero buscar el máximo y mínimo para restarlos y hallar el consumo de diesel.

En la imagen aparece como nivel mayor 161 y el menor 142, necesito una macro que me ubique esos valores y los reste para determinar el consumo 

¿Y quieres que se agregue un registro al listbox?

¿Y con cuál método agregaste los registros al listbox?

Quise decir:

¿Y quieres que se agregue un registro con los resultados al listbox?

Es por eso que no entiendo muy bien tu necesidad.

En tu imagen tienes una cosa y en tu macro otra. Luego te pido que me expliques con ejemplos claros lo que tienes y me vuelves a poner los datos de tu imagen.

Pero no explicas cómo cargaste esos datos al listbox. Si es con additem o con rowsource. No puedo entregarte una solución, porque los dos métodos son diferentes.

Mejor envíame tu archivo y me dices en cuál formulario y que datos pongo el formulario y si quieres un registro con los resultados en el listbox. Recuerda poner tu nombre de usuario en el asunto

Te voy a adjuntar el código para que veas las instrucciones que aplico para agregar los registros 

Private Sub RANGO_Click()
On Error Resume Next
Dim tot As Double, porc As Double
Dim i As Long, j As Long
Dim dato1 As Date, dato2 As Date, dato0 As Date
Dim clear, n As Long
Dim hTemp As Worksheet
Set d = Sheets("DIESEL")
uf = d.Range("A" & Rows.Count).End(xlUp).Row
uc = d.Cells(8, Columns.Count).End(xlToLeft).Address
nc = d.Cells(8, Columns.Count).End(xlToLeft).Column
dato1 = CDate(FECHA1)
dato2 = CDate(FECHA2)
If dato2 = Empty Or dato1 = Empty Then
    MsgBox ("Debe ingresar datos para consulta entre rango de fechas"), vbCritical, "AVISO"
    FECHA1.BackColor = &HFF&
    FECHA2.BackColor = &HFF&
    Exit Sub
End If
If dato2 < dato1 Then
    MsgBox ("La fecha final no puede ser mayor a la fecha inicial"), vbCritical, "AVISO"
    Exit Sub
End If
d.AutoFilterMode = False
'  Traslada datos a hoja temporal
Set hTemp = Sheets("FILTRO")
hTemp.Cells.clear
' CARGA PRIMERA FILA
For i = 1 To nc                 ' llena encabezados en la matriz
    hTemp.Cells(1, i) = d.Cells(8, i)
Next i
' CARGA EL RESTO DE FILAS QUE CUMPLAN CON EL CRITERIO
n = 1
For i = 9 To uf
   dato0 = CDate(d.Cells(i, 1).Value)
   If dato0 >= dato1 And dato0 <= dato2 Then
        n = n + 1                           ' Incrementa contador
        For j = 1 To nc
            hTemp.Cells(n, j) = d.Cells(i, j)
        Next j
   End If
Next i
For j = 6 To nc - 2
    tot = 0
    For i = 2 To n
        tot = Application.Max(hTemp.Range("i: i")) - Application.Min(hTemp.("i: i"))
    hTemp.Cells(n + 2, j) = Format(tot, "#,##0.00;-#.##0,00")
Next j
'For j = 6 To nc - 2
    'hTemp.Cells(n + 3, j) = Format(((hTemp.Cells(n + 2, j) / tot) * 100), "#,##0.00;-#.##0,00") & " %"
'Next j
DIESEL.CONSUMO_TOTAL.Caption = Format(tot, "#,##0.00;-#.##0,00") & " Litros"
DIESEL.DIAS_CONSULTADOS.Caption = n - 1
n = n + 2           ' avanza 2 lineas
hTemp.Cells(n, 5) = "Sub-Total"
'  Asigna la visualizado en la hoja temporal al ListBox
Me.LISTA_DIESEL.clear
Me.LISTA_DIESEL.RowSource = hTemp.Name & "!A2:AH" & n + 2       ' LLENO EL LISTBOX HASTA N + 2 QUE ES MI ULTIMA FILA
Me.MultiPage1.Value = 1
FECHA1.BackColor = &HFFFFFF
FECHA2.BackColor = &HFFFFFF
RANGO.BackColor = &HFFFFFF
Me.LISTA_DIESEL.ColumnWidths = "60 pt;60 pt;50 pt;50 pt;100 pt;100 pt;100 pt; 100 pt;100 pt;100 pt;100 pt;100 pt; 100 pt;100 pt;100 pt;110 pt; 110 pt;110 pt;110 pt;140 pt;140 pt;145 pt;145 pt;135 pt;140 pt;140 pt;140 pt;140 pt;140 pt;140 pt;140 pt;100 pt;110 pt;100 pt;100 pt;60 pt; 60 pt;"
End Sub

Esta bien ya te envío todo...

Te anexo el código actualizado

Private Sub RANGO_Click()
    On Error Resume Next
    Dim tot As Double, porc As Double
    Dim i As Long, j As Long
    Dim dato1 As Date, dato2 As Date, dato0 As Date
    Dim clear, n As Long
    Dim hTemp As Worksheet
    Set d = Sheets("DIESEL")
    d.AutoFilterMode = False
    uf = d.Range("A" & Rows.Count).End(xlUp).Row
    uc = d.Cells(8, Columns.Count).End(xlToLeft).Address
    nc = d.Cells(8, Columns.Count).End(xlToLeft).Column
    dato1 = CDate(FECHA1)
    dato2 = CDate(FECHA2)
    If dato2 = Empty Or dato1 = Empty Then
        MsgBox ("Debe ingresar datos para consulta entre rango de fechas"), vbCritical, "AVISO"
        FECHA1.BackColor = &HFF&
        FECHA2.BackColor = &HFF&
        Exit Sub
    End If
    If dato2 < dato1 Then
        MsgBox ("La fecha final no puede ser mayor a la fecha inicial"), vbCritical, "AVISO"
        Exit Sub
    End If
    '  Traslada datos a hoja temporal
    Set hTemp = Sheets("FILTRO")
    hTemp.Cells.clear
    ' CARGA PRIMERA FILA
    d.Rows(8).Copy hTemp.Rows(1)
    ' CARGA EL RESTO DE FILAS QUE CUMPLAN CON EL CRITERIO
    n = 2
    For i = 9 To uf
       dato0 = CDate(d.Cells(i, 1).Value)
       If dato0 >= dato1 And dato0 <= dato2 Then
            d.Rows(i).Copy hTemp.Rows(n)
            n = n + 1                           ' Incrementa contador
       End If
    Next i
    '
    'On Error GoTo 0
    Dim u
    u = hTemp.Range("A" & Rows.Count).End(xlUp).Row
    With hTemp.Range(hTemp.Cells(u + 2, "F"), hTemp.Cells(u + 2, nc))
        .FormulaR1C1 = "=MAX(R2C:R" & u & "C)-MIN(R2C:R" & u & "C)"
        .Value = .Value
    End With
    '
    DIESEL.CONSUMO_TOTAL.Caption = Format(tot, "#,##0.00;-#.##0,00") & " Litros"
    DIESEL.DIAS_CONSULTADOS.Caption = n - 1
    hTemp.Cells(u + 2, 5) = "Sub-Total"
    '  Asigna la visualizado en la hoja temporal al ListBox
    Me.LISTA_DIESEL.RowSource = hTemp.Name & "!A2:AH" & u + 2       ' LLENO EL LISTBOX HASTA N + 2 QUE ES MI ULTIMA FILA
    Me.MultiPage1.Value = 1
    FECHA1.BackColor = &HFFFFFF
    FECHA2.BackColor = &HFFFFFF
    RANGO.BackColor = &HFFFFFF
    Me.LISTA_DIESEL.ColumnWidths = "60 pt;60 pt;50 pt;50 pt;100 pt;100 pt;100 pt; 100 pt;100 pt;100 pt;100 pt;100 pt; 100 pt;100 pt;100 pt;110 pt; 110 pt;110 pt;110 pt;140 pt;140 pt;145 pt;145 pt;135 pt;140 pt;140 pt;140 pt;140 pt;140 pt;140 pt;140 pt;100 pt;110 pt;100 pt;100 pt;60 pt; 60 pt;"
End Sub

.

sal u dos

Respuesta
1

De entrada tienes la instrucción mal escrita, en vez de manejar columnas estas manejando celdas sustituye el 1 por la variable que represente a las columnas, hasta ahí es donde puedo ayudarte ya que sin ver el código completo no me queda del todo claro como funciona tu macro.

tot = Application.Max(htemp.Columns(1)) - Application.Min(htemp.Columns(1))

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas