2015-08-26 14 views
5

Esatto, quindi utilizzando Python vorrei creare un elenco multidimensionale e impostare i valori su una riga di codice (come di seguito).VBA - Impostazione di valori di array multidimensionali su una riga

aryTitle = [["Desciption", "Value"],["Description2", "Value2"]] 
print(aryTitle[0,0] + aryTitle[0,1]) 

Mi piace il modo in cui posso impostare i valori su una riga. In VBA faccio questo:

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))  

C'è un modo per impostare i valori in una riga di codice?

+0

per quanto ne so, se avete i valori in un foglio di lavoro è possibile utilizzare i cicli per aggiungere i valori all'array. – psychicebola

+0

Definisci 'Su una riga'. Intendi una fila di celle di Excel? È possibile farlo utilizzando il comando Intervallo, che seleziona una cella in base a riga e colonna. Utilizzare un ciclo per scorrere le colonne e modificare il metodo Range.formula in aryTitle (x, y). –

+1

se è necessario un array a due dimensioni utilizzare l'oggetto 'library'. Fornisce coppie di valori chiave ed è più facile da ridimensionare. – psychicebola

risposta

3

Non nativamente, no. Ma puoi scrivere una funzione per questo. L'unica ragione per cui Python può farlo è che qualcuno ha scritto una funzione per farlo. La differenza è che avevano accesso alla fonte in modo che potessero fare la sintassi come preferivano. Sarai limitato alla sintassi della funzione VBA. Ecco una funzione per creare un array 2-dim. Non è tecnicamente "una riga di codice", ma gettala nel tuo modulo MUtilities e dimenticatene e sembrerà una riga di codice.

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 

Se si fornisce un numero dispari di argomenti, ignora l'ultimo. Se si utilizzano array 3-dim, è possibile scrivere una funzione per questo. Potresti anche scrivere una funzione di fantasia in grado di gestire qualsiasi oscuramento, ma non sono sicuro che ne valga la pena. E se stai usando più di 3 dim-array, probabilmente non hai bisogno del mio aiuto per scrivere una funzione.

L'uscita dal sopra

0    0   Description 
0    1   Value 
1    0   Description2 
1    1   Value2 
3

È possibile scrivere una funzione di supporto:

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 

Utilizzato in questo modo:

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