在VBA中创建一个大型矩阵作为typedef

时间:2015-05-20 16:27:43

标签: vba excel-vba matrix multidimensional-array out-of-memory

我正在尝试创建600 * 600 Matrix作为用户定义类型,稍后将此类型用于其他矩阵。问题是它发出一个错误,说明"内容的变量大小"不能超过64kb。

我的代码如下:

Type Matrixtype
  Contents(1to600,1 to600) As double
End Type

1 个答案:

答案 0 :(得分:2)

从这里https://msdn.microsoft.com/en-us/library/office/gg278742.aspx

  

用户定义类型的大小超过64K。

     

减小用户定义类型的大小。通常,用户定义类型的大小等于为其元素指定的大小的总和。在某些平台上,元素之间可能存在填充,以使它们在字边界上对齐。如果将一个用户定义的类型嵌套在另一个中,则嵌套类型的大小必须包含在新类型的大小中。

双打是8个字节。 360,000双打是290万字节(~2,800 kb)。这就是为什么你不能拥有600平方的双打数据结构的原因。除非您将数据类型更改为小于Double的值,否则您也不能拥有150平方。

我不确定你要用这个来完成什么,所以我能给你的最好建议是创建一个类并在那里维护数组。创建一个类并将模块命名为CTest。在其中,输入此代码

Private mdContents(1 To 600, 1 To 600) As Double

Public Property Let Contents(ByVal lOne As Long, ByVal lTwo As Long, ByVal dValue As Double)
    mdContents(lOne, lTwo) = dValue
End Property

Public Property Get Contents(ByVal lOne As Long, ByVal lTwo As Long) As Double
    Contents = mdContents(lOne, lTwo)
End Property

现在,在标准模块中,您可以创建所需的此类的许多副本。

Public Sub Test()

    Dim clsOne As CTest
    Dim clsTwo As CTest

    Set clsOne = New CTest
    clsOne.Contents(1, 1) = 2 ^ 2

    Set clsTwo = New CTest
    clsTwo.Contents(10, 10) = 2 ^ 3

    Debug.Print clsOne.Contents(1, 1), clsTwo.Contents(10, 10)

End Sub