Использование типа данных «диапазон» аналогично «коллекции» - VBA - PullRequest
0 голосов
/ 24 марта 2019

У меня есть проблема, я хотел бы знать, может ли кто-нибудь помочь мне ... Я хотел бы использовать тип данных "диапазон" аналогично тому, как работает "сбор".Я хотел бы использовать счетчик и цикл: «rng (i) = значение», где я могу быть 1, 7, 100 и т. Д. Следовательно, если я добавлю «A1, A5, C3, D6» к rng, я бы хотел«rng (3) = 3» для установки ячейки C3 равной 3. Использование «для каждого x в диапазоне» не является опцией в отношении того, как должен работать код.Можно ли заставить это работать?

Альтернативное решение для меня было бы, если бы я мог добавить все отдельные ячейки в 7 различных коллекциях к одной переменной диапазона типов данных.

Есть предложения?

С уважением, Александр

Ответы [ 3 ]

1 голос
/ 24 марта 2019

К сожалению, это сработало бы, только если ваша коллекция содержала один непрерывный диапазон.

С набором отключенных ячеек каждая ячейка является собственной Area, и попытка прямого индексирования объединенного Range даст вам неожиданные результаты: индекс будет применен к первая область, и, поскольку это одна ячейка, она будет выходить за границы , например, для диапазона A1, A5, C3, D6, rng(3) будет относиться к ячейке A3 (третья ячейка вниз относительно A1).

Чтобы индексирование работало так, как вам нужно, вам нужно явно указать свойство Areas:

Dim coll As Range

' Set initial contents - has to be at least one cell, can be more
Set coll = some_worksheet.Range("A1,A5,C3")  

' This is how you add to already stored "collection"
Set coll = Application.Union(coll, some_worksheet.Range("D6"))

coll.Areas(3) = 42  ' Sets C3 to 42
1 голос
/ 24 марта 2019

Работает с любыми диапазонами, смежными или иными

Sub Test()
    Dim rng As Range
    Set rng = Sheet1.Range("A1,B5,E7:E9")

    Dim v As Variant, a As Range, r As Range

    ReDim v(1 To 1)
    For Each a In rng.Areas
        For Each r In a
            v(UBound(v)) = r.Value
            ReDim Preserve v(1 To UBound(v) + 1)
        Next
    Next
    ReDim Preserve v(1 To UBound(v) - 1)

    Debug.Print v(1)
    Debug.Print v(2)
    Debug.Print v(3)

End Sub
1 голос
/ 24 марта 2019

Я не совсем точно понимаю, о чем вы спрашиваете.

Возможно, это то, что вы ищете:

MSDN: циклический просмотр диапазонаЯчейки

Другой простой способ перебрать диапазон - использовать цикл For Each ... Next с набором ячеек, указанным в свойстве Range .Visual Basic автоматически устанавливает переменную объекта для следующей ячейки при каждом запуске цикла.Следующая процедура перебирает диапазон A1: D10, устанавливая в 0 (ноль) любое число, абсолютное значение которого меньше 0,01.

Sub RoundToZero2() 
 For Each c In Worksheets("Sheet1").Range("A1:D10").Cells 
 If Abs(c.Value) < 0.01 Then c.Value = 0 
 Next 
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...