有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.   

    你这个问题其实就是对内存的动态分配问题。建议你调用API来实现:
    1.用HeapCreate为进程创建一个堆,返回一个堆句柄
    2.用HeapAlloc从指定堆上分配内存块,这里分配的内存块是连续的,实际上就是一个1维数组
    3.当你想要调整已分配的内存块的大小时,调用HeapReAlloc重新分配内存,改变已经分配好的堆内存块大小
    4.程序结束后调用HeapFree释放HeapAlloc和HeapReAlloc所分配的内存在第2步时,你每调用一次HeapAlloc就分配一个内存块,也就是为你分配了一个一维数组。这个函数的返回值就是指向这个一维数组的指针。你可以把这些指针存放在另一个指针数组里,这个指针数组也是由HeapAlloc分配的。这样一来,指针数组的大小可用HeapReAlloc重新分配,也就是可以改变数组的列数;另外其余每个数组的大小同样可由HeapReAlloc重新分配,即改变了每个一维数组的维数。
      

  2.   

    可以用类(Class1)包装一个一维数组,这个数组是一个动态数组,类提供重新定义这个动态数组的接口以及方位/修改数组元素的方法.这样形成了行坐标
    然后再定义一个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