2009-11-21 3 views

Répondre

1

Vous pouvez ajouter une référence à la bibliothèque d'objets Microsoft Excel et utiliser Excel.WorksheetFunction.Ceiling

+0

Dois-je créer une fonction VBA qui enveloppe l'appel à Excel.WorksheetFunction.Ceiling() ou puis-je l'utiliser dans une expression? –

+0

Vous pouvez l'utiliser directement dans VBA mais devez créer un wrapper pour utiliser la fonction dans un formulaire d'accès. – marg

8

Cette réponse utilise VBA pour Access et est dérivé de http://www.tek-tips.com/faqs.cfm?fid=5031:

Public Function Ceiling(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double 
    ' X is the value you want to round 
    ' Factor is the optional multiple to which you want to round, defaulting to 1 
    Ceiling = (Int(X/Factor) - (X/Factor - Int(X/Factor) > 0)) * Factor 
End Function 

Notez que cette réponse est mathématiquement correct pour X. négatif Voir http://en.wikipedia.org/wiki/Floor_and_ceiling_functions#Spreadsheet_software pour le fond.

+1

Je recommande fortement briser ce bas en plusieurs étapes, mémoriser le résultat de chaque sous -calcul dans une variable avec une précision connue afin de minimiser les effets de l'imprécision en virgule flottante. –

2

Merci, Marg, pour la réponse. Pour référence ultérieure, voici la fonction VBA que j'ai écrit après avoir importé la bibliothèque d'objets Microsoft Excel:

Public Function Ceiling(Value As Double, Significance As Double) As Double 
    Ceiling = Excel.WorksheetFunction.Ceiling(Value, Significance) 
End Function 

Puis, dans ma requête, je tentais de calculer les heures facturables de temps de travail effectif, arrondi au prochain trimestre heure:

SELECT Ceiling(([WorkTimes]![EndTime]-[WorkTimes]![BeginTime])*24,0.25) AS BillableTime 
FROM WorkTimes; 
-1

Bien que cette question posée spécifiquement pour l'accès est ici la réponse pour VB.NET

Public Function Ceiling(ByVal value As Double, ByVal factor As Double) As Double 
    Return Math.Ceiling(value/factor) * factor 
End Function 

Et la réponse en C#Je publie ici parce que j'avais besoin d'une telle fonction google m'a envoyé à cette question mais je ne pouvais pas trouver une réponse pour. Net. J'ai finalement compris pour moi-même.

8

Depuis Int() semble fonctionner comme Floor(), vous pouvez obtenir Ceiling comme ceci: -Int (-x)

+0

C'est une solution tellement belle et simple. Je pense que je créerais une fonction comme Arthur, donc il est clair dans le code ce qui se passe. –