несколько несмежных столбцов в массив - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь максимально эффективно загрузить 4 столбца в массив.
Я пытался

dim ar
ar = sheet1.Range("C2:C2681,G2:G2681,J2:J2681,T2:T2681")

, но в массив загружается только первый столбец.
Я также пытался

    ar = .Range("C2:T" & lastRow)
    ar = Application.Index(ar, , Array(1, 5, 19))

но это дает мне ошибку несоответствия типов.

Какой-нибудь умный прием для этой цели?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вы всегда можете хранить эти столбцы в зубчатом массиве , массиве массивов.Синтаксис на самом деле довольно прост в VBA;вы можете хранить все .Value диапазона (в виде массива) внутри другого (ранее затемненного) массива.

Когда вы работаете с диапазоном, который включает несколько поддиапазонов (смежных или нет), вы можете получить к ним доступ отдельно, зацикливаясь на свойстве .Areas этого диапазона .

Единственное, с чем вам следует быть осторожным, это индексы, потому что синтаксис немного прикольный, и в вашем конкретном примере вы не начинаете с первой строки.

Option Explicit

Sub NonContiguousRanges()

    Dim rng As Range
    Set rng = Range("C2:C20, G2:G20, J2:J20, T2:T20")

    Dim jagged As Variant
    ReDim jagged(1 To rng.areas.count)

    Dim i As Long
    For i = 1 To rng.areas.count
        jagged(i) = rng.areas(i).Value2
    Next i


    '=-~ examples of accessing the values ~-='

    'first value, C2
    MsgBox jagged(1)(1, 1)

    'last  value, T20
    MsgBox jagged(4)(19, 1)
    MsgBox jagged(UBound(jagged))(UBound(jagged(UBound(jagged))), 1)

End Sub

Я имею в виду простопосмотри на все эти UBound с ... у меня немного болит голова, просто я все понял!

0 голосов
/ 19 сентября 2018

ReDim с Preserve позволит вам изменять только последний ранг, но вы можете сначала сместить значения элементов массива.

dim ar as variant, i as long

ar = sheet1.Range("C2:T2681").value

for i=lbound(ar, 1) to ubound(ar, 1)
    ar(i, 2) = ar(i, 5)   'move column G to 2nd
    ar(i, 3) = ar(i, 8)   'move column J to 3rd
    ar(i, 4) = ar(i, 18)  'move column T to 4th
next i

redim preserve ar(lbound(ar, 1) to ubound(ar, 1), lbound(ar, 2) to 4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...