Массив из диапазона в Excel VBA

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

Dim item As Variant
MsgBox Range("D19:H19").Count    
item = Range("D19:H19").Value
MsgBox LBound(item) & " " & UBound(item)   

согласно моему пониманию, элемент должен содержать 2D-массив... однако я получаю следующий результат 1-ый MsgBox печатает 5 2nd MsgBox печатает 1 1

что происходит?

5 ответов


проблема в LBound и UBound

jtolle был прав насчет LBound и UBound.

LBound(item, 2)

UBound(item, 2)

однако элемент не должен быть затемнен как массив (вы получите ошибку).

Я думаю, что это то, что вы хотите

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Range("D19:H19").Value

MsgBox LBound(item, 2) & " " & UBound(item, 2)

For i = LBound(item, 2) To UBound(item, 2)
  MsgBox item(1, i)
Next

ваш элемент должен содержать 2-D массив, как ожидалось. Если вы вставляете точку останова в свой код и смотрите на маленькое окно "Locals" в Редакторе VBA, вы должны это увидеть. Ваши вызовы LBound и UBound получают границы в первом измерении. Если вы вызываете Lbound(item,2) и UBound (item,2), вы должны получить 1 и 5, Как вы ожидаете.

изменить: То есть, как только вы сделали назначение, item будет выглядеть как то, что вы могли бы объявить как таковое:

Дим пункта(1 до 1, 1 до 5)

одним из запретов программирования VBA является то, что массивы могут иметь произвольные нижние границы. Поэтому весь ваш код должен знать об этом.


это правильно, как есть. Даже если вы выбираете массив ячеек, у вас все равно есть возможность выбрать одну ячейку из массива (и шаг, например, с tab через элементы этого массива)

.Value

получает только содержимое выбранной ячейки.

если вы хотите перечисление массива, вы можете вызвать .Cells()-метод Range-объект

предполагая, что D19 до H19 содержат "a " через" e " соответственно, зову

Range("D19:H19").Cells(2)

возвращает "b". Обратите внимание, что это одномерный массив и может быть 2-мерным. Cells() принимает не более 2 параметров, чтобы указать внутреннее смещение от начала выделения.

надеюсь, что это проясняет... с уважением


попробуйте это:

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Application.Transpose(Range("D19:H19").Value)
MsgBox LBound(item) & " " & UBound(item)

Если вы хотите массив 1D, чтобы присоединиться к нему для предложения IN, например, вы должны транспонировать свой диапазон. Я обнаружил, что вам нужно транспонировать дважды для строки, один раз для столбца данных, подобного этому:

Dim rngRow As Range, rngColumn As Range

Set rngRow = Sheets(1).Range("A1", "Z1")
Set rngColumn = Sheets(1).Range("A1", "A20")

Dim arrRowValues, arrColValues
arrRowValues = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngRow))
arrColValues = WorksheetFunction.Transpose(rngColumn)

Dim numList As String, stringList As String
numList = Join(arrRowValues, ",")
stringList = "'" & Join(arrColValues, "','") & "'"

стоит играть.