我有数量格式的数量列。 我声明了类型变体的二维数组,第一维,我存储货币(例如:英镑,美元),在其他维度我存储金额(例如: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
请建议,我该如何处理这种情况?
答案 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位数。