Как найти первую и последнюю заполненную ячейку в диапазоне с пробелами - PullRequest
0 голосов
/ 11 декабря 2018

Для макроса я использую VBA для определения диапазона дат путем нахождения первой и последней заполненной строки.Я нашел способ найти первую и последнюю заполненную строку с помощью End.xlToRight, но это работает, только если это одна непрерывная заполненная строка, например:

183 | 183 | 183 | 183 | 183 | 183 | 183 | 183 | 

Теперь некоторые строки выглядят следующим образом:

183 | 183 | 183 | 183 | empty | 183 | 183 | 183 | 183 | 

Или

183 | 183 | 183 | 183 | 183 | 183 | 183 | 305| 305| 305| 305

Какой хороший способ найти координаты первой и последней заполненных ячеек ряда с пустой ячейкой между ними?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 27 января 2019

В этом случае вам лучше использовать CurrentRegion

Так что, если ваши данные начинаются в ячейке A1, вы можете сделать: Range("A1").CurrentRegion

Текущий отмеченный ответ даст вам регионВСЕХ данных на листе, что не совсем то, о чем спрашивали.

0 голосов
/ 11 декабря 2018

Попробуйте ниже.Работает правильно, только если данные начинаются в столбце А. для строк:

  last_row = ActiveSheet.UsedRange.Rows.Count

для столбцов:

  last_column = ActiveSheet.UsedRange.Columns.Count

Вы также можете использовать:

  last_row = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row

Самый безопасный способиспользовать следующую формулу, которая возвращает последнюю строку, даже если данные не начинаются в столбце A.

  last_row = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
0 голосов
/ 12 декабря 2018

Метод поиска

Sub FindMethod()

  With ThisWorkbook.ActiveSheet

    ' First Used Row
    Dim FirstUR As Long
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then _
        FirstUR = .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count)).Row

    ' First Used Column
    Dim FirstUC As Integer
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then FirstUC = _
        .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), , , 2).Column

    ' Last Used Row
    Dim LastUR As Long
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then LastUR = .Cells.Find("*", , , , , 2).Row

    ' Last Used Column
    Dim LastUC As Integer
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then LastUC = .Cells.Find("*", , , , 2, 2).Column

    ' First Used Cell (First Cell of the Used Range)
    Dim FirstUCell As Range
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then Set FirstUCell = .Cells(.Cells.Find("*", _
        .Cells(.Rows.Count, .Columns.Count)).Row, .Cells.Find("*", _
        .Cells(.Rows.Count, .Columns.Count), , , 2).Column)

    ' Last Used Cell (Last Cell of the Used Range)
    Dim LastUCell As Range
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then Set LastUCell = .Cells(.Cells.Find("*", , , , 1, 2) _
        .Row, .Cells.Find("*", , , , 2, 2).Column)

    ' Used Range (Not UsedRange)
    Dim URng As Range
    If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
        Is Nothing Then Set URng = .Range(.Cells(.Cells.Find("*", _
        .Cells(.Rows.Count, .Columns.Count)).Row, .Cells.Find("*", _
        .Cells(.Rows.Count, .Columns.Count), , , 2).Column), .Cells(.Cells _
        .Find("*", , , , 1, 2).Row, .Cells.Find("*", , , , 2, 2).Column))

    ' Usage - Rows, Columns
    Debug.Print "First Used Row          = " & FirstUR
    Debug.Print "First Used Column       = " & FirstUC
    Debug.Print "Last Used Row           = " & LastUR
    Debug.Print "Last Used Column        = " & LastUC

    ' Usage - Ranges
    If Not FirstUCell Is Nothing Then
      Debug.Print "First Used Cell Address = " & FirstUCell.Address
     Else
      Debug.Print "First Used Cell         = Nothing (Empty Sheet)"
    End If
    If Not LastUCell Is Nothing Then
      Debug.Print "Last Used Cell Address  = " & LastUCell.Address
     Else
      Debug.Print "Last Used Cell          = Nothing (Empty Sheet)"
    End If
    If Not FirstUCell Is Nothing Then
      Debug.Print "Used Range Address      = " & URng.Address
     Else
      Debug.Print "Used Range              = Nothing (Empty Sheet)"
    End If

'    ' Some Thoughts:
'    FirstUR = FirstUCell.Row
'    FirstUC = FirstUCell.Column
'    LastUR = LastUCell.Row
'    LastUC = LastUCell.Column
'
'    FirstUR = URng.Row
'    FirstUC = URng.Column
'    LastUR = URng.Rows.Count - URng.Row + 1
'    LastUC = URng.Columns.Count - URng.Column + 1
'
'    Set FirstUCell = .Cells(FirstUR, FirstUC)
'    Set LastUCell = .Cells(LastUR, LastUC)
'
'    Set FirstUCell = .Cells(URng.Row, URng.Column)
'    Set FirstUCell = URng.Cells(1, 1)
'    Set LastUCell = .Cells(URng.Rows.Count - URng.Row + 1, _
'        URng.Columns.Count - URng.Column + 1)
'    Set LastUCell = URng.Cells(URng.Rows.Count, URng.Columns.Count)
'
'    Set URng = .Range(FirstUCell, LastUCell)
'    Set URng = .Range(.Cells(FirstUR, FirstUC), .Cells(LastUR, LastUC))
'    Set URng = .Range(FirstUCell.Address & ":" & LastUCell.Address)

'    Various Resize and Offset possibilities

  End With

End Sub
0 голосов
/ 11 декабря 2018

Если нет ничего кроме ваших данных, начните с крайнего правого ряда и идите налево.т.е. если ваши данные были в строке 1, то

 .cells(1,columns.count).end(xltoleft)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...