Как перебрать диапазон ячеек, если в Excel VBA известен только столбец? - PullRequest
0 голосов
/ 01 марта 2012

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

Dim Col
Dim found As Boolean
Dim cellRange As Range

    found = Cells.Find(What:="My_Search_Text", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate

    'Take that column as the range.
    If (found) Then
        Col = ActiveCell.Column
        cellRange = ActiveSheet.Range(Col, ActiveSheet.Range(Col).End(xlDown)).Select

Цель здесь - получить правильный диапазон ячеек и пройти через них, однако я не нахожусь в части цикла, поскольку последняя строка - это та, которая вообще не работает.

Так, каков правильный синтаксис для этой последней строки и есть ли лучший способ выполнить то, что я пытаюсь сделать?

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

Попробуйте следующее, которое я протестировал с некоторыми ситуациями.

Я включил примечания об изменениях, которые я сделал, но возвращаюсь с вопросами, если что-то неясно.

Option Explicit
Sub FindRange()

  Dim RangeStart As Range
  Dim RangeEndPlusOne As Range
  Dim RangeEntire As Range

  ' Better to explicitly identify the sheet being searched
  With Sheets("Source")
    ' Do not attempt to activate the target cell.  Instead get it as a range.
    ' Are you sure about "LookAt:=xlPart"?  "LookAt:=xlWhole" might be better
    ' I have explicitly started the search from cell A1 rather than the current
    ' position of the cursor.
    Set RangeStart = .Cells.Find(What:="My_Search_Text", After:=.Range("A1"), _
                                LookIn:=xlValues, LookAt:=xlPart, _
                                SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                                MatchCase:=False, SearchFormat:=False)

    If RangeStart Is Nothing Then
      ' My "My_Search_Text" not found
    Else
      ' If the cell below RangeStart is empty, End(xlDown) will jump to
      ' the bottom of the column or the next cell in the column with a value.
      ' Search down the column for an empty cell
      Set RangeEndPlusOne = .Columns(RangeStart.Column).Find(What:="", _
                             After:=RangeStart, _
                             LookIn:=xlValues, LookAt:=xlWhole, _
                             SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                             MatchCase:=False, SearchFormat:=False)
      ' I ought to test for not found but I assume there is a blank cell below
      ' RangeStart

      Set RangeEntire = .Range(RangeStart, RangeEndPlusOne.Offset(-1, 0))

      Debug.Print "Start  " & RangeStart.Address
      Debug.Print "End+1  " & RangeEndPlusOne.Address
      Debug.Print "Entire " & RangeEntire.Address
    End If

  End With

End Sub
2 голосов
/ 01 марта 2012

Как насчет этого, чтобы получить ваш последний ряд?

LastRow = SheetToCheck.Cells(ActiveCell.Row, ActiveCell.Column).End(xlDown).Row

Это вернет последний ряд перед ячейкой пробела / пробела.

Затем установите свой диапазон, используя:

Set cellRange = SheetToCheck.Range(SheetToCheck.Cells(ActiveCell.Row, ActiveCell.Column), SheetToCheck.Cells(LastRow, ActiveCell.Column))
2 голосов
/ 01 марта 2012

Когда вы используете объекты в VBA, вам нужно использовать ключевое слово Set при назначении переменной, ваш первый оператор должен быть:

Set found = Cells.Find(What:="My_Search_Text", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

Кстати, вы не можете назначить и используйте метод как Activate.Поэтому я удалил его в конце заявления.

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