Cómo networkingondear con Excel VBA round ()?

Tengo los siguientes datos:

cell(1,1) = 2878.75 cell(1,2) = $31.10 cell(2,1) = $89,529.13 

Sin embargo, cuando traté de usar round(cells(1,1).value*cells(1,2).value),2) , el resultado no coincide con la cell(2,1) . Pensé que tenía que ver con el problema del networkingondeo, pero me pregunto si es posible moverse round() para actuar normalmente. Es decir, para value > 0.5 , networkingondee hacia arriba. Y para el value < 0.5 , ¿networkingondear hacia abajo?

VBA utiliza el networkingondeo de banqueros en un bash de compensar el sesgo en networkingondear siempre hacia arriba o hacia abajo en .5; puedes en cambio;

 WorksheetFunction.Round(cells(1,1).value * cells(1,2).value, 2) 

Si quiere networkingondear, use la mitad de ajuste. Agregue 0.5 al número que se networkingondeará hacia arriba y use la function de networkingondeo ().

respuesta = Ronda (x + 0.5)

Prueba esta function, está bien networkingondear un doble

 '---------------Start ------------- Function Round_Up(ByVal d As Double) As Integer Dim result As Integer result = Math.Round(d) If result >= d Then Round_Up = result Else Round_Up = result + 1 End If End Function '-----------------End---------------- 

Tuve un problema donde tuve que networkingondear solo y estas respuestas no funcionaron para saber cómo debía ejecutar mi código, así que utilicé un método diferente. La function INT networkingondea hacia negativo (4.2 va a 4, -4.2 va a -5) Por lo tanto, cambié mi function a negativa, apliqué la function INT, luego la devolví a positiva simplemente multiplicándola por -1 antes y después

 Count = -1 * (int(-1 * x)) 

Pruebe la function RoundUp:

 Dim i As Double i = Application.WorksheetFunction.RoundUp(Cells(1, 1).Value * Cells(1, 2).Value, 2) 

