Excel vba количество строк в умной таблице

 

Добрый день!
Для подсчета количества строк умной таблицы ранее использовала следующую формулу: LastRow1 = Cells(Rows.Count, 1).End(xlUp).Row — работала безупречно до тех пор, пока передо мной не встала задача посчитать количество строк в таблице, которая может быть пустой. В этом случае эта формула выводит верное значение строк (1), но первая строка является заголовком. Дальнейший код предполагает заполнение умной таблицы, а поскольку строк там 1, мы не попадаем в цикл.
               LastRow1 = Cells(Rows.Count, 1).End(xlUp).Row
               For j = 2 To LastRow1
                   If Cells(j, 1) = name And Cells(j, 6) = «Заказать» And Cells(j, 4) = ob Then
                       Cells(j, 3) = CDbl(Cells(j, 3)) + kol
                       Cells(j, 5) = Cells(j, 5) + «; » + kuda
                   Else
                       Cells(LastRow1 + 1, 1) = name
                       Cells(LastRow1 + 1, 2) = ed
                       Cells(LastRow1 + 1, 3) = kol
                       Cells(LastRow1 + 1, 4) = ob
                       Cells(LastRow1 + 1, 5) = kuda
                   End If
               Next j
Помогите решить проблему, пожалуйста

Изменено: Елена Дроздова15.04.2022 11:45:38

 

pantel1987

Пользователь

Сообщений: 76
Регистрация: 12.08.2019

#2

15.04.2022 12:01:08

Попробуйте через

Код
Worksheets(1).ListObjects(1).Listrows.Count

Он считает количество строк в умной таблице без заголовков

 

Благодарю!
Следующий вопрос, наверное, уже для новой темы: как заполнять макросом умную таблицу, чтобы запись производилась не в строки на листе под умной таблицей, а в ней самой?

 

МатросНаЗебре

Пользователь

Сообщений: 5507
Регистрация: 05.02.2014

#4

15.04.2022 12:37:40

Код
Sub test()
    AddVal "test"
End Sub

Sub AddVal(myVal As Variant)
    With ActiveSheet.ListObjects(1)
        If IsEmpty(.DataBodyRange.Cells(1, 1)) Then
            '.Resize .Range.Resize(.Range.Rows.Count + 1)
            .Range.Cells(.Range.Rows.Count, 1).Value = myVal
        Else
            .Range.Cells(.Range.Rows.Count + 1, 1).Value = myVal
        End If
    End With
End Sub
 

бывает, что
количество строк в умной таблице
и
количество заполненных строк в умной таблице
могут совпадать, но это не значит что они обязаны быть одинаковыми всегда
только когда сможете сказать что конкретно вам нужно,  только тогда можете получить ответ на свой вопрос
хотя… ответ можно получить и раньше — его могут угадать))

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Вы правы. Этих тонкостей не счесть. Мне нужно количество заполненных строк умной таблицы

 

по какой колонке определять последнюю заполненную строку?

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 
 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#9

15.04.2022 16:03:49

Код
Sub test()
  Dim rg As Range
  Set rg = FistCellAtRowWithOutData(ActiveSheet.ListObjects(1))
  rg = "test"
End Sub


Function FistCellAtRowWithOutData(t, Optional c& = 1)
  Set FistCellAtRowWithOutData = _
  t.Range.Cells(c).Offset(t.Range.Cells(1).CurrentRegion.Rows.Count, 0)
