Столбцы VBA автоматически объединяются? - PullRequest
0 голосов
/ 06 декабря 2009

Я пишу программу на VBA, которая сначала компилирует Range из ряда ячеек, а затем выполняет цикл по диапазону для сбора данных в ячейках.

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

Чтобы понять, что я имею в виду, если вы запустите эту программу:

Sub test_function ()

Dim My_Range As Range

Dim My_Cell As Variant

Dim i As Integer

i = 0

Set My_Range = Union (ActiveSheet.Range ("A1: A5"), ActiveSheet.Range ("B1: B5"))

Для каждой My_Cell в My_Range

i = i + 1

My_Cell.Value = i

Next My_Cell

End Sub

Вы можете видеть, что диапазон составлен из двух смежных столбцов данных (A1: A5 и B1: B5), но вместо этого ОЖИДАЕМОГО вывода:

1 6

2 7

3 8

4 9

5 10

Вы получаете

1 2

3 4

5 6

7 8

9 10

Это будет воспроизводить это поведение, даже если вы добавляете одну ячейку за раз, используя Set My_Range = ActiveSheet.Range ("A1") Установить My_Range = Union (My_Range, ActiveSheet.Range ("A2")) Установить My_Range = Union (My_Range, ActiveSheet.Range ("A3")) и т.д ...

Есть ли способ сохранить порядок, в котором я добавляю ячейки в диапазон? Или это единственный способ иметь отдельные соседние диапазоны? По крайней мере (если я не могу заставить его сохранить точный порядок), есть ли способ для него сделать столбцы FIRST и THEN строки?

-Daniel

1 Ответ

2 голосов
/ 06 декабря 2009

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

например: -.

(непроверенный код)

Dim ranges As New Collection

ranges.Add(ranges.Count, ActiveSheet.Range("A1"))
ranges.Add(ranges.Count, ActiveSheet.Range("C6"))
// etc.

// then you can loop through the ranges in the order in which they were added
Dim rg As Range
For Each rg in ranges
    // do something with the range
Next rg

// you can also get a reference to the union if you want
Dim unionRange as Range
Set unionRange = ranges(0)
Dim rg2 As Range
For Each rg2 in ranges
    Set unionRange = Application.Union(unionRange, rg2)
Next rg2

// do something with the union
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...