VBA截断值

时间:2018-08-10 08:42:12

标签: excel vba excel-vba

我试图截断一些值,因为舍入函数不适合我的问题,因为我想将要处理的值与其他一些值进行比较,但是如果舍入或舍入则不这样做,所以我得到错误。

无论如何,我已经尝试了很多事情,但仍然没有得到我想要的东西。必须是=TRUNC之类的东西,但是在VBA中不可用...

我最后一次尝试几乎得到了我想要的东西:

.Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000

但是问题是,有时当我有一个“ -1”时,它会给出“ -1.001”,这样会使事情搞砸了……我真的不知道为什么这样做,因为我把在* 1000之后(因此在/ 1000之前)的msgbox,结果为-1000。因此问题出在部门上。

->因此,如果有人知道更好的截断解决方案,或者您知道1000/1000为什么给我-1.001的原因,请先谢谢您!


另一个解决方案是:

Range(.Cells(iLine, iCol), .Cells(iLine, iCol)).Select 
Selection.NumberFormat = "0.000"
Range(.Cells(iLine, iCol), .Cells(iLine, iCol)) = Range(.Cells(iLine, iCol), .Cells(iLine, iCol)).Text * 1

但这不是我想要的东西,因为有两件事:

  1. 它会强制将我的单元格格式设置为0.000,当您具有-1.000时,这种格式不舒服/不美观
  2. 仅使用范围内的简单值是不可能的(尽管我不是这个意思)

编辑:在我的行.Cells(iLine, iCol) = Int(.Cells(iLine, iCol) * 1000) / 1000上进行了几次测试后,看来问题出在Int()函数上。因为-1*1000 = -1000int(-1000) = -1001。有人知道为什么会这样吗?

即使我以-1.000000来提高此单元格的精度,我也会遇到同样的问题,只有当我将Int()放在上面时,额外的1个比例才会出现

3 个答案:

答案 0 :(得分:1)

一种将十进制(即浮点数)截断为整数(例如,无小数位)的方法是使用INT函数。

MsgBox Int(1.234)

MsgBox Int(1.789)

...都返回1

请注意,此函数在VBA和工作表公式中均有效。


浮点舍入错误

  

在将数字格式应用于数据之前,可以通过将精度设置为显示选项来经常防止浮点舍入错误影响您的工作。此选项将工作表中每个数字的值强制为工作表上显示的精度。

     

注意:使用显示的精度选项可能会产生累积的计算效果,随着时间的推移,数据的准确性会越来越高。仅在确定显示的精度将保持数据的准确性时,才使用此选项。

sourcehere中的更多内容。


编辑:直接引用工作表时的四舍五入问题

我无法在此处重现您的问题,但这可能取决于其他因素,例如单元格格式和Excel的设置。

最简单/最好的方法来确保没有此问题,是在进行任何计算之前将数字放入整数变量中。

所以代替:

Range("A2") = Int( Range("A1") / 1000 ) * 1000

使用:

Dim myInt as Integer, myInt2 as Integer  'don't 'Dim' variables within a loop

myInt = Range("A1")
myInt2 = Int( myInt / 1000 ) * 1000
Range("A2") = myInt2

更多信息:


另一个编辑:

很高兴您认为您找到了解决方案,但我担心的是,您所描述的内容并非正常行为。证明:

img

...因此,尽管在这种情况下,您的解决方法可能会为您提供正确的答案,但可能还有其他不太明显的计算受到此影响。

许多设置可能会影响此设置。我建议最好在重新启动后再尝试使用空白的新工作簿。

答案 1 :(得分:0)

所以我想截断我的值并输入错误的数字。为了测试这是否是四舍五入的问题,我尝试将舍入到10-6之前将其舍入到10-3并有效:

.Cells(iLine, iCol) = Round(.Cells(iLine, iCol), 6)
.Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000

我不觉得这告诉我们为什么int(-1000.000000)给出-1001.000000的原因,但是,嘿,行得通!

谢谢大家

编辑:我刚刚意识到Int()实际上是四舍五入的,因为微软的文档说INT(-4.5) = -5,所以我猜我的-1实际上是-1.0000[...]00001 ... < / p>

答案 2 :(得分:0)

您可以使用Trunc()函数:

.Cells(iLine, iCol).Formula="=Trunc(" & .Cells(iLine, iCol).Value & ",3)"
.Cells(iLine, iCol).Value = .Cells(iLine, iCol).Value