Encontrar el mínimo mayor que cero con VBA para excel

Esta es la cuestión, tengo valores acomodados horizontalmente y necesito encontrar el valor menor, obviando el cero, esto lo quiero hacer con VBA, ya que el rango de valores horizontales puede ser desde 4 hasta 50 y varia cada vez
yo se que existe la función MIN(if(RANGO>0, RANGO), y si le das shift+ctrl+enter te la convierte en arreglo, pero al tratar de pasar esto a VBA no lo logro la fórmula que estoy usando en este momento es la siguiente
For i = 6 To (r + 3)
    'menor costo
    Dim myRange As Range
    Set myRange = Worksheets("Compras").Range(Cells(i, 2), Cells(i, (c - 10)))
    answer = Application.WorksheetFunction.Min(myRange)
    Range(Cells(i, (c - 11)), Cells(i, (c - 11))).Value = answer
Como ves tengo unicamente la función MIN, quiero convertir eso a que me obtenga el mínimo pero excluyendo el cero
gracias por tu ayuda

1 respuesta

Respuesta
1
A ver si te entendí: lo que quieres es que de entre un rango horizontal de celdas, que tienen números, se obtenga el numero más pequeño encontrado de entre esa lista, ¿pero qué no tome en cuenta el 0?
Si es así, prueba con lo siguiente:
Sub Minimo()
Dim ValA As Integer
Dim ValB As Integer
Range("A1").Select
ValA = ActiveCell.Value
Do While ActiveCell.Value <> ""
ValB = ActiveCell.Value
    If ActiveCell.Value <> "0" Then
        If ValA > ValB Then
            ValA = ActiveCell.Value
        End If
    End If
ActiveCell.Offset(0, 1).Select
Loop
MsgBox ValA
End Sub
------
Paso a explicarlo por si algo del código no le captaste y sobre todo si alguien más consulta algo parecido, y que sirva de referencia.
(comentario arriba del codigo)
Sub Minimo()
' Declaro variables de tipo entero
Dim ValA As Integer
Dim ValB As Integer
' aqui indico la primera celda que contiene los valores numericos. Si es diferente, tendras que cambiarlo
Range("A1").Select
' defino que ValA contenga el valor de la celda actual
ValA = ActiveCell.Value
' con lo siguiente hago un ciclo que se realizará hasta que encuentre una celda vacia
Do While ActiveCell.Value <> ""
'ValB ira conteniendo el valor de la celda en la que vaya el ciclo
ValB = ActiveCell.Value
'si el valor de la celda es diferente a 0, realizara el siguiente codigo, y de lo contrario, si es 0, no lo tomara en cuenta
    If ActiveCell.Value <> "0" Then
' si ValA es mayor a ValB (valor actual de la celda) entonces ValA ahora contendra el valor de la celda actual. Si ValA fuera menor que ValB, como la intencion es encontrar el valor menor, no se realizaria nada, y ValA seguiria conservando el valor que ya contiene, que es un valor menor al valor de la celda actual
        If ValA > ValB Then
            ValA = ActiveCell.Value
        End If
    End If
' esta linea es importante dentro del codigo, pues es la que en cada ciclo, va recorriendo columna por columna. Si no lo indicaramos, nos quedariamos siempre en la misma celda con valor, y el bucle se haria infinito
ActiveCell.Offset(0, 1).Select
Loop
'finalmente se manda un mensaje con el valor que contiene ValA, que despues de recorrer y comparar los valores de las celdas, ya contendra el menor numero dentro del rango
MsgBox ValA
End Sub
--------

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas