在Excel中自定义舍入函数

假设你有一个公式产生了以下数字:

50.77% 24.62% 24.62% 

加起来他们等于100%,但他们不希望显示的小数位,数目仍然视觉上显示他们等于100%。 如果你拿小数点的话,你会得到51%,25%,25%,实际上等于101%。

他们build议我把某些types的公式放在最大的小数位上面,即… 50.77%变成51%,其他的变小了…如果它超过100%,如果它仍然不相等到100%,总计下一个最大的数字,直到等于100%为止。

任何人都知道我可以使用什么types的vba编码公式? 我甚至不知道从哪里开始。

你可以使用这个公式的助手列:

 =IF(SUM($B$1:B1)+ROUND(A2,2)>1,1-SUM($B$1:B1),ROUND(A2,2)) 

在这里输入图像描述

除非我错过了一些东西,你可以这样做: =TEXT(SUM(A1:A3),"##") ,假设你的数字在A1:A3

我通常在这种情况下做的是在最后一个数字(例如A4)上设置一个公式,就像这样:

=1-(SUM(A1:A3))

编辑:这是我做的,如果我必须使用vba:

  1. 计算整个范围。 围绕每个数字,如你所愿。

  2. 看看你应该增加或减less的差异(例如,如果你得到的总和为99.9%,那么你的差异是0.01)。

  3. 将此差异添加到范围中的最后一个数字。 通过VBA。

  4. 即使它是负数(例如,如果你有一个100.01的总和),那么你应该总结一个负数,因此任何事情都可以。

唯一我能想到的是以一种非常恶劣的方式“欺骗”…假设你有公式,这样做的计算,替代是不可能的…所以我只是改变格式(并保留旧值)喜欢这个:

 Private Sub recalc_percs() Dim RangeToCheck As Range Set RangeToCheck = Range("A5:A9") 'designet to work with a range containing only 1 area and 1 column Dim x(1) As Variant, i As Long, b(2) As Double RangeToCheck.NumberFormat = "0%" x(0) = Evaluate(RangeToCheck.Address & "*100") x(1) = Evaluate("INDEX(ROUND(" & RangeToCheck.Address & "*100,0),)") While Application.Sum(x(1)) <> 100 And Abs(100 - Application.Sum(x(1))) < 4 'the <4 is for deleting or whatever to not loop endless times For i = 1 To RangeToCheck.Rows.Count 'get highest and lowest difference b(0) = x(1)(i, 1) - x(0)(i, 1) If b(0) < b(1) Then b(1) = b(0) If b(0) > b(2) Then b(2) = b(0) Next If Application.Sum(x(1)) < 100 Then b(0) = b(1) Else b(0) = b(2) For i = 1 To RangeToCheck.Rows.Count If b(0) = x(1)(i, 1) - x(0)(i, 1) Then x(1)(i, 1) = x(1)(i, 1) + (0.5 + (b(0) > 0)) * 2 Exit For End If Next Wend For i = 1 To RangeToCheck.Rows.Count If Application.Round(x(0)(i, 1), 0) <> x(1)(i, 1) Then RangeToCheck.Cells(i).NumberFormat = """" & x(1)(i, 1) & "%""" End If Next End Sub 

它可能需要改变一些部分…但基本上它正在工作。 另外它看起来不太好,但我现在很急…对不起。

如果您有任何问题,请问…我会尽快回复;)