0

在下面的代码中,我在确保文件编写器不会将我的数字四舍五入到一定的小数位时遇到问题。我需要使用变体,因为有时值是字符串,有时是数字。

我怎样才能强制它准确地写出变量是什么?例如,下面的代码可能显示 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
4

3 回答 3

1

你的代码很好。问题出在excel上。在 excel 中打开 CSV(包括通过 VBA)时,excel 会确定单元格是什么。通常,如果它看起来像一个超过 5 个字符的数字,它将以科学记数法表示或四舍五入到 5 位。

请注意您之前对 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 会在需要时自动将数字字符串转换为数值。

于 2013-04-16T11:13:14.687 回答
1

您很可能遇到浮点错误。它们是非常小的错误,当数字从/到基数 10(人类)到/从基数 2(计算机)转换时会发生。出于您的目的,您需要确定两个值不相等意味着什么。这不仅仅是val1 <> val2因为这不能解释微小的错误。例如,如果你在处理金钱问题,你可能不会关心不到一分钱的东西。因此,您可以将不等式确定为ABS(val1 - val2) > .001。您只需要确定您对平等的容忍度并与该标准进行比较即可。

于 2013-04-16T13:52:38.090 回答
0

可能是您的数字没有在 vba 中存储为数字,当您编写它时,Excel 会对其进行转换。假设您的数字是 1.789,然后将其写入格式为“通用”的单元格。Excel 会写 1.79(并认为这是数字,甚至不是格式问题)。

我发现,如果您先将数字转换为小数 CDEC(YOURNUMBER),它将正确写入。为了更好地衡量,我还验证了单元格是 '.NUMBERFORMAT = "GENERAL'

于 2016-09-27T21:49:45.470 回答