End Function

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Прошу прощения, никак не могу разобраться в коде((

 

функция FistCellAtRowWithOutData
возвращает ссылку на первую свободную ячейку для переданного в нее обьекта (в функцию была передана умная таблица ActiveSheet.ListObjects(1))

как пользоваться функцией показано в процедуре Test

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Елена Дроздова

Пользователь

Сообщений: 106
Регистрация: 14.04.2021

#12

15.04.2022 16:58:56

Спасибо, буду разбираться

mor_sergey

77 / 11 / 0

Регистрация: 28.03.2018

Сообщений: 828

1

08.02.2020, 23:02. Показов 6920. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Ребят нужно было количество строк 3 столбца умной таблицы найти. Сделал циклом от безисходности….неужели споссоба проще нет

Visual Basic
1
2
3
4
5
6
xxxListObj.SpecialCells(xlCellTypeConstants).Range.Columns(3).Rows.Count ' не работает
 
 
   For Each cell In xxxListObj.DataBodyRange.Columns(3).Cells
   If Not IsEmpty(cell) Then xx = xx + 1
   Next



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

08.02.2020, 23:02

5

Dinoxromniy

1232 / 670 / 238

Регистрация: 22.12.2015

Сообщений: 2,089

09.02.2020, 09:01

2

Цитата
Сообщение от mor_sergey
Посмотреть сообщение

нужно было количество строк 3 столбца умной таблицы найти.

Вы определитесь, что вы найти хотите
Количество ячеек третьего столбца умной таблицы будет совпадать с числом строк самой умной таблицы.

Visual Basic
1
2
Debug.Print ActiveSheet.ListObjects.Item(1).DataBodyRange.Rows.Count
Debug.Print ActiveSheet.ListObjects.Item(1).DataBodyRange.Columns(3).Cells.Count

Цитата
Сообщение от mor_sergey
Посмотреть сообщение

SpecialCells(xlCellTypeConstants)

Тут вы считаете количество ячеек, в которых вбиты константы.

Visual Basic
1
Debug.Print ActiveSheet.ListObjects.Item(1).DataBodyRange.Columns(3).SpecialCells(xlCellTypeConstants).Count

Цитата
Сообщение от mor_sergey
Посмотреть сообщение

If Not IsEmpty(cell) Then xx = xx + 1

Тут — количество непустых ячеек.

Visual Basic
1
Debug.Print ActiveSheet.ListObjects.Item(1).DataBodyRange.Columns(3).Cells.Count - ActiveSheet.ListObjects.Item(1).DataBodyRange.Columns(3).SpecialCells(xlCellTypeBlanks).Count



1



mor_sergey

77 / 11 / 0

Регистрация: 28.03.2018

Сообщений: 828

09.02.2020, 09:43

 [ТС]

3

Dinoxromniy, количество непустых ячеек нужно мне. спасибо большое

Добавлено через 15 минут
Dinoxromniy, а как мне на мой вариант переделать

Visual Basic
1
2
3
4
Set sh_xxx = ThisWorkbook.Worksheets("xxx")
Set xxxListObj =xxx.ListObjects("xxx")
 
xxxListObj=

Добавлено через 2 минуты
не работает

Visual Basic
1
 xxxLinesListObj.Item(1).DataBodyRange.Columns(3).Cells.Count - xxxListObj.Item(1).DataBodyRange.Columns(3).SpecialCells(xlCellTypeBlanks).Count



0



Dinoxromniy

1232 / 670 / 238

Регистрация: 22.12.2015

Сообщений: 2,089

09.02.2020, 10:17

4

mor_sergey, используйте что-то вроде

Visual Basic
1
Set xxxListObj = ThisWorkbook.Worksheets("xxx").ListObjects.Item(1)



0



0 / 0 / 0

Регистрация: 10.05.2016

Сообщений: 9

13.12.2022, 09:11

5

Доброе утро!
прочитав вашу тему очень помогло в решении моей задачи, только есть вопрос, как после выборки по столбцу заново переопределить таблицу. При выводе списка сортировка не учитывается.
Set oTable = objWrdDoc.Tables.Add(objWrdApp.Selection.Range, КолСтрокФ + 1, NumColumns:=5)

Добавлено через 38 минут
tbl.DataBodyRange(строка, 16) до применения фильтра по столбцу
как определить строку в таблице после фильтра?

Добавлено через 1 минуту
Set tbl = ActiveSheet.ListObjects(«ТаблицаФорматов»)- вот так я её определяю в начале



0



Jack Famous

531 / 164 / 27

Регистрация: 10.05.2021

Сообщений: 535

Записей в блоге: 7

13.12.2022, 13:56

6

Dinoxromniy, +

Ещё варианты

Visual Basic
1
2
3
4
With ActiveSheet.ListObjects(1)
    Debug.Print Not .DataBodyRange Is Nothing   ' проверка умной таблицы на заполненность. Если .DataBodyRange Is Nothing то Таблица пустая и все вычисления с .DataBodyRange дадут ошибку
    Debug.Print .ListRows.Count                 ' количество строк умной таблицы. Можно не проверять .DataBodyRange
End With



0



Работа с умной таблицей из кода VBA Excel. Обращение к ячейкам, строкам и столбцам умной таблицы. Добавление и удаление строк и столбцов.

Обращение к умной таблице

Все примеры кода в этой статье привязаны к таблице с именем «Таблица1», расположенной на активном листе:

Обращение к умной таблице:

ActiveSheet.ListObjects(«Таблица1»)

Обращение к диапазону умной таблицы на рабочем листе:

ActiveSheet.ListObjects(«Таблица1»).Range

Проверяем:

Debug.Print ActiveSheet.ListObjects(«Таблица1»).Range.Address  ‘Результат: $B$3:$G$9

Далее все примеры кода VBA Excel, чтобы их не дублировать, будут представлены как аргументы метода Debug.Print.

Обращение к строкам

Работа с умной таблицей — обращение к строке заголовков:

Debug.Print ActiveSheet.ListObjects(«Таблица1»).Range.Rows(1).Address  ‘Результат: $B$3:$G$3

Таким же образом можно обращаться и к остальным строкам таблицы (Строка1-Строка6), указывая индекс нужной строки от 2 до 7.

К записям таблицы (Строка1-Строка6) обращаются через коллекцию ListRows, указывая индекс записи от 1 до 6:

With ActiveSheet.ListObjects(«Таблица1»)

    Debug.Print .ListRows.Count  ‘Результат: 6

    Debug.Print .ListRows(1).Range.Address  ‘Результат: $B$4:$G$4

    Debug.Print .ListRows(2).Range.Address  ‘Результат: $B$5:$G$5

End With

Обращение к столбцам

Обращение к третьему столбцу умной таблицы из кода VBA Excel:

With ActiveSheet.ListObjects(«Таблица1»)

    ‘Обращение через диапазон умной таблицы

    Debug.Print .Range.Columns(3).Address  ‘Результат: $D$3:$D$9

    Debug.Print .Range.Columns.Count  ‘Результат: 6

    ‘Обращение через коллекцию ListColumns

    Debug.Print .ListColumns(3).Range.Address  ‘Результат: $D$3:$D$9

    Debug.Print .ListColumns.Count  ‘Результат: 6

End With

Обращение к ячейкам

Работа с умной таблицей — обращение к ячейке «E7» с отображением ее значения:

With ActiveSheet.ListObjects(«Таблица1»)

    Debug.Print .Range.Cells(5, 4)  ‘Результат: 91

    Debug.Print .ListColumns(4).Range(5)  ‘Результат: 91

    Debug.Print .ListRows(4).Range(4)  ‘Результат: 91

End With

Вставка и удаление строк

Вставка новой строки в конец умной таблицы:

ActiveSheet.ListObjects(«Таблица1»).ListRows.Add

Удаление последней строки:

With ActiveSheet.ListObjects(«Таблица1»)

    .ListRows(.ListRows.Count).Delete

End With

Вставка новой строки на место пятой записи (Строка5 в таблице) со сдвигом пятой и нижерасположенных записей вниз:

ActiveSheet.ListObjects(«Таблица1»).ListRows.Add 5

Удаление пятой строки:

ActiveSheet.ListObjects(«Таблица1»).ListRows(5).Delete

Вставка и удаление столбцов

Вставка нового столбца в конец умной таблицы из кода VBA Excel:

ActiveSheet.ListObjects(«Таблица1»).ListColumns.Add

Удаление последнего столбца:

With ActiveSheet.ListObjects(«Таблица1»)

    .ListColumns(.ListColumns.Count).Delete

End With

Вставка нового столбца на место четвертой графы таблицы со сдвигом четвертой и последующих граф вправо:

ActiveSheet.ListObjects(«Таблица1»).ListColumns.Add 4

Удаление четвертого столбца таблицы:

ActiveSheet.ListObjects(«Таблица1»).ListColumns(4).Delete


Создание и удаление умной таблицы описано в статье VBA Excel. Создание таблицы (умной, обычной)


Запуск макроса при изменении кол-во строк умной таблицы

Leprotto

Дата: Пятница, 14.04.2017, 09:19 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

Всем доброго утра!
Можно ли по факту изменения диапазона (кол-ва строк) умной таблицы запустить макрос?
Попробовал сослаться на ячейку, которая считает кол-во строк:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
  ‘запуск макроса при изменении кол-ва строк умной таблицы «Таблица1»
  If Not Intersect(Target, Range(«F1»)) Is Nothing Then
    MsgBox «запуск макроса…»
  End If
End Sub

[/vba]
Но он не работает ((
Помогите, пожалуйста!

 

Ответить

and_evg

Дата: Пятница, 14.04.2017, 09:25 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

Leprotto,
Замените
[vba]

Код

If Not Intersect(Target, Range(«F1»)) Is Nothing Then

[/vba]
на
[vba]

Код

If Not Intersect(Target, Range(«Таблица1»)) Is Nothing Then

[/vba]

 

Ответить

Leprotto

Дата: Пятница, 14.04.2017, 09:27 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

and_evg, СПАСИБО!

 

Ответить

Leprotto

Дата: Пятница, 14.04.2017, 09:36 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

Замените
[vba]

Код

If Not Intersect(Target, Range(«F1»)) Is Nothing Then

[/vba]
на
[vba]

Код

If Not Intersect(Target, Range(«Таблица1»)) Is Nothing Then

[/vba]

Оказалось, что не подходит, т.к. макрос запускается при любом изменении в Таблице,
а нужно только при изменении кол-ва строк…

Сообщение отредактировал LeprottoПятница, 14.04.2017, 09:37

 

Ответить

_Boroda_

Дата: Пятница, 14.04.2017, 09:51 |
Сообщение № 5

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

А так?
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    ‘запуск макроса при изменении кол-ва строк умной таблицы «Таблица1»
    If Not Intersect(Target, [Таблица1]) Is Nothing Then
        Application.EnableEvents = 0
        Application.Undo
        r0_ = [Таблица1].Rows.Count
        Application.Undo
        r1_ = [Таблица1].Rows.Count
        Application.EnableEvents = 1
        If r0_ <> r1_ Then
            MsgBox «запуск макроса…»
        End If
    End If
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

and_evg

Дата: Пятница, 14.04.2017, 10:04 |
Сообщение № 6

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

Или так
[vba]

Код

Private Sub Worksheet_Calculate()
    Application.EnableEvents = 0
    Application.Undo
    strok_new = Range(«F1»).Value
    Application.Undo
    strok_old = Range(«F1»).Value
    Application.EnableEvents = 1
    If strok_old <> strok_new Then
        MsgBox «запуск макроса…»
    End If
End Sub

[/vba]

но тогда вопрос как вернуть кол-во строк до отката

 

Ответить

Leprotto

Дата: Пятница, 14.04.2017, 11:27 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

_Boroda_ и and_evg, в примере Ваши коды работают как надо.
Заменил [vba]

Код

MsgBox «запуск макроса…»

[/vba] на команды:
[vba]

Код

Range(«Таблица1[№]»).ClearContents
  Range(«A3»).FormulaR1C1 = «=IF(AND(RC[2]<>»»»», RC[3]<>»»»»),MAX(R2C:R[-1]C)+1,»»»»)»

[/vba],
которые прописываю автонумерацию строк
и возникает конфликт с ошибкой «1004» (компонент с указанным именем не найден).
Ругается на первую [vba][/vba]
Пример приложил

К сообщению приложен файл:

9712551.xlsm
(15.8 Kb)

 

Ответить

_Boroda_

Дата: Пятница, 14.04.2017, 11:38 |
Сообщение № 8

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Правильно. Перенесите вниз включение обработчика событий
И похоже, что формула у Вас неверная была. 2 и 3 переписал на 1 и 2
[vba]

Код

‘Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    ‘запуск макроса при изменении кол-ва строк умной таблицы «Таблица1»
    If Not Intersect(Target, [Таблица1]) Is Nothing Then
        Application.EnableEvents = 0
        Application.Undo
        r0_ = [Таблица1].Rows.Count
        Application.Undo
        r1_ = [Таблица1].Rows.Count
        If r0_ <> r1_ Then
            ‘MsgBox «запуск макроса…»
          Range(«Таблица1[№]»).ClearContents
          Range(«A3»).Resize(r1_, 1).FormulaR1C1 = «=IF(AND(RC[1]<>»»»», RC[2]<>»»»»),MAX(R2C:R[-1]C)+1,»»»»)»
        End If
        Application.EnableEvents = 1
    End If
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Leprotto

Дата: Пятница, 14.04.2017, 14:40 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

_Boroda_, Спасибо!

 

Ответить

Home / VBA / Count Rows using VBA in Excel

To count rows using VBA, you need to define the range from which you want to count the rows and then use the count and rows property to get the count of the row from that range. You can also use a loop to count rows where you have data only.

Use VBA to Count Rows

  1. First, you need to define the range for which you want to count the rows.
  2. After that, use a dot (.) to open the list of properties and methods.
  3. Next, type or select the “Rows” property.
  4. In the end, use the “Count” property.
vba-to-count-rows

Now when you run this code, it will return the count of the rows, and to get the count you can use a message box or directly enter that value into a cell as well.

Sub vba_count_rows()
Range("A1:A10").Rows.Count
End Sub

Count Rows for the Used Range

Sub vba_count_rows2()
   MsgBox Worksheets("Sheet1").UsedRange.Rows.Count
End Sub

Count Rows with Data using VBA

You can also count rows where you have data by ignoring the blank rows.

count-rows-with-data-using-vba

The following code will take the used range as the range to loop up at and loop through each row one by one and check if there’s a non-empty cell there, and if it is there it will consider it as a row with data, and in the end, show a message box with the total count of rows.

Sub vba_count_rows_with_data()

Dim counter As Long
Dim iRange As Range

With ActiveSheet.UsedRange

    'loop through each row from the used range
    For Each iRange In .Rows

        'check if the row contains a cell with a value
        If Application.CountA(iRange) > 0 Then

            'counts the number of rows non-empty Cells
            counter = counter + 1

        End If

    Next

End With

MsgBox "Number of used rows is " & counter
End Sub

More Tutorials

    • Excel VBA Font (Color, Size, Type, and Bold)
    • Excel VBA Hide and Unhide a Column or a Row
    • Excel VBA Range – Working with Range and Cells in VBA
    • Apply Borders on a Cell using VBA in Excel
    • Find Last Row, Column, and Cell using VBA in Excel
    • Insert a Row using VBA in Excel
    • Merge Cells in Excel using a VBA Code
    • Select a Range/Cell using VBA in Excel
    • SELECT ALL the Cells in a Worksheet using a VBA Code
    • ActiveCell in VBA in Excel
    • Special Cells Method in VBA in Excel
    • UsedRange Property in VBA in Excel
    • VBA AutoFit (Rows, Column, or the Entire Worksheet)
    • VBA ClearContents (from a Cell, Range, or Entire Worksheet)
    • VBA Copy Range to Another Sheet + Workbook
    • VBA Enter Value in a Cell (Set, Get and Change)
    • VBA Insert Column (Single and Multiple)
    • VBA Named Range | (Static + from Selection + Dynamic)
    • VBA Range Offset
    • VBA Sort Range | (Descending, Multiple Columns, Sort Orientation
    • VBA Wrap Text (Cell, Range, and Entire Worksheet)
    • VBA Check IF a Cell is Empty + Multiple Cells

    ⇠ Back to What is VBA in Excel

    Helpful Links – Developer Tab – Visual Basic Editor – Run a Macro – Personal Macro Workbook – Excel Macro Recorder – VBA Interview Questions – VBA Codes

    Понравилась статья? Поделить с друзьями:
  • Excel vba количество отфильтрованных строк в
  • Excel vba количество знаков после запятой
  • Excel vba кодировка файла
  • Excel vba код символа кавычки
  • Excel vba изменить имя листа