我该如何实现这个功能?
Public Function ArraySlice(arr As Variant, dimension as Long, index as Long) As Variant
    'Implementation here
End Function
假设我想要一个数组切片.我在该维度上指定了一个数组,一个维度和一个索引,我想要切片.
举一个具体的例子,假设我有以下5x4 2D数组
   0  1  2  3  4
  ______________
0| 1  1  2  3  1
1| 3  4  2  1  5
2| 4  5  3  2  6
3| 3  5  2  1  3
如果水平尺寸为1且垂直尺寸为2,则返回值ArraySlice(array, 1, 3)将为1x4 2D阵列.选定的维度2被展平,唯一剩下的值是最初在维度2的索引3处的值:
   0
  ____
0| 3
1| 1
2| 2
3| 1
你会如何在VBA中实现这一点?我能想到的唯一实现将涉及CopyMemory,除非我限制了允许的维度数量并对每种情况进行硬编码.
注意:这是我如何获得数组的尺寸
UPDATE
以下是一些操作示例
对于2D阵列
   0  1  2  3  4
  ______________
0| …我正在为传出消息设计动态缓冲区.数据结构采用具有字节数组缓冲区作为成员的节点队列的形式.不幸的是,在VBA中,Arrays不能成为类的公共成员.
例如,这是禁止编译,不会编译:
'clsTest
Public Buffer() As Byte
您将收到以下错误:"常量,固定长度字符串,数组,用户定义类型和Declare语句不允许作为对象模块的公共成员"
好吧,没关系,我只是把它变成一个私有成员,拥有公共财产访问者......
'clsTest
Private m_Buffer() As Byte
Public Property Let Buffer(buf() As Byte)
    m_Buffer = buf
End Property
Public Property Get Buffer() As Byte()
    Buffer = m_Buffer
End Property
...然后在模块中进行一些测试以确保其有效:
'mdlMain
Public Sub Main()
    Dim buf() As Byte
    ReDim buf(0 To 4)
    buf(0) = 1
    buf(1) = 2
    buf(2) = 3
    buf(3) = 4
    Dim oBuffer As clsTest
    Set oBuffer = New clsTest
    'Test #1, the assignment
    oBuffer.Buffer = buf    'Success!
    'Test #2, …真的不可能在VBA中声明0长度的数组吗?如果我尝试这样做:
Dim lStringArr(-1) As String
我收到一个编译错误,说范围没有值。如果我试图欺骗编译器并在运行时像这样重做:
ReDim lStringArr(-1)
我收到下标超出范围的错误。
我已经略微改变了上面的内容,但是没有运气
Dim lStringArr(0 To -1) As String
我想将变量数组转换为字符串数组。变体数组可能是空的,因为它来自字典的Keys属性。keys属性会返回一组变体。我想要在代码中使用字符串数组,因为我有一些函数可以处理要使用的字符串数组。这是我正在使用的转换函数。由于lMaxIndex = -1,这将导致下标超出范围错误:
Public Function mVariantArrayToStringArray(pVariants() As Variant) As String()
    Dim lStringArr() As String
    Dim lMaxIndex As Long, lMinIndex As Long
    lMaxIndex = UBound(pVariants)
    lMinIndex = LBound(pVariants)
    ReDim lStringArr(lMaxIndex)
    Dim lVal As Variant
    Dim lIndex As Long
    For lIndex = lMinIndex To lMaxIndex
        lStringArr(lIndex) = pVariants(lIndex)
    Next
    mVariantArrayToStringArray = lStringArr
End Function
返回包含一个空字符串的单例数组。注意-这不是我们想要的。我们想要一个空数组-这样遍历它就像什么都不做。但是包含一个空字符串的单例数组通常会起作用,例如,如果我们以后想将所有字符串连接到字符串数组中。
Public Function mVariantArrayToStringArray(pVariants() As Variant) As String()
    Dim lStringArr() …我有一个包含一些数据的数组,比如标题和真实数据.我需要将数组中包含的数据传递给方法,但我绝对希望避免将其复制到另一个数组.
我想到了像ArraySegment这样的东西,但似乎不适用于我的情况(或者我错了?).
那么,如何将数组的一部分传递给方法,因为它本身就是数组?
谢谢您的回复!
干杯
对于变量数组,其中每个元素都是一个双数组,我可以执行以下操作:
Public Declare PtrSafe Sub CopyMemoryArray Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination() As Any, ByRef Source As Any, ByVal Length As Long)
Sub test()
    Dim vntArr() as Variant
    Dim A() as Double
    Dim B() as Double
    Redim vntArr(1 to 10)
    Redim A(1 to 100, 1 to 200)
    vntArr(1) = A
    CopyMemoryArray B, ByVal VarPtr(vntArr(1)) + 8, PTR_LENGTH '4 or 8
    'Do something
    ZeroMemoryArray B, PTR_LENGTH
End Sub
然后A和B将指向内存中的相同块.(设置W = vntArr(1)会创建一个副本.对于非常大的数组,我想避免这种情况.)
我正在尝试做同样的事情,但是有了收藏:
Sub test()
    Dim col as Collection
    Dim A() as …