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

Я успешно вставил в Excel, используя \ t (см. Ответ BFree) в качестве разделителей столбцов и \ n в качестве разделителей строк.

7
задан Community 9 July 2018 в 19:34
поделиться

5 ответов

The problem is in LBound and UBound

jtolle was correct about the LBound and UBound.

LBound(item, 2)

UBound(item, 2)

However, item must not be dimmed as an array (you'll get an error).

I think this is what you want

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
11
ответ дан 6 December 2019 в 14:06
поделиться

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

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

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

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

2
ответ дан 6 December 2019 в 14:06
поделиться

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

.Value

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

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

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

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

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

1
ответ дан 6 December 2019 в 14:06
поделиться

Попробуйте следующее:

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Application.Transpose(Range("D19:H19").Value)
MsgBox LBound(item) & " " & UBound(item)
1
ответ дан 6 December 2019 в 14:06
поделиться

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

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

0
ответ дан 6 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: