有n列数据需要存入N个一维数组,比如A1列、A2列、......An列,需要存入A1() A2() A3()....An()数组中。问题是,N不定,可能会有变,而定义一维数组时,数组名中有不能含有变量,导致定义使用这些数组时很不方便,比如,当N为3时,我需要定义 Dim A1(),A2(),A3() AS String ,而无法这样定义Dim An() As String n=1,2,3,而且程序当中使用这些数组时也很不方便,无法根据变量n直接定位到数组An()上,根源就是定义的一维数组名中不能含有变量。 本来想用二维数组来实现动态的列数,由于行数巨大,担心使用二维数组会内存溢出,只能考虑使用n个一维数组的。同时,如果使用了 Preserve 关键字,就只能调整数组最后维的大小,并且不能改变数组的维数。即只能变化列,而无法变化行了。请高手指教,有啥好办法或者如何变通一下,实现 “一维数组名字 中含变量”的功能,或者使用二维数组,可以实现行数动态变化的功能,即可以用ReDim Preserve (m,n)。
1.用HeapCreate为进程创建一个堆,返回一个堆句柄
2.用HeapAlloc从指定堆上分配内存块,这里分配的内存块是连续的,实际上就是一个1维数组
3.当你想要调整已分配的内存块的大小时,调用HeapReAlloc重新分配内存,改变已经分配好的堆内存块大小
4.程序结束后调用HeapFree释放HeapAlloc和HeapReAlloc所分配的内存在第2步时,你每调用一次HeapAlloc就分配一个内存块,也就是为你分配了一个一维数组。这个函数的返回值就是指向这个一维数组的指针。你可以把这些指针存放在另一个指针数组里,这个指针数组也是由HeapAlloc分配的。这样一来,指针数组的大小可用HeapReAlloc重新分配,也就是可以改变数组的列数;另外其余每个数组的大小同样可由HeapReAlloc重新分配,即改变了每个一维数组的维数。
然后再定义一个Class1的动态数组.这样形成列坐标.当然方位的时候不会是象方位二维数组那样用(行坐标,列坐标)的方式方位,不过要是觉得麻烦可以再次包装.
'类模块Class1
Option Explicit
Dim a() As StringPublic Sub mDim(n As Long, Optional Pre As Boolean = False)
If Pre Then
ReDim Preserve a(n)
Else
ReDim a(n)
End If
End SubPublic Function GetData(n As Long) As String
GetData = a(n)
End FunctionPublic Sub LetData(n As Long, ByVal vNewValue As String)
a(n) = vNewValue
End Sub
'窗体模块
Option Explicit
Dim b() As Class1Private Sub Command1_Click()
Dim a1 As New Class1
a1.mDim (9)
ReDim Preserve b(UBound(b))
Set b(UBound(b) + 1) = a1
Debug.Print b(0).GetData(0)
Call b(0).LetData(0, "1")
End SubPrivate Sub Form_Load()
ReDim b(0)
End Sub