Добрый день! Уважаемые форумчане, Нужна обработка только видимых строк значений в таблице. Вот таким циклом обрабатываю, табличку: —
Visual Basic | ||
|
Выделяю несколько строк, или столбец ячеек и всё работает, на первый взгляд нормально. Но стоит выделить ОДНУ строку (ячейку)…
Z — номер строки активной (выбранной) ячейки, если выделена только одна ячейка, почему-то определяется как — 1. Т.е. Z = 1, а это не верно. Ведь я выделяю не первую строку, а например 15-ю. Можно ли справится с таким вероломством кода?
eonka Пользователь Сообщений: 13 |
#1 20.11.2022 08:35:13 Добрый день,
Прикрепленные файлы
Изменено: eonka — 20.11.2022 08:38:24 |
||
Ігор Гончаренко Пользователь Сообщений: 13746 |
#2 20.11.2022 10:36:51
похоже SpecialCells(xlCellTypeVisible) там вообще не нужно
Изменено: Ігор Гончаренко — 20.11.2022 10:44:48 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||||
eonka Пользователь Сообщений: 13 |
Так и не смогла прикрутить эту конструкцию к коду: выходило, что либо копирует только все скрытые строки, то копирует и видимые и скрытые. В итоге сделала свой макрос через костыль с копированием диапазона без скрытых ячеек в другую книгу. И еще, чтобы новую тему не создавать: почему если я меняю Workbooks(«start.xlsx») на thisworkbook, то почему возникает type mismatch? Разве, по сути, происходит не то же самое, только в первом случае я указываю имя файла, а во втором книгу, из которой запускается макрос? |
МатросНаЗебре Пользователь Сообщений: 5516 |
#4 21.11.2022 14:49:28
|
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#5 21.11.2022 15:00:37
это что за зверь такой? Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
МатросНаЗебре Пользователь Сообщений: 5516 |
#6 21.11.2022 15:08:13
Только сейчас заметил, что обитает в коде ) |
||
eonka Пользователь Сообщений: 13 |
#7 21.11.2022 16:05:50 Спасибо огромное. Вот теперь разобралась. И с колонками скрытыми что делать тоже дошло. А Local, я так понимаю, там не нужен) Изменено: eonka — 21.11.2022 16:07:28 |
Содержание
- Свойство Application.Rows (Excel)
- Синтаксис
- Примечания
- Пример
- Поддержка и обратная связь
- Vba excel количество видимых строк
- Как посчитать количество видимых строк в Excel
- В отфильтрованном списке
- Только с критериями
- Vba excel количество видимых строк
- Подсчитать количество видимых строк в отфильтрованном списке в Excel
- Как подсчитать количество видимых строк в отфильтрованном списке в Excel?
- Связанные функции
- Родственные формулы
- Kutools for Excel — поможет вам выделиться из толпы
- Как получить количество строк в EXCEL VBA
- 4 ответа
Свойство Application.Rows (Excel)
Возвращает объект Range , представляющий все строки на активном листе. Если активный документ не является листом, свойство Rows завершается ошибкой . Объект Range предназначен только для чтения.
Синтаксис
expression. Строк
выражение: переменная, представляющая объект Application.
Примечания
Использование этого свойства без квалификатора объекта эквивалентно использованию ActiveSheet.Rows.
При применении к объекту Range , который является множественным выделением, это свойство возвращает строки только из первой области диапазона. Например, если объект Range имеет две области — A1:B2 и C3:D4, selection.Rows.Count возвращает 2, а не 4.
Чтобы использовать это свойство в диапазоне, который может содержать несколько выделенных элементов, проверьте Areas.Count, чтобы определить, является ли диапазон множественным выбором. Если это так, выполните цикл по каждой области диапазона, как показано в третьем примере.
Пример
В этом примере удаляется третья строка на листе Sheet1.
В этом примере удаляются строки в текущем регионе на листе, где значение одной ячейки в строке совпадает со значением в ячейке в предыдущей строке.
В этом примере отображается количество строк в выделенном фрагменте на листе Sheet1. Если выбрано несколько областей, в примере выполняется цикл по каждой области.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Vba excel количество видимых строк
200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Function GetAddresses() As Address()
Dim addrs() As Address, paralast As Integer
Dim Y As Range, firstCell As Range
ReDim addrs(0)
paralast = -1
With ActiveSheet
Set Y = .Range(«A1:A» & .Cells(.Rows.Count, «A»).End(xlUp).Row)
End With
For Each firstCell In Y.Cells.SpecialCells(xlCellTypeVisible)
With firstCell
paralast = paralast + 1
ReDim Preserve addrs(paralast)
addrs(paralast).Street = .Offset(i, 0).Value
addrs(paralast).Building = .Offset(i, 1).Value
addrs(paralast).Comments = .Offset(i, 2).Value
End With
Next
GetAddresses = addrs
End Function
200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Function GetAddresses() As Address()
Dim addrs() As Address, paralast As Integer
Dim Y As Range, firstCell As Range
ReDim addrs(0)
paralast = -1
With ActiveSheet
Set Y = .Range(«A1:A» & .Cells(.Rows.Count, «A»).End(xlUp).Row)
End With
For Each firstCell In Y.Cells.SpecialCells(xlCellTypeVisible)
With firstCell
paralast = paralast + 1
ReDim Preserve addrs(paralast)
addrs(paralast).Street = .Offset(i, 0).Value
addrs(paralast).Building = .Offset(i, 1).Value
addrs(paralast).Comments = .Offset(i, 2).Value
End With
Next
GetAddresses = addrs
End Function
200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Function GetAddresses() As Address()
Dim addrs() As Address, paralast As Integer
Dim Y As Range, firstCell As Range
ReDim addrs(0)
paralast = -1
With ActiveSheet
Set Y = .Range(«A1:A» & .Cells(.Rows.Count, «A»).End(xlUp).Row)
End With
For Each firstCell In Y.Cells.SpecialCells(xlCellTypeVisible)
With firstCell
paralast = paralast + 1
ReDim Preserve addrs(paralast)
addrs(paralast).Street = .Offset(i, 0).Value
addrs(paralast).Building = .Offset(i, 1).Value
addrs(paralast).Comments = .Offset(i, 2).Value
End With
Next
GetAddresses = addrs
End Function
Источник
Как посчитать количество видимых строк в Excel
В отфильтрованном списке
Если вы хотите подсчитать количество видимых элементов в отфильтрованном списке, вы можете использовать функцию ПРОМЕЖУТОЧНЫЕ.ИТОГИ, которая автоматически игнорирует строки, которые скрыты с помощью фильтра.
Функция ПРОМЕЖУТОЧНЫЕ.ИТОГИ может выполнять вычисления, как СЧЁТ, СУММ, МАКС, МИН, и многие другие.
Что делает ПРОМЕЖУТОЧНЫЕ.ИТОГИ: особенно интересным и полезным является то, что она автоматически игнорирует элементы, которые не видны в отфильтрованном списке или таблице. Это делает ее идеальной для показа того, сколько элементов видно в списке, промежуточных итогов видимых строк и т.д.
Следуя примеру, чтобы подсчитать количество не пустых строк, видимых, когда фильтр активен, используйте:
Если вы скрываете строки вручную (т.е. правой кнопкой мыши, Скрыть), а не с помощью автоматического фильтра используйте эту версию вместо той:
Только с критериями
=СУММПРОИЗВ((диапазон=критерий)*( ПРОМЕЖУТОЧНЫЕ.ИТОГИ (3; СМЕЩ (диапазон; ЧСТРОК;0;1))))
Для подсчета видимых строк только с критериями, вы можете использовать довольно сложную формулу, основанную на СУММПРОИЗВ, ПРОМЕЖУТОЧНЫЕ.ИТОГИ и СМЕЩ.
Функция ПРОМЕЖУТОЧНЫЕ.ИТОГИ может легко генерировать суммы и счетчики для скрытых и не скрытых строк. Тем не менее, она не в состоянии справиться с критериями (т.е. как СЧЁТЕСЛИ или СУММЕСЛИ).
Решение состоит в том, чтобы использовать СУММПРОИЗВ, применив с функцией ПРОМЕЖУТОЧНЫЕ.ИТОГИ (через СМЕЩ) и критерии. В показанном примере формула в С12:
=СУММПРОИЗВ ((C5:C8 = С10) * (ПРОМЕЖУТОЧНЫЕ.ИТОГИ (103;СМЕЩ(C5;СТРОКА(C5:C8) — МИН(СТРОКА(C5:C8));0))))
Суть этой формулы вычисление массива внутри СУММПРОИЗВ. Первый массив применяет критерии, а второй массив обрабатывает «проблему видимости».
Критерии применяется с частью формулы:
Который генерирует массив следующим образом:
Где ИСТИНА означает «отвечает критериям». Обратите внимание, что поскольку мы используем умножение (*) внутри первого (и только) массива, значения ИСТИНА/ЛОЖЬ будут автоматически преобразованы:
Для учета видимости применяется фильтр с использованием ПРОМЕЖУТОЧНЫЕ.ИТОГИ.
ПРОМЕЖУТОЧНЫЕ.ИТОГИ может исключить скрытые строки в различных вычислениях, поэтому мы можем использовать ее в этом случае, создав «фильтр», чтобы исключить скрытые строки внутри СУММПРОИЗВ. Проблема, однако, в том, что ПРОМЕЖУТОЧНЫЕ.ИТОГИ рассчитывает единственное число, в то время как нам нужен массив, чтобы использовать его успешно внутри СУММПРОИЗВ.
Хитрость заключается в том, чтобы использовать СМЕЩ, подающую ПРОМЕЖУТОЧНЫЕ.ИТОГИ одну ссылку на строку, так что смещение будет рассчитывать один результат для каждой строки.
Конечно, для этого требуется еще один трюк, который должен дать СМЕЩ массив, содержащий один номер для каждой строки, начиная с нуля. Мы делаем это с помощью:
Что будет генерировать массив вроде этого:
Таким образом, второй массив, который обрабатывает видимость с помощью ПРОМЕЖУТОЧНЫЕ.ИТОГИ, генерируется следующим образом:
= ПРОМЕЖУТОЧНЫЕ.ИТОГИ(103;СМЕЩ (C5;СТРОКА(C5: C8) — МИН(СТРОКА(C5: C8)); 0))
Источник
Vba excel количество видимых строк
Подсчитать количество видимых строк в отфильтрованном списке в Excel
Чтобы подсчитать количество видимых строк в отфильтрованном списке в Excel, вы можете применить функцию ПРОМЕЖУТОЧНЫЙ ИТОГ, чтобы легко это сделать.
Как подсчитать количество видимых строк в отфильтрованном списке в Excel?
Предположим, у вас есть таблица с отфильтрованными данными, как показано на скриншоте ниже, чтобы подсчитать, сколько строк отображается, вы можете сделать следующее.
Общая формула
=SUBTOTAL(3,range)
аргументы
Как пользоваться этой формулой?
1. Выберите пустую ячейку для вывода результата.
2. Введите в нее приведенную ниже формулу и нажмите Enter .
=SUBTOTAL(3,B3:B15)
Ноты:
=SUBTOTAL(3,B3:B15)
=SUBTOTAL(103,B3:B15)
Как работает эта формула?
=SUBTOTAL(3,B3:B15)
Функция ПРОМЕЖУТОЧНЫЙ ИТОГ полезна для игнорирования скрытых элементов в отфильтрованном списке или таблице. Его можно использовать для выполнения различных расчетов, таких как среднее значение, количество, максимум и т. Д.
Связанные функции
ПРОМЕЖУТОЧНЫЙ ИТОГ в Excel
Функция Excel ПРОМЕЖУТОЧНЫЙ ИТОГ возвращает промежуточный итог в списке или базе данных.
Родственные формулы
Подсчет уникальных значений в диапазоне
В этом руководстве объясняется, как подсчитывать только уникальные значения среди дубликатов в списке в Excel с указанными формулами.
Подсчет уникальных значений с критериями
Это пошаговое руководство помогает подсчитывать только уникальные значения на основе заданных критериев в другом столбце.
Подсчет видимых строк с критериями
В этом руководстве подробно описаны шаги, которые помогут подсчитать видимые строки по критериям.
Используйте СЧЁТЕСЛИ для несмежного диапазона
В этом пошаговом руководстве показано, как использовать функцию countif для несмежного диапазона в Excel.
Kutools for Excel — поможет вам выделиться из толпы
Хотите быстро и качественно выполнять свою повседневную работу? Kutools for Excel предлагает мощные расширенные функции 300 (объединение книг, суммирование по цвету, разделение содержимого ячеек, преобразование даты и т. д.) и экономит для вас 80% времени.
- Разработан для 1500 рабочих сценариев, помогает решить 80% проблем с Excel.
- Уменьшите количество нажатий на клавиатуру и мышь каждый день, избавьтесь от усталости глаз и рук.
- Станьте экспертом по Excel за 3 минуты. Больше не нужно запоминать какие-либо болезненные формулы и коды VBA.
- 30-дневная неограниченная бесплатная пробная версия. 60-дневная гарантия возврата денег. Бесплатное обновление и поддержка 2 года.
Источник
Как получить количество строк в EXCEL VBA
Разрабатываю дашборд в excel. И я ищу для расчета количества строк. (Сколько записей присутствует) ..
Поскольку есть несколько пустых ячеек, я решил пойти снизу вверх. Я использую следующие
После этого выполнения активная ячейка находится в A113, что означает, что количество строк равно 113.
У меня вопрос, как получить этот номер 113 из активной ячейки?
4 ответа
Вы можете использовать это:
lastrow будет содержать номер последней пустой строки в столбце A , в вашем случае 113
Вот что я обычно использую для этого:
Это вернет количество непустых ячеек в столбце «A», которое, я думаю, вам нужно. Надеюсь это поможет.
Лучший способ получить количество строк / записей (в большинстве случаев) — использовать .UsedRange.Rows.Count . Вы можете присвоить возвращаемое значение переменной следующим образом:
Если вы используете функцию, которая включает столбец (например, столбец A), как показано в других примерах, это даст вам только количество строк в этом столбце, которое может или не может быть тем, что вы собираетесь делать. Одно предостережение: если вы отформатировали строки под последней строкой со значением, он вернет этот номер строки.
Если есть небольшая вероятность, что последняя строка рабочего листа не пуста, вы должны добавить проверку IsEmpty() в решение @simoco. Следовательно; Ниже приведена функция, которая возвращает последнюю использованную строку и проверяет, пуста ли последняя строка рабочего листа:
Источник
Функция предназначена для получения двумерного массива данных из видимых строк листа Excel.
Например, нас интересует массив, начиная со второй строки, шириной 5 столбцов.
Если все строки на листе — видимые, то все делается просто, одной строкой кода:
arr = Range(Range("a2"), Range("a" & Rows.Count).End(xlUp)).Resize(, 5).Value
А если на листе включен автофильтр (некоторые строки скрыты), а нам надо получить в массиве данные только из видимых строк?
Тогда на помощь придет функция GetVisibleRowsArray:
arr = GetVisibleRowsArray(ActiveSheet, 2, 1, 5)
Код функции GetVisibleRowsArray:
Function GetVisibleRowsArray(ByRef sh As Worksheet, ByVal FirstRow&, _ Optional ByVal CheckColumn& = 1, Optional ByVal ColumnsCount& = 0) As Variant ' Функция возвращает двумерный массив с данными с листа sh ' В массив попадают все ВИДИМЫЕ строки, после строки номер FirstRow&, ' до последней строки, у которой в столбце CheckColumn& непустое значение. ' Ширину массива можно задать в параметре ColumnsCount& ' (если ширина массива не задана, она определяется автоматически) On Error Resume Next Dim ra As Range, ra2 As Range, ra3 As Range, ar As Range, rc&, ind& Set ra2 = sh.Range(sh.Cells(FirstRow&, CheckColumn&), sh.Cells(sh.Rows.Count, CheckColumn&).End(xlUp)) If ra2.Row < FirstRow& Then Exit Function ' нет ни одной видимой строки после строки FirstRow& If ColumnsCount& <= 0 Then ColumnsCount& = sh.UsedRange.Columns.Count Set ra3 = Intersect(sh.Range(FirstRow& & ":" & sh.Rows.Count), ra2.SpecialCells(xlCellTypeVisible)).EntireRow Set ra = Intersect(ra3, sh.Cells(1).Resize(, ColumnsCount&).EntireColumn) For Each ar In ra.Areas: rc& = rc& + ar.Rows.Count: Next ' подсчитываем кол-во видимых строк ReDim arr(1 To rc&, 1 To ColumnsCount&) For Each ar In ra.Areas ararr = "": If ar.Columns.Count = 1 Then ararr = ar.Resize(, 2).Value Else ararr = ar.Value For i& = LBound(ararr) To UBound(ararr) ind& = ind& + 1 For j& = 1 To ColumnsCount&: arr(ind&, j&) = ararr(i&, j&): Next j& Next i Next GetVisibleRowsArray = arr End Function
The problem is that RowCount returns 1 instead of visible rows after filtering.
RowCount = Cells(Rows.Count, colIndex).End(xlUp).SpecialCells(xlCellTypeVisible).Row
Sub showEightmonth(ws, colName, colIndex)
Dim RowCount As Integer
ws.Activate
MsgBox ws.Name
RowCount = Cells(Rows.Count, colIndex).End(xlUp).Row
Set Rng = Range(colName & "1:" & colName & RowCount)
If ws.AutoFilterMode = True Then
ws.AutoFilter.ShowAllData
End If
Rng.Select
Rng.NumberFormat = "mm/dd/yyyy hh:mm:ss"
d = Format(DateAdd("m", -8, Date), "mm/dd/yyyy 07:00:00")
Range(colName & "1").AutoFilter Field:=colIndex, Criteria1:="<" & d
RowCount = Cells(Rows.Count, colIndex).End(xlUp).SpecialCells(xlCellTypeVisible).Row
'Delete filtered row if RowCount > 1, as row 1 is the header row
If RowCount > 1 Then
delRow = colName & "2:" & colName & RowCount
ActiveSheet.Range(delRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End If
If ws.AutoFilterMode = True Then
ws.AutoFilter.ShowAllData
End If
End Sub
asked Jun 19, 2019 at 10:04
To count the rows that are visible after applying a filter you would have to do this:
Sub countNonFiltered()
Dim sht As Worksheet
Dim colIndex As Long
Dim firstrow As Long
Dim RowCount As Long
Set sht = ThisWorkbook.Worksheets("worksheet name")
colIndex = 1 'let's assume you're interested in column A
firstrow = 2 'Let's assume your header is in row 1 and the data starts from row 2
With sht
RowCount = .Range(.Cells(Rows.Count, 1).End(xlUp), .Cells(firstrow, colIndex)).SpecialCells(xlCellTypeVisible).Count
Debug.Print RowCount
End With
End Sub
For demonstration purposes the code above prints the number of the visible rows in the immediate window.
Keep in mind that this:
Cells(Rows.Count, colIndex).End(xlUp)
is a range consisting of only one single cell. What you need instead is a range consisting of all the cells that belong to the rows that are still visible after applying the filter.
Also keep in mind that when you’re using variables that hold either row or column indexes, they should be declared as Long
.
answered Jun 19, 2019 at 10:20
Stavros JonStavros Jon
1,6852 gold badges6 silver badges17 bronze badges
0