VBA - заполнить двумерный массив, разделить код на несколько строк - PullRequest
0 голосов
/ 01 августа 2020

Мне нужно заполнить двумерный массив значениями 8 x 5 = 40.

Код ниже, который работает нормально.

Однако я хотел бы разделить строку, в которой я назначаю значения в массив, потому что строка слишком длинная. Мне нужно что-то вроде этого:

  • Arr_labelpositions () = [{"lbl_N", 114, 222, 104, 212; _
    «lbl_NO», 144, 144, 134, 154; _
    «фунт_О», 210, 252, 210, 256; _
    et c ...

Кто-нибудь может мне помочь? Спасибо!

Sub ReadLabelPositions()
  Dim Arr_labelpositions() As Variant   ' Array 8 rows + 5 columns
                                        ' name label, top position, left position, top position2, left position2
  Dim Int_Counter1, Int_Counter2 As Integer
  
  ' fill array
  Arr_labelpositions() = [{"lbl_N",114, 222, 104, 212; "lbl_NO", 144, 144, 134, 154; "lbl_O", 210, 252, 210, 256; "lbl_ZO", 276, 222, 276, 232 ; "lbl_Z",300, 144, 310, 144; "lbl_ZW", 276, 54, 276, 44; "lbl_W", 210, 36, 210, 26; "lbl_NW", 144, 54, 144, 44 }]
  'loop through array
    For Int_Counter1 = 1 To UBound(Arr_labelpositions, 1)
        For Int_Counter2 = 1 To UBound(Arr_labelpositions, 2)
            Debug.Print Arr_labelpositions(Int_Counter1, Int_Counter2)
        Next Int_Counter2
    Next Int_Counter1
    
End Sub

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Боюсь, вы не можете (как вы пытаетесь). Вы можете использовать массив массивов, строить следующим образом и обрабатывать его так:

Sub testSplitArrayBis()
  Dim Arr_labelpositions() As Variant, Int_Counter1 As Long, Int_Counter2 As Long
  Arr_labelpositions() = Array(Array("lbl_N", 114, 222, 104, 212), _
                Array("lbl_NO", 144, 144, 134, 154), _
                Array("lbl_O", 210, 252, 210, 256), _
                Array("lbl_ZO", 276, 222, 276, 232), _
                Array("lbl_Z", 300, 144, 310, 144), _
                Array("lbl_ZW", 276, 54, 276, 44), _
                Array("lbl_W", 210, 36, 210, 26), _
                Array("lbl_NW", 144, 54, 144, 44))
  'loop through array
  For Int_Counter1 = 0 To UBound(Arr_labelpositions)
        For Int_Counter2 = 0 To UBound(Arr_labelpositions(Int_Counter1))
            Debug.Print Arr_labelpositions(Int_Counter1)(Int_Counter2)
        Next Int_Counter2
    Next Int_Counter1
End Sub
0 голосов
/ 01 августа 2020

VBA не поддерживает создание массивов более чем одного измерения из значений c stati. Для достижения вашей цели я бы рекомендовал использовать комбинацию коллекции и массивов. Каждый элемент коллекции будет содержать массив.

Dim myCOlection as Collection
Set myCollection=New COllection
       
With myCollection

    .add Array("lbl_N",114, 222, 104, 212)
    .add Array("lbl_NO", 144, 144, 134, 154)
   ' etc etc.

End with

теперь вы можете ссылаться на элементы в каждом массиве, используя синтаксис

 ThisValue = myCollection(x)(y)

, где x - это элемент в myCollection (на самом деле myCollection.Item (x)), а Y - это индекс в массиве.

Вы также можете посмотреть, даст ли вам использование Scripting.Dictionary, а не Collection, какие-либо преимущества.

...