Voy a presentar dos funciones de biblioteca personalizadas para usar en vba, que servirán para networkingondear el doble valor en lugar de utilizar WorkSheetFunction.RoundDown y WorkSheetFunction.RoundUp

 Function RDown(Amount As Double, digits As Integer) As Double RDown = Int((Amount + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits) End Function Function RUp(Amount As Double, digits As Integer) As Double RUp = RDown(Amount + (5 / (10 ^ (digits + 1))), digits) End Function 

Así la function Rdown (2878.75 * 31.1,2) devolverá 899529.12 y la function RUp (2878.75 * 31.1,2) devolverá 899529.13 Considerando que la function Rdown (2878.75 * 31.1, -3) devolverá 89000 y la function RUp (2878.75 * 31.1, – 3) devolverá 90000

Math.Round utiliza el networkingondeo de banqueros y networkingondeará al número par más cercano si el número que se networkingondeará cae exactamente en el medio.

Solución fácil, use la function de spreadsheet. Rondo (). Eso se networkingondeará si está en el borde.

Usó la function "RDown" y "RUp" de ShamBhagwat y creó otra function que devolverá la parte networkingonda (sin la necesidad de dar "dígitos" para la input)

 Function RoundDown(a As Double, digits As Integer) As Double RoundDown = Int((a + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits) End Function Function RoundUp(a As Double, digits As Integer) As Double RoundUp = RoundDown(a + (5 / (10 ^ (digits + 1))), digits) End Function Function RDownAuto(a As Double) As Double Dim i As Integer For i = 0 To 17 If Abs(a * 10) > WorksheetFunction.Power(10, -(i - 1)) Then If a > 0 Then RDownAuto = RoundDown(a, i) Else RDownAuto = RoundUp(a, i) End If Exit Function End If Next End Function 

la salida será:

 RDownAuto(458.067)=458 RDownAuto(10.11)=10 RDownAuto(0.85)=0.8 RDownAuto(0.0052)=0.005 RDownAuto(-458.067)=-458 RDownAuto(-10.11)=-10 RDownAuto(-0.85)=-0.8 RDownAuto(-0.0052)=-0.005 

Este es un ejemplo j es el valor que desea networkingondear.

 Dim i As Integer Dim ii, j As Double j = 27.11 i = (j) ' i is an integer and truncates the decimal ii = (j) ' ii retains the decimal If ii - i > 0 Then i = i + 1 

Si el rest es mayor que 0, lo networkingondea, simple. En 1.5, se networkingondea automáticamente a 2, por lo que será menor que 0.

Tengo una solución yo mismo:

  'G = Maximum amount of characters for width of comment cell G = 100 'CommentX If THISWB.Sheets("Source").Cells(i, CommentColumn).Value = "" Then CommentX = "" Else CommentArray = Split(THISWB.Sheets("Source").Cells(i, CommentColumn).Value, Chr(10)) 'splits on alt + enter DeliverableComment = "Available" End If If CommentX <> "" Then 'this loops for each newline in a cell (alt+enter in cell) For CommentPart = 0 To UBound(CommentArray) 'format comment to max G characters long LASTSPACE = 0 LASTSPACE2 = 0 If Len(CommentArray(CommentPart)) > G Then 'find last space in G length character string to make sure the line ends with a whole word and the new line starts with a whole word Do Until LASTSPACE2 >= Len(CommentArray(CommentPart)) If CommentPart = 0 And LASTSPACE2 = 0 And LASTSPACE = 0 Then LASTSPACE = WorksheetFunction.Find("þ", WorksheetFunction.Substitute(Left(CommentArray(CommentPart), G), " ", "þ", (Len(Left(CommentArray(CommentPart), G)) - Len(WorksheetFunction.Substitute(Left(CommentArray(CommentPart), G), " ", ""))))) ActiveCell.AddComment Left(CommentArray(CommentPart), LASTSPACE) Else If LASTSPACE2 = 0 Then LASTSPACE = WorksheetFunction.Find("þ", WorksheetFunction.Substitute(Left(CommentArray(CommentPart), G), " ", "þ", (Len(Left(CommentArray(CommentPart), G)) - Len(WorksheetFunction.Substitute(Left(CommentArray(CommentPart), G), " ", ""))))) ActiveCell.Comment.Text Text:=ActiveCell.Comment.Text & vbNewLine & Left(CommentArray(CommentPart), LASTSPACE) Else If Len(Mid(CommentArray(CommentPart), LASTSPACE2)) < G Then LASTSPACE = Len(Mid(CommentArray(CommentPart), LASTSPACE2)) ActiveCell.Comment.Text Text:=ActiveCell.Comment.Text & vbNewLine & Mid(CommentArray(CommentPart), LASTSPACE2 - 1, LASTSPACE) Else LASTSPACE = WorksheetFunction.Find("þ", WorksheetFunction.Substitute(Mid(CommentArray(CommentPart), LASTSPACE2, G), " ", "þ", (Len(Mid(CommentArray(CommentPart), LASTSPACE2, G)) - Len(WorksheetFunction.Substitute(Mid(CommentArray(CommentPart), LASTSPACE2, G), " ", ""))))) ActiveCell.Comment.Text Text:=ActiveCell.Comment.Text & vbNewLine & Mid(CommentArray(CommentPart), LASTSPACE2 - 1, LASTSPACE) End If End If End If LASTSPACE2 = LASTSPACE + LASTSPACE2 + 1 Loop Else If CommentPart = 0 And LASTSPACE2 = 0 And LASTSPACE = 0 Then ActiveCell.AddComment CommentArray(CommentPart) Else ActiveCell.Comment.Text Text:=ActiveCell.Comment.Text & vbNewLine & CommentArray(CommentPart) End If End If Next CommentPart ActiveCell.Comment.Shape.TextFrame.AutoSize = True End If 

Siéntase libre de agradecerme. ¡Funciona como un encanto para mí y la function de autosize también funciona!