Массив из диапазона в Excel VBA - PullRequest
7 голосов
/ 11 октября 2009

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

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

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

Что не так?

Ответы [ 5 ]

11 голосов
/ 11 октября 2009

Проблема в 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 голосов
/ 11 октября 2009

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

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

Тусклый предмет (от 1 до 1, от 1 до 5)

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

1 голос
/ 15 октября 2009

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

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Application.Transpose(Range("D19:H19").Value)
MsgBox LBound(item) & " " & UBound(item)
1 голос
/ 11 октября 2009

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

.Value

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

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

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

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

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

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

0 голосов
/ 14 октября 2009

Если вы хотите, чтобы одномерный массив присоединился к нему для предложения 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, "','") & "'"

стоит игры.

...