Прокрутите ячейки и добавьте в диапазон

Как бы я перебирал ячейки B1-J1 и добавлял их в диапазон, если они отвечают определенным критериям. Например.

Dim Range1 As Range
For i = 1 to 9
If Range("A1").Offset(1,i) meets a certain criteria Then
**Add that cell to Range1**
End If
Next i

Я не уверен, как подойти к части добавления определенных ячеек в Range1.

Спасибо за помощь!

Ответ 1

Что-то вроде этого, используя Union чтобы склеить ваш диапазон

  1. Обратите внимание, что For each циклы быстрее, чем For я = 1 to x подхода For я = 1 to x
  2. Вы вполне можете использовать SpecialCells для быстрого определения вашего нового диапазона (например, любые пробелы, любые ошибки, любые формулы и т.д.),

    Sub Test()
      Dim rng1 As Range
      Dim rng2 As Range
      Dim c As Range
      Set rng1 = Range("B1:J1")
    
      For Each c In rng1
        ' Add cells to rng2 if they exceed 10
        If c.Value > 10 Then
            If Not rng2 Is Nothing Then
            ' Add the 2nd, 3rd, 4th etc cell to our new range, rng2
            ' this is the most common outcome so place it first in the IF test (faster coding)
                Set rng2 = Union(rng2, c)
            Else
            ' the first valid cell becomes rng2
                Set rng2 = c
            End If
        End If
      Next
    End Sub
    

Ответ 2

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

strX="": _
For Each cllX in Range( ActiveCell, Cells( Cells.SpecialCells(xlCellTypeLastCell ).Row, ActiveCell.Column) ): _
strX=strX & iif(cllX.text="","",iif(strX="","",",")& cllX.address): _
Next: _
Range(strX).Select

Но пока это интуитивно понятно, оно работает только на 35-50 ячейках. После этого VBA возвращает ошибку 1004.

Run-time error '1004':
Application-defined or object-defined error

Более надежно использовать функцию Union.

Set rngX=ActiveCell: _
For Each cllX in Range( ActiveCell, Cells( cells.SpecialCells(xlCellTypeLastCell ).Row, ActiveCell.Column) ): _
Set rngX=iif( cllX.text="", rngX, Union(rngX, cllX) ): _
Next: _
rngX.Select

Он настолько короток и интуитивен, что я просто бросаю его после каждого использования.