在下面的代码中,我遇到问题,确保文件编写器不会将我的数字舍入到一定数量的小数位。我需要使用变体,因为有时值是字符串,有时它是数字。
如何强制它准确写出变量是什么?例如,下面的代码可能会显示0.00038,我想显示确切的值。
Dim MyFile1 As Variant
Dim MyNumber as Variant
MyFile0 = "C:/myfile.csv"
fnum0 = FreeFile()
Open MyFile0 For Output As fnum0
MyNumber = 0.0003759656
Print #fnum0, MyNumber
答案 0 :(得分:1)
你的代码很好。问题在于excel。在excel中打开CSV时,包括通过VBA,excel detirmines一个单元格。通常情况下,如果它像一个超过5个字符的数字那么lloks它会用科学记数法表示它或四舍五入到5个地方。
请注意确定您在获取CSV文件之前或之前使用的是CSV文件,但以下是防止Excel更改数据的一些选项:
在VBA中,使用Workbook.OpenText命令以以下任一方式打开CSV:
- 所有excel细胞为文本*
- 列存储的数字,带有这么多小数位 (注意最多可以应用30个小数位)
- 特定的列存储为文本。
- 这里的选项语法的完整列表http://msdn.microsoft.com/en-us/library/office/bb22351(v=office.12).aspx
您也可以将CSV导入Excel电子表格,它会为您提供为每列选择数据类型的选项。然后针对excel文件运行VBA。
如果您没有在excel中进行配方,我会建议将该数字存储为文本字符串。 VBA会在需要时自动将数字字符串转换为数值。
答案 1 :(得分:1)
您可能遇到浮点错误。当数字从基数10(人类)转换为基数2(计算机)时,会发生非常小的错误。出于您的目的,您需要确定两个值不相等的含义。这不仅仅是val1 <> val2
,因为这不会解释微小的错误。例如,如果你正在处理金钱,你可能不在乎任何低于一分钱的东西。因此,您可能将不等式确定为ABS(val1 - val2) > .001
。您只需要确定您对平等的容忍度,并与该标准进行比较。
答案 2 :(得分:0)
可能是您的号码没有存储为vba中的数字,当您编写它时,Excel会将其转换。假设您的数字是1.789,并将其写入格式为“GENERAL”的单元格。 Excel将写入1.79(并认为这是数字,甚至不是格式问题)。
我发现,如果您将数字转换为小数第一个CDEC(YOURNUMBER),它将正确写入。为了更好的衡量,我还验证了单元格是'.NUMBERFORMAT =“GENERAL'