Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 截断值_Vba_Excel - Fatal编程技术网

Vba 截断值

Vba 截断值,vba,excel,Vba,Excel,我正试图截断一些值,因为舍入函数不适合我的问题,因为我想将我正在处理的值与其他值进行比较,但如果它们被向上舍入或向下舍入,我不会这样做,所以我会出错 不管怎样,我已经尝试了很多东西,但仍然没有得到我想要的。。。必须是类似于=TRUNC的内容,但它在VBA中不可用 我的最后一次尝试几乎满足了我的要求: .Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000 但问题是,有时当我有一个“-1”时,它会给出“-1.001”,

我正试图截断一些值,因为舍入函数不适合我的问题,因为我想将我正在处理的值与其他值进行比较,但如果它们被向上舍入或向下舍入,我不会这样做,所以我会出错

不管怎样,我已经尝试了很多东西,但仍然没有得到我想要的。。。必须是类似于
=TRUNC
的内容,但它在VBA中不可用

我的最后一次尝试几乎满足了我的要求:

.Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000
但问题是,有时当我有一个“
-1
”时,它会给出“
-1.001
”,这样会把事情搞砸。。。我真的不知道它为什么会这样做,因为我在
*1000
之后放了一个msgbox(在
/1000
之前),结果是-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
但这不是我想要的,因为有两件事:

  • 它将我的单元格格式强制设置为0.000,当您有-1.000时,这将不便于阅读/美观
  • 仅使用范围的简单值是不可能做到这一点的(但我不想讨论这一点)

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


    即使我将这个单元格的精度提高了-1.000000,我也会遇到同样的问题,只有当我在它上面加Int()时,额外的1 appears

    将十进制(即浮点)数截断为整数的一种方法是使用
    Int
    函数

    MsgBox Int(1.234)
    

    …两者都返回
    1

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


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

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

    更多关于这方面的信息,请访问和


    编辑:直接参考工作表时的舍入问题 我不能在这里复制您的问题,但它可能取决于其他因素,如单元格格式和Excel的设置

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

    因此,不是:

    Range("A2") = Int( Range("A1") / 1000 ) * 1000
    
    使用:


    更多信息:
    • 办公室支助:
    • MSDN:
    • 办公室支助:
    • 办公室支助:

    另一编辑: 我很高兴你认为你找到了解决办法,但我担心的是你所描述的不是正常行为。证明:

    …因此,在这种情况下,虽然您的变通方法可能会为您提供正确的答案,但可能会有其他计算受到影响,这些影响并不明显


    有许多设置可能会影响这一点。我建议用一个新的空白工作簿再试一次,最好是在重新启动之后。

    所以我想截断我的值,得到一个错误的数字。为了测试是否存在舍入问题,我尝试舍入到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

    你可以使用
    Trunc()
    函数:

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

    Int(.Cells(iLine,iCol)*1000)/1000
    如果
    .Cells(iLine,iCol)为我提供
    1
    .Value
    -1
    。作为盲镜头,检查你是否有任何有趣的格式。或者尝试
    .Value2
    而不是
    .Value
    @jack-请参阅对我的重新使用的编辑:如果数字为负数,则返回下一个值或相等值
    Int(-1000.0000001)=-1001
    Fix(-1000.0000001)=-1000
    。至于你的问题,有人能解释一下为什么“1000/1000给我-1.001”吗?请阅读。特别是“舍入错误”部分。@VincentG,它只是移动了问题:
    Fix(-999.999999999999)=-999
    。这是一个浮点数学问题,使用
    Int
    Fix
    显示一组小数将导致最后一个小数不准确。@JackA,我误解了。您希望从(例如,
    1.0001
    )返回什么?你只是想知道“为什么”吗?谢谢你的消息来源我会查一查。要回答这个问题,我有一个x值,乘以1000,然后使用int()对其进行处理,然后再除以1000。但是如果x=-1,在这种特殊情况下,它给出的是-1.001,而不是-1。还可以查看我对原稿的编辑post@JackA-什么数据类型是
    x
    ?例如,您使用的是
    Integer
    还是
    Single
    ,这可能会有所不同。或者,如果您根本不声明它们,那么它们可能是
    变量
    。x的数据类型实际上是一个
    单元格()
    。在这种情况下,我建议您不要直接引用单元格,而是将其放入一个整数变量中,并用它进行计算。我将用一个例子来编辑我的答案,事实是,
    int(-1000.000000)
    在正常系统上不返回
    -1001
    ,带有regul
    .Cells(iLine, iCol) = Round(.Cells(iLine, iCol), 6)
    .Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000
    
    .Cells(iLine, iCol).Formula="=Trunc(" & .Cells(iLine, iCol).Value & ",3)"
    .Cells(iLine, iCol).Value = .Cells(iLine, iCol).Value