VBA-在一行中设置多维数组值

VBA-在一行中设置多维数组值,vba,multidimensional-array,Vba,Multidimensional Array,好的,所以我将使用Python创建一个多维列表,并在一行代码上设置值(如下所示) 我喜欢在一行上设置值的方式。在VBA中,我通过以下方式完成此操作: Dim aryTitle(0 To 1, 0 To 1) As String aryTitle(0, 0) = "Description" aryTitle(0, 1) = "Value" aryTitle(1, 0) = "Description2" aryTitle(1, 1) = "Value2" MsgBox (aryTitle(0, 0)

好的,所以我将使用Python创建一个多维列表,并在一行代码上设置值(如下所示)

我喜欢在一行上设置值的方式。在VBA中,我通过以下方式完成此操作:

Dim aryTitle(0 To 1, 0 To 1) As String
aryTitle(0, 0) = "Description"
aryTitle(0, 1) = "Value"
aryTitle(1, 0) = "Description2"
aryTitle(1, 1) = "Value2"
MsgBox (aryTitle(0, 0) & aryTitle(0, 1))    

有没有办法在一行代码中设置值

不是本地的,不是。但是你可以为它编写一个函数。Python能够做到这一点的唯一原因是有人编写了一个函数。不同之处在于,他们可以访问源代码,因此可以随意生成语法。您将仅限于VBA函数语法。这里有一个创建二维阵列的函数。从技术上讲,这不是“一行代码”,但把它扔进你的Mutrilities模块,忘掉它,它会感觉像一行代码

Public Function FillTwoDim(ParamArray KeyValue() As Variant) As Variant

    Dim aReturn() As Variant
    Dim i As Long
    Dim lCnt As Long

    ReDim aReturn(0 To ((UBound(KeyValue) + 1) \ 2) - 1, 0 To 1)

    For i = LBound(KeyValue) To UBound(KeyValue) Step 2
        If i + 1 <= UBound(KeyValue) Then
            aReturn(lCnt, 0) = KeyValue(i)
            aReturn(lCnt, 1) = KeyValue(i + 1)
            lCnt = lCnt + 1
        End If
    Next i

    FillTwoDim = aReturn

End Function

Sub test()

    Dim vaArr As Variant
    Dim i As Long
    Dim j As Long

    vaArr = FillTwoDim("Description", "Value", "Description2", "Value2")

    For i = LBound(vaArr, 1) To UBound(vaArr, 1)
        For j = LBound(vaArr, 2) To UBound(vaArr, 2)
            Debug.Print i, j, vaArr(i, j)
        Next j
    Next i

End Sub

您可以编写一个助手函数:

Function MultiSplit(s As String, Optional delim1 As String = ",", Optional delim2 As String = ";") As Variant
    Dim V As Variant, W As Variant, A As Variant
    Dim i As Long, j As Long, m As Long, n As Long
    V = Split(s, delim2)
    m = UBound(V)
    n = UBound(Split(V(0), delim1))
    ReDim A(0 To m, 0 To n)
    For i = 0 To m
        For j = 0 To n
            W = Split(V(i), delim1)
            A(i, j) = Trim(W(j))
        Next j
    Next i
    MultiSplit = A
End Function
这样使用:

Sub test()
    Dim A As Variant
    A = MultiSplit("Desciption, Value; Description2, Value2")
    Range("A1:B2").Value = A
End Sub

据我所知,如果工作表中有值,可以使用循环将值添加到数组中。定义“在一行上”。你是说一行Excel单元格吗?可以使用Range命令执行此操作,该命令基于行和列选择单元格。使用循环遍历列,并将Range.formula方法更改为aryTitle(x,y)。如果需要二维数组,请使用
对象。它提供了
键值对
并且更容易调整大小。对不起-我现在明白你的意思是“在一行代码中设置它”而不是“在一行Excel单元格中设置值”。我的评论与此无关。请注意,如果您的值已经作为一个区域[Excel单元格组]存在于工作表中,您可以直接将整个区域复制到另一个区域,但我不相信您可以直接使用字符串数组来实现这一点;循环可能是您唯一的选择。
arytile=Array(Array(“description”、“Value”)、Array(“Description2”、“Value2”))
。。。但这将为您提供
Debug.Print(aryTitle(0)(0)+“:“+aryTitle(0)(1))
Function MultiSplit(s As String, Optional delim1 As String = ",", Optional delim2 As String = ";") As Variant
    Dim V As Variant, W As Variant, A As Variant
    Dim i As Long, j As Long, m As Long, n As Long
    V = Split(s, delim2)
    m = UBound(V)
    n = UBound(Split(V(0), delim1))
    ReDim A(0 To m, 0 To n)
    For i = 0 To m
        For j = 0 To n
            W = Split(V(i), delim1)
            A(i, j) = Trim(W(j))
        Next j
    Next i
    MultiSplit = A
End Function
Sub test()
    Dim A As Variant
    A = MultiSplit("Desciption, Value; Description2, Value2")
    Range("A1:B2").Value = A
End Sub