内部格式变量数组存储值

时间:2014-07-11 06:50:37

标签: arrays vba variant

我有数量格式的数量列。 我声明了类型变体的二维数组,第一维,我存储货币(例如:英镑,美元),在其他维度我存储金额(例如:1234.22或-1567.69)

myArray(1,0)=GBP
myArray(1,1)= -1234.12
myArray(2,0)=GBP
myArray(2,1)= 1234.12

我正在总结myArray(1,1)myArray(2,1),同时总结它正在考虑格式为通用/文本而不是数字(这是我的列格式)并且总和不为零,而理想情况下总和应为0

请建议,我该如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

要理解这一点,您需要准确了解VARIANT在VBA中的确切含义以及ARRAY的确切含义。

<强>阵列

从数组开始,VBA数组实际上并不是一个内存位置数组,而是一个名为SAFEARRAY的数据结构,其中包含详细信息,如下面的清单所示(source):

typedef struct tagSAFEARRAY {
  USHORT         cDims;
  USHORT         fFeatures;
  ULONG          cbElements;
  ULONG          cLocks;
  PVOID          pvData;
  SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY, *LPSAFEARRAY;

因此,您可以看到此结构具有指向数据实际位置的指针,元素的数量,维度的数量等等。由于VBA能够确保通过使用其数组,您不会意外地搞乱一些不受干扰的内存位置。

<强>变体

有了这个,你需要了解VARIANT到底是什么。 VARIANT也不是真正的原始数据类型,而是一种数据结构,使其能够轻松处理多种数据类型。

通过简单的搜索可以找到结构的细节,但细节很简单:

Total data structure size: 16 bytes

2 bytes: Information about the data type
6 bytes: Reserved bytes (set to 0)
8 bytes: Contain the actual data

因此,当您执行VarType时,前两个字节将被获取,这就是解释器如何知道正在使用的数据类型。有关详细信息,请参阅here

因此,您现在可以了解SAFEARRAY VARIANT数据的内容。

最后,问题中的问题是:

这与Variant无关,与浮点数学有关。浮点数不会完全按照您的想法存储。

E.g。 2.323不会存储为2.323而是存储为2.322999999999999999999

  • 这种舍入错误最终会导致麻烦(导致整个稳定和不稳定方法的研究等),除非你非常小心处理这种量化的方法。
  • 某些算法会使错误消除,有些算法会加起来。
  • 因此,如果您正在寻找精确计算,则需要使用可能更适合您的问题域的不同定点数据类型(例如Currency可能有助于进行一些精确的财务计算)

解决方案: Currency数据类型是64位数据类型,并且它就像一个非常长的整数,缩放10,000。因此,可以准确地表示小数点前4位小数和15位数。