как выбрать ячейку после блока несмежных данных? - PullRequest
0 голосов
/ 31 октября 2018

у меня под таблицей

tablexample

Я пытаюсь вставить данные в ячейку D7, чтобы край текущего поля.

Я пытался использовать

ActiveSheet.Range("C1").End(xlDown).End(xlToRight).Offset(1, 1).Select

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

после использованного диапазона

Просто используйте это в своем коде:

With ActiveSheet.Cells
  ActiveSheet.Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
      SearchOrder:=xlByRows).Row + 1, _
      .Find(What:="*", SearchDirection:=xlPrevious, _
      SearchOrder:=xlByColumns).Column + 1).Select
End With

Объяснить:

Sub AfterUsedRange()
  Dim LastRow As Long
  Dim LastCol As Integer
  With ActiveSheet.Cells
    'Find the LAST real row
    LastRow = .Find(What:="*", SearchDirection:=xlPrevious, _
        SearchOrder:=xlByRows).Row
    ' Find the LAST real column
    LastCol = .Find(What:="*", SearchDirection:=xlPrevious, _
        SearchOrder:=xlByColumns).Column
  End With
  ActiveSheet.Cells(LastRow + 1, LastCol + 1).Select
End Sub

Чтобы использовать его в макросе:

Sub AfterUsedRange()
  Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
      SearchOrder:=xlByRows).Row + 1, _
      .Find(What:="*", SearchDirection:=xlPrevious, _
      SearchOrder:=xlByColumns).Column + 1).Select
End Sub

или вы можете отремонтировать:

Sub AfterUsedRange()
  Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
      SearchOrder:=xlByRows).Row, _
      .Find(What:="*", SearchDirection:=xlPrevious, _
      SearchOrder:=xlByColumns).Column).Offset(1, 1).Select
End Sub

приписка

Чтобы доказать слухи о том, что функции «UsedRange» и «SpecialCells», по крайней мере, НЕ являются надежными, если их не использовать на самом деле факт

Ссылаясь на строку кода:

ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1).Select

в отличие от моей обновленной строки кода (первой в ответе)

ActiveSheet.Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
    SearchOrder:=xlByRows).Row, _
    .Find(What:="*", SearchDirection:=xlPrevious, _
    SearchOrder:=xlByColumns).Column).Offset(1, 1).Select

Давайте назовем первую строку: SpecialCellsCode .
Давайте назовем вторую строку: MyCode .

В следующей таблице показан простой самоочевидный сценарий.

  A  B  C  D
1 1  1  1
2    2  2
3       3  y
4          x

Давайте назовем 'пересечение' первой строки и первого столбца после 'UsedRange': AfterUsedRangeAddress .

Теперь при открытии рабочего листа. MyCode правильно вычисляет, что AfterUsedRangeAddress равно D4 и выбирает его (x), а также SpecialCellsCode . Когда мы удаляем значение 3 в столбце 'C', MyCode правильно вычисляет, что AfterUsedRangeAddress равно D3, и выбирает его (y), , но SpecialCellsCode неправильно все еще вычисляет D4 и выбирает этот (x).

В заключение, SpecialCellsCode имеет значение , по крайней мере ненадежное, если не непригодное для использования .

Идея даже подумать о таком тесте и продолжить расследование была взята из вопроса VBA: UsedRange не обновляется правильно .

0 голосов
/ 31 октября 2018

Попробуйте эту строку кода:

ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Offset(1, 1).Select
0 голосов
/ 31 октября 2018

ОБНОВЛЕНИЕ: Этот метод будет работать независимо от того, является ли диапазон табличным объектом или нет.

Sub FindLastCell()
Dim rng As Range
Set rng = ActiveSheet.Range("C1").CurrentRegion
Debug.Print rng.Offset(rng.Rows.Count, rng.Columns.Count).Resize(1, 1).Address
End Sub
0 голосов
/ 31 октября 2018

Это таблица Excel, поэтому вы можете сместить, используя размеры таблицы Range, и изменить размер до одной ячейки.

Option Explicit

Public Sub AddressOfCell()
    With ThisWorkbook.Worksheets("Sheet1").ListObjects("table1").Range
        Debug.Print .Offset(.Rows.Count, .Columns.Count).Resize(1, 1).Address
    End With
End Sub

Кредит @Chronocidal намного лучше:

Debug.Print .Cells(.Rows.Count + 1, .Columns.Count + 1).Address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...