в столбце 15 таблицы постарался отметить строки, которые с помощь макроса мне нужно скрывать, но: Например, если значение в ячейке L14=0, то мне необходимо чтобы "х" проставлялся также и ячейке L10 и т.д. (в примере заливка красным цветом). Формулу крутил и так и эдак, но ничего не получается. На выходе, при срабатывании макроса у меня должны остаться только строки, которые содержат: 1. Наименование материалов (А) 2. Остаток материалов (L). На листе 2 постарался показать результат. Спасибо.
Sub СкрытьБелых()
If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
ActiveSheet.UsedRange.EntireRow.Hidden = False
Dim tb As ListObject
For Each tb In ActiveSheet.ListObjects
JobTb tb
Next
Application.ScreenUpdating = True
End Sub
Private Sub JobTb(tb As ListObject)
Dim cl As Range
For Each cl In tb.DataBodyRange.Columns(1).Cells
Select Case cl.Interior.Color
Case 11389944, 14277081
Case Else
cl.EntireRow.Hidden = True
End Select
Next
End Sub
МатросНаЗебре добрый день и спасибо за отклик. Макрос работает, но ячейки в столбце L, которые имеют 0 значение остались, как и строки с наименованием материалов, которые связаны с итоговыми значениями в столбце L. На листе 2 я постарался показать итоговый вариант таблицы. Макрос планируется привязать к кнопке, с помощью которой оператор будет скрывать или отображать строки. Спасибо.
Sub СкрытьБелыхИ_х()
If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
ActiveSheet.UsedRange.EntireRow.Hidden = False
Dim tb As ListObject
For Each tb In ActiveSheet.ListObjects
JobTb tb
Next
Application.ScreenUpdating = True
End Sub
Private Sub JobTb(tb As ListObject)
Dim flag As Boolean
Dim cl As Range
For Each cl In tb.DataBodyRange.Columns(1).Cells
flag = False
If cl.Cells(1, 15).Value = "х" Then
flag = True
End If
Select Case cl.Interior.Color
Case 11389944, 14277081
Case Else
flag = True
End Select
If flag Then cl.EntireRow.Hidden = True
Next
End Sub
Всем привет! Подскажите пожалуйста решение - как можно ускорить работу макроса. В процессе работы с файлом количество строк в "умной таблице" достигло более 3 500 тыс. строк. И макрос стал очень долго обрабатывать скрытие строк - более 5 минут. Файл не выкладываю, т.к. его объем велик, а если прикрепить урезанный вариант, то скорость работы макроса сложно будет оценить. Спасибо.
Можно вместо получения значения ячейки получать значение из массива. Какая-то оптимизация будет, однако, остаётся обращение к ячейке для получения цвета.
Код
Sub СкрытьБелыхИ_хarr()
If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
ActiveSheet.UsedRange.EntireRow.Hidden = False
Dim tb As ListObject
For Each tb In ActiveSheet.ListObjects
JobTb tb
Next
Application.ScreenUpdating = True
End Sub
Private Sub JobTb(tb As ListObject)
Dim flag As Boolean
Dim cl As Range
Dim yy As Long
Dim arr As Variant
arr = tb.DataBodyRange.Columns(15).Value
'For Each cl In tb.DataBodyRange.Columns(1).Cells
For yy = 1 To UBound(arr, 1)
flag = False
'If cl.Cells(1, 15).Value = "х" Then
If arr(yy, 1) = "х" Then
flag = True
End If
Set cl = tb.DataBodyRange.Cells(yy, 1)
Select Case cl.Interior.Color
Case 11389944, 14277081
Case Else
flag = True
End Select
If flag Then cl.EntireRow.Hidden = True
Next
End Sub
МатросНаЗебре спасибо за помощь!! Попробовал, но скорость не сильно возросла.
Код
Sub СкрытьБелыхИ_х()
Dim с As Date
Dim d As Single
'Больше не обновляем страницы после каждого действия
Application.ScreenUpdating = False
'Отключаем события
Application.EnableEvents = False
'Расчёты переводим в ручной режим
Application.Calculation = xlCalculationManual
c = Time
If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
ActiveSheet.UsedRange.EntireRow.Hidden = False
Dim tb As ListObject
For Each tb In ActiveSheet.ListObjects
JobTb tb
Next
Application.ScreenUpdating = True
d = (Time - c) * 24 * 60 * 60
'Расчёты переводим в автоматический режим
Application.Calculation = xlCalculationAutomatic
'Включаем события
Application.EnableEvents = True
'Включаем обновление страниц после каждого действия
Application.ScreenUpdating = True
MsgBox "Время выполения макроса составило: " & d & " c.", vbInformation, "Отчет"
End Sub
Private Sub JobTb(tb As ListObject)
Dim flag As Boolean
Dim cl As Range
For Each cl In tb.DataBodyRange.Columns(1).Cells
flag = False
If cl.Cells(1, 14).Value = "х" Then
flag = True
End If
Select Case cl.Interior.Color
Case 11389944, 14277081
Case Else
flag = True
End Select
If flag Then cl.EntireRow.Hidden = True
Next
End Sub
Вот результаты: число строк 3616: - время выполнения доработанного макроса 3 с. - время выполнения без доработки Excel после 5 минут обработки не отвечает :'( %) И ВОТ РЕЗУЛЬТАТ - 85757 с
Но вот еще что меня волнует: 1. Как привязать макрос на работу в с "умной таблицей"? 2. Возможно ли сделать так, чтобы столбец, в котором имеется значение "скрыть" был постоянно скрыт от глаз пользователя? 3. Возможно ли сделать так, чтобы строки 5-9 были постоянно скрыты от глаз пользователя?
graffserg, Здравствуйте. А вы видите разницу своего кода что вы выложили постом выше моего и кодом что выложил МатросНаЗебре в сво5ём посте #11? Как вы думаете, он зря закоментиривал несколько строк? Или вам без разницы какая оптимизация?
конечно вижу, как минимум во второй части кода, но я не так силен в vba чтобы код разложить по полочкам. И мне совсем не без разницы какая оптимизация, так как тему я поднял с целью ускорения макроса.
На данный момент еще раз тестирую макрос предоставленный уважаемым МатросНаЗебре. Постараюсь более детально разобраться.
Вот код:
Код
Sub СкрытьБелыхИ_хarr()
Dim с As Date
Dim d As Single
'Больше не обновляем страницы после каждого действия
'Application.ScreenUpdating = False
'Отключаем события
'Application.EnableEvents = False
'Расчёты переводим в ручной режим
'Application.Calculation = xlCalculationManual
c = Time
If ActiveSheet.ListObjects.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
ActiveSheet.UsedRange.EntireRow.Hidden = False
Dim tb As ListObject
For Each tb In ActiveSheet.ListObjects
JobTb tb
Next
Application.ScreenUpdating = True
d = (Time - c) * 24 * 60 * 60
'Расчёты переводим в автоматический режим
'Application.Calculation = xlCalculationAutomatic
'Включаем события
'Application.EnableEvents = True
'Включаем обновление страниц после каждого действия
'Application.ScreenUpdating = True
MsgBox "Время выполнения макроса составило: " & d & " c.", vbInformation, "Отчет"
End Sub
Private Sub JobTb(tb As ListObject)
Dim flag As Boolean
Dim cl As Range
Dim yy As Long
Dim arr As Variant
arr = tb.DataBodyRange.Columns(14).Value
'For Each cl In tb.DataBodyRange.Columns(1).Cells
For yy = 1 To UBound(arr, 1)
flag = False
'If cl.Cells(1, 15).Value = "х" Then
If arr(yy, 1) = "х" Then
flag = True
End If
Set cl = tb.DataBodyRange.Cells(yy, 1)
Select Case cl.Interior.Color
Case 11389944, 14277081
Case Else
flag = True
End Select
If flag Then cl.EntireRow.Hidden = True
Next
End Sub
Затраченное время 10 мин. 29 сек. при количестве строк 3445
С заменой строк:
Код
For Each cl In tb.DataBodyRange.Columns(1).Cells
'For yy = 1 To UBound(arr, 1)
flag = False
If cl.Cells(1, 14).Value = "х" Then
'If arr(yy, 1) = "х" Then
Затраченное время 05 мин. 11 сек. при количестве строк 3445
graffserg написал: Но вот еще что меня волнует: 2. Возможно ли сделать так, чтобы столбец, в котором имеется значение "скрыть" был постоянно скрыт от глаз пользователя? 3. Возможно ли сделать так, чтобы строки 5-9 были постоянно скрыты от глаз пользователя?
Вот добавил макрос в корень "Эта книга":
Код
Sub HideColumnsRows()
With Worksheets("Литс 1")
.Columns(14).Hidden = True
.Rows("5:9").Hidden = True
End With
End Sub
Вроде все стартует. Но не могу понять, как сделать так, чтобы он реагировал на автоматическое скрытие даже тогда, когда пользователь их "покажет".
Private Sub Workbook_Open()
With Worksheets("Литс 1")
.Columns(14).Hidden = True
.Rows("5:9").Hidden = True
.EnableSelection = xlNoSelection
End With
End Sub
Изменено: MikeVol - 06.04.2023 02:04:34(Исправил название листа на Литс как у ТС)