почему я использую Worksheet.UsedRange.Rows.Count получил неправильный результат - PullRequest
0 голосов
/ 20 мая 2018

В VB.NET я хочу получить использованные строки, поэтому я написал, что:

Dim objWorksheet As Excel.Worksheet = workbook.Sheets(2)
Dim lastRow = objWorksheet.UsedRange.Rows.Count

Но я не знаю, почему lastRow является числом немного , чем фактически используемые строкиЯ искал stackoverflow, и кто-то предложил написать так:

Dim range As Excel.Range = objWorkSheet.UsedRange
Dim lastRow = range.Rows.Count

Я пытался и тоже не сработал, num возвращает мало, чем реально использованные строки - это не правила, поэтому я не знаю, какразобраться с этим, любая идея полезна, большое спасибо

РЕДАКТИРОВАТЬ 1 окончательный ответ на изображение:

img1 С помощью ответов я искал этот вопрос это общее понимание последней использованной строки и окончательный ответ

РЕДАКТИРОВАТЬ 2 Сделайте сумму

Код UsedRange.Rows.Count означает от первых строк, в которых есть данные дляпоследние строки с данными, что означает, что между первыми непустыми строками и последними непустыми строками могут быть пустые строки, которые не влияют на результат, но если первая строка пуста, результат будет на единицу меньше фактическогонепустая строка, и если первые две строки empty результат будет на два меньше, поэтому в вопросе о ссылке никогда не используйте UsedRange.Rows.Count, чтобы получить последнюю строку

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Я использую Excel 2013, и, насколько я вижу, свойства UsedRange и UsedRange.Count работают правильно

В предыдущих версиях я помню, что заметил, что они ненадежны, и я думаю, что это может бытьпричины некоторых более старых сообщений, например stackoverflow.com / questions / 11169445 ...

Обратите внимание, что UsedRange - это одиночная прямоугольная область, ограниченная сверху, справа, снизуи самые левые непустые ячейки, так что последняя использованная строка, таким образом, будет

ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1  

. Обратите внимание также на то, что UsedRange ВКЛЮЧАЕТ все ячейки, которые имеют любое содержимое, например границу, внутреннюю раскраску или комментарий,не только те, которые имеют значение или формулу

В зависимости от того, чего вы пытаетесь достичь, использование методов SpecialCells и Find может быть предпочтительным;например, Последняя использованная строка также может быть найдена с помощью

ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
0 голосов
/ 20 мая 2018

Иногда оно только кажется слишком маленьким.Скажем, у нас есть:

enter image description here

и мы запускаем:

Sub aRowsByAnyOtherName1()
    Dim N As Long
    N = ActiveSheet.UsedRange.Rows.Count
    MsgBox N
End Sub

Мы видим:

enter image description here

Причина, по которой мы получаем 3 вместо 4 , заключается в том, что верхний рядрабочий лист не находится в UsedRange!

РЕДАКТИРОВАТЬ # 1:

Если необходимо включить «верх» рабочего листа, используйте:

Sub aRowsByAnyOtherName2()
    Dim N As Long, rng As Range
    Set rng = ActiveSheet.UsedRange
    N = rng.Rows.Count + rng(1).Row - 1
    MsgBox N
End Sub
0 голосов
/ 20 мая 2018

Старайтесь избегать UsedRange.Это может вводить в заблуждение.Например, если вы заполните диапазон A1:B5 и очистите содержимое столбца B, то UsedRange.Columns.Count вернет 2 - , поскольку Excel запоминает ячейки с форматированием и включает их в UsedRange.

ОБНОВЛЕНИЕ

Чтобы получить real последний столбец и строку, используйте следующий код:

lRealLastRow = _
    Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row
lRealLastColumn = _
    Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column

ОБНОВЛЕНИЕ 2 img2

0 голосов
/ 20 мая 2018

Это немного похоже на то, что вы подразумеваете под «использованными» строками.Если у вас есть пустые строки в начале листа, вы получите неправильный номер последней строки, но вы получите количество строк использованного диапазона.

Попробуйте выполнить следующее с пустой строкой 1.

Option Explicit

Sub test()
    Dim rng As Range
    Set rng = ActiveSheet.UsedRange
    Debug.Print rng.Rows.Count                   '2
    Debug.Print ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row '3

End Sub

Это дает 2 от UsedRange.Rows.Count и 3 от использования xlCellTypeLastCell с данными, как показано ниже:

Last row

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