2016-03-02 21 views
8

Sto provando a calcolare il numero di livelli in cui una merce verrà impilata. Ho una quantità variabile (iQty), una larghezza determinata per il letto di carico (dRTW), una larghezza per unità per la merce (dWidth) e una quantità per strato (iLayerQty).Arrotondare al più alto numero intero più vicino in VBA

La quantità per strato è calcolato come iLayerQty = Int(dRTW/dWidth)

ora devo dividere il quantitativo totale per la quantità per strato e arrotondare. In una formula di Excel sarebbe facile, ma sto cercando di evitare le chiamate di WorksheetFunction per minimizzare la confusione A1/R1C1. Al momento sto approssimare con questo:

(Number of layers) = ((Int(iQty/iLayerQty) + 1) 

E questo funziona bene più parte del tempo - tranne quando i numeri danno un numero intero (una larghezza di carico di 0,5 m, per esempio, il montaggio su un 2,5 m rolltrailer). In quei casi, naturalmente, aggiungendo quello si rovina il risultato.

C'è qualche modo pratico per modificare questa formula per ottenere un arrotondamento verso l'alto migliore?

+0

usare 'WorksheetFunction.Ceiling()' – Vasily

+0

Ma questa è anche una funzione di foglio di lavoro - quindi potrei anche usare semplicemente Roundup. Detto questo, dopo aver consultato Ceiling, penso che potrebbe essere utile per un'altra cosa su cui ho lavorato - grazie! –

+1

'Ceiling' è una variante un po 'estesa di' roundup', è possibile specificare il passo di arrotondamento, è per questo che l'ho proposto. – Vasily

risposta

11

Non vedo alcun motivo per evitare WorksheetFunction; Non vedo alcuna confusione qui.

Number_of_layers = WorksheetFunction.RoundUp(iQty/iLayerQty, 0) 

Si potrebbe anche rotolare la propria funzione:

Function RoundUp(ByVal Value As Double) 
    If Int(Value) = Value Then 
     RoundUp = Value 
    Else 
     RoundUp = Int(Value) + 1 
    End If 
End Function 

chiamare in questo modo:

Number_of_layers = RoundUp(iQty/iLayerQty) 
+0

Così bello e semplice - molte grazie, lo userò. :-) –

6

Se si utilizza un WorksheetFunction object per accedere a una funzione di ROUNDUP o CEILING è fuori dal tavolo poi lo stesso può essere realizzato con alcuni calcoli matematici.

Number of layers = Int(iQty/iLayerQty) - CBool(Int(iQty/iLayerQty) <> Round(iQty/iLayerQty, 14)) 

Un VBA vero è l'equivalente di (-1) quando usato matematicamente. Il round VBA è lì per evitare errori in virgola mobile a 15 cifre.