Добрый день! Помогите пожалуйста с макросом последовательной печати результатов автофильтра столбца R. В моём примере это критерии Иванов, Петров, Сидоров. В основной таблице критериев будет больше...
Добрый день! Помогите пожалуйста с макросом последовательной печати результатов автофильтра столбца R. В моём примере это критерии Иванов, Петров, Сидоров. В основной таблице критериев будет больше...DARR
Sub NewMacros() Dim f, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f For Each f In Coll .AutoFilter Field:=18, Criteria1:=f ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
[/vba]
DARR, [vba]
Код
Sub NewMacros() Dim f, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f For Each f In Coll .AutoFilter Field:=18, Criteria1:=f ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
boa, макрос работает, спасибо, но есть недостаток.. в ячейке R3 вставлена формула, которая отображает критерий автофильтра. При распечатке макросом формула не работает, т.е. в ячейке R3 критерий автофильтра не вставляется(
boa, макрос работает, спасибо, но есть недостаток.. в ячейке R3 вставлена формула, которая отображает критерий автофильтра. При распечатке макросом формула не работает, т.е. в ячейке R3 критерий автофильтра не вставляется(DARR
Sub NewMacros() Dim f, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f For Each f In Coll .AutoFilter Field:=18, Criteria1:=f Cells(3, 18).Calculate ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
[/vba] В таком виде не сработало
boa, [vba]
Код
Sub NewMacros() Dim f, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f For Each f In Coll .AutoFilter Field:=18, Criteria1:=f Cells(3, 18).Calculate ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
boa, мистика какая то, но ничего не помогает. Ни первый вариант (адрес ячейки правильно указан), ни второй вариант (пересчёт всего листа) не помогает. Я попробовал [vba]
Код
ActiveWorkbook.ActiveSheet.Cells(3, 18).Calculate
[/vba] запустить отдельным макросом после выполнения первого, то формула сразу же срабатывает. А в составе первого макроса почему то не работает. Теряюсь в догадках почему такое может быть) Автопересчёт галочка стоит
boa, мистика какая то, но ничего не помогает. Ни первый вариант (адрес ячейки правильно указан), ни второй вариант (пересчёт всего листа) не помогает. Я попробовал [vba]
Код
ActiveWorkbook.ActiveSheet.Cells(3, 18).Calculate
[/vba] запустить отдельным макросом после выполнения первого, то формула сразу же срабатывает. А в составе первого макроса почему то не работает. Теряюсь в догадках почему такое может быть) Автопересчёт галочка стоитDARR
Sub NewMacros() Dim f, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f For Each f In Coll .AutoFilter Field:=18, Criteria1:=f Range("R3").FormulaR1C1 = "=GetCriteria(R[2]C)" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
[/vba] Получилось только в таком виде. Теперь как надо работает))
[vba]
Код
Sub NewMacros() Dim f, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f For Each f In Coll .AutoFilter Field:=18, Criteria1:=f Range("R3").FormulaR1C1 = "=GetCriteria(R[2]C)" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
[/vba] Получилось только в таком виде. Теперь как надо работает))DARR
boa, можно ещё вопрос...? Когда в моей таблице стоит фильтр на столбце Q (на "не пустые ячейки"), то в столбце R пропадают некоторые критерии автофильтра и, соответственно, они не должны распечатываться. Макрос же печатает все, что есть в столбце R, без учёта фильтра на столбце Q. Как сделать так, чтобы распечатывалось с учётом фильтра, на столбце Q? Надеюсь понятно объяснил)
boa, можно ещё вопрос...? Когда в моей таблице стоит фильтр на столбце Q (на "не пустые ячейки"), то в столбце R пропадают некоторые критерии автофильтра и, соответственно, они не должны распечатываться. Макрос же печатает все, что есть в столбце R, без учёта фильтра на столбце Q. Как сделать так, чтобы распечатывалось с учётом фильтра, на столбце Q? Надеюсь понятно объяснил)DARR
Сообщение отредактировал DARR - Вторник, 11.12.2018, 13:57
Макрос же печатает все, что есть в столбце R, без учёта фильтра на столбце Q
я так понимаю, что он печатает листы в которых строки с данными не отображаются? Фильтр же в столбце Q не сбрасывается? тогда так [vba]
Код
... If .Cells(.Rows.Count, 18).End(xlUp).Row > 4 Then _ ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f ...
Макрос же печатает все, что есть в столбце R, без учёта фильтра на столбце Q
я так понимаю, что он печатает листы в которых строки с данными не отображаются? Фильтр же в столбце Q не сбрасывается? тогда так [vba]
Код
... If .Cells(.Rows.Count, 18).End(xlUp).Row > 4 Then _ ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f ...
Приветствую. Можно ли заставить выше написанный макрос печатать критерии автофильтра в алфавитном порядке? В данном виде критерии печатаются в каком то произвольном порядке, что не очень удобно..
Приветствую. Можно ли заставить выше написанный макрос печатать критерии автофильтра в алфавитном порядке? В данном виде критерии печатаются в каком то произвольном порядке, что не очень удобно..DARR
Sub NewMacros() Dim f, i&, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f
'Если работа с коллекцией далее неприемлема, то перебросить её в массив ReDim NewMyArray(1 To Coll.Count) i = 1 For Each f In Coll NewMyArray(i) = f i = i + 1 Next
NewMyArray = SortedRezult(NewMyArray) For Each f In NewMyArray .AutoFilter Field:=18, Criteria1:=f Range("R3").FormulaR1C1 = "=GetCriteria(R[2]C)" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
Private Function SortedRezult(Massiv() As Variant) Dim nnn&, iii& Dim Tmp1 As Variant Dim Tmp2 As Variant ' On Error Resume Next If (Not Not Massiv) <> 0 Then 'Double negation allows checking that the array is not empty For iii = LBound(Massiv) To UBound(Massiv) Step 1 Tmp1 = Massiv(iii) For nnn = iii To UBound(Massiv) If Massiv(nnn) < Tmp1 Then Tmp1 = Massiv(nnn): Tmp2 = Massiv(iii) Massiv(iii) = Tmp1: Massiv(nnn) = Tmp2 End If Next nnn Next iii End If SortedRezult = Massiv End Function
[/vba]
DARR, надо отсортировать коллекцию например так
[vba]
Код
Sub NewMacros() Dim f, i&, Coll As New Collection On Error Resume Next With ActiveWorkbook.ActiveSheet.UsedRange.Offset(4) 'т.е. начинаем перебор с 5-й строки For Each f In .Columns(18).Value If f <> "" Then Coll.Add CStr(f), CStr(f) Next f
'Если работа с коллекцией далее неприемлема, то перебросить её в массив ReDim NewMyArray(1 To Coll.Count) i = 1 For Each f In Coll NewMyArray(i) = f i = i + 1 Next
NewMyArray = SortedRezult(NewMyArray) For Each f In NewMyArray .AutoFilter Field:=18, Criteria1:=f Range("R3").FormulaR1C1 = "=GetCriteria(R[2]C)" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False Next f End With End Sub
Private Function SortedRezult(Massiv() As Variant) Dim nnn&, iii& Dim Tmp1 As Variant Dim Tmp2 As Variant ' On Error Resume Next If (Not Not Massiv) <> 0 Then 'Double negation allows checking that the array is not empty For iii = LBound(Massiv) To UBound(Massiv) Step 1 Tmp1 = Massiv(iii) For nnn = iii To UBound(Massiv) If Massiv(nnn) < Tmp1 Then Tmp1 = Massiv(nnn): Tmp2 = Massiv(iii) Massiv(iii) = Tmp1: Massiv(nnn) = Tmp2 End If Next nnn Next iii End If SortedRezult = Massiv End Function