Страницы: 1
RSS
Выполнить макрос на всех листах
 
Доброго времени суток
Как сделать так, чтобы При сохранении книги макрос работал на всех листах где это нужно, а не только на активном?

Скрытый текст
 
нужно понимать что Вы хотите получить от макроса
и
написать его так, чтобы он выполнял поставленную задачу
Изменено: Ігор Гончаренко - 10.03.2017 14:09:11
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Если в макрос вставить
Скрытый текст

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

Как проверить наличии "КнопкаЗОР" на листе
или
прописать В СЛУЧАИ ОТСУТСТВИИ ТАКОВОЙ
 
Цитата
SHARP написал:
тогда он будет всегда выполняться на всех листах, а мне нужно чтобы только при сохранении
1. Вы сами просили на всех листах.
2. Вызывайте эту процедуру при  наступлении события сохранения.
===
И перечитайте цитату - какая связь? ))
 
Макрос "ЗАКРЫТЬ" вызывается нажатием кнопки активного листа и выполняется только на текущем листе
при вызове процедуры сохранить надо, чтобы этот макрос "ЗАКРЫТЬ" выполнялся на всех листах.
сам дошел до создания двух макросов для различных процедур.
 
Цитата
SHARP написал:
надо, чтобы этот макрос "ЗАКРЫТЬ" выполнялся на всех листах
Перебирайте листы циклом и выполняйте нужные действия для каждого листа.
А вот эта строка
Код
If Worksheets(i).Name <> "" Then
вызывает недоумение: не может лист не иметь имени.
 
про это я писал посте #3
Выходит нужно два макроса, с перебором листов и без и других вариантов нет?
 
Я читал #3. Зачем два макроса? Нажали на кнопку, макрос перебирает все листы, на каждом выполняет нужные операции. Проблема в чём?
И Вы ничего не ответили про проверку имя листа в #6.
 
Проблема в том, что пи нажатии кнопки макрос должен выполнятся только на активном листе и мне не нужно, чтобы он перебирал другие листы и делал на них какие либо изменения. Данная задача ставиться только при сохранении книги.
Строкой в посте#6 я организую условия для переборки всех листов. Т.к. лист не может не иметь имени, значит будут перебраны все листы.
Бывают листы, в которых не требуются изменения и впоследствии они могут туда быть вписаны.
Изменено: SHARP - 10.03.2017 15:44:23
 
Если при нажатии на кнопку макрос должен делать действия только на активном листе, а при событии сохранения пройтись по всем, то я бы добавил глобальную логическую переменную и проверял её значение: например, если ИСТИНА, обработали только активный лист и вышли из процедуры. Если ЛОЖЬ - выполняется цикл.
Цитата
SHARP написал:
Строкой в посте#6 я организую условия для переборки всех листов. Т.к. лист не может не иметь имени, значит будут перебраны все листы.
Макрос и так переберёт ВСЕ листы. Условие перебора всех листов задаётся не строкой, которую я цитировал, а параметрами цикла. В Вашем случае с первого листа по последний.
 
Цитата
SHARP написал:
Бывают листы, в которых не требуются изменения
Имена листов известны?
Цитата
SHARP написал:
Как проверить наличии "КнопкаЗОР" на листе
Можно так:
Код
function IsShapeExists(ws as worksheet, s as string)
dim osh as shape
on error resume next
set osh = ws.shapes(s)
IsShapeExists = not osh is nothing
end function

Sub CallCheck()
dim ws as worksheet
for each ws in thisworkbook.worksheets
if IsShapeExists(ws,"КнопкаЗОР") then
'здесь есть кнопка с именем "КнопкаЗОР"
end if
next
end sub

при условии, что кнопка является элементом форм или автофигурой. С ActiveX подход определения на листе иной будет, хоть общий принцип тот же.

Или можно просто перебрать только нужные листы:
Код
Sub CycleByNames()
dim ws as worksheet
dim arr,x
arr = array("Лист1","Лист5","Отчет")
for each x in arr
set ws = thisworkbook.sheets(x)
'что-то делаем с листом, например, активируем
ws.Select
next
end sub
Изменено: The_Prist - 10.03.2017 16:05:12
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Юрий М написал:
я бы добавил глобальную логическую переменную и проверял её значение: например, если ИСТИНА, обработали только активный лист и вышли из процедуры. Если ЛОЖЬ - выполняется цикл.
Я про это и спрашиваю. Я понимаю, что при разных условиях и разное решение. Решение готово, а условия построить не получается.
Цитата
The_Prist написал:
Имена листов известны?
Все листы имеют разное название, но те, которые перебирать не надо - Известны.
Цитата
The_Prist написал:
С ActiveX подход определения на листе иной будет
у меня как раз ActiveX, но ваш код встал как влитой. Спасибо
 
В модуль книги:
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Flag = True
    Call ЗАКРЫТЬ
End Sub
В стандартный модуль:
Код
Public Flag As Boolean
Sub ЗАКРЫТЬ()
'Выполняются операции только на активном листе
    ActiveSheet.КнопкаЗОР.Caption = "ЗАКРЫТО"
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    If Not Flag Then Exit Sub
'Все последующие строки будут выполнены только в том случае, если макрос был вызван по событию
    For i = 1 To Sheets.Count
        If Worksheets(i).Name <> "Лист1" And Worksheets(i).Name <> "Лист3" Then
            Sheets(i).Activate 'Активация листа только для примера: здесь нужные операции с листами
        End If
    Next
    Flag = False
End Sub
Имена листов, которые обрабатывать не нужно, подставьте свои.
 
ЗДОРОВО, СПАСИБО!
 
Доброго времени суток
в продолжении темы "выполнение макроса на всех листах"
имею вот такой макрос (удаление строк со значением "0"):
Код
Sub M55_DelRows2()
    Dim x As Range, y As Range, fst As String
    Set x = [B:B].Find(0, , xlValues, xlWhole)
    If Not x Is Nothing Then
        fst = x.Address
        Do
            If y Is Nothing Then Set y = x Else Set y = Union(y, x)
            Set x = [B:B].FindNext(x)
        Loop While fst <> x.Address
        y.EntireRow.Delete
    End If
End Sub

он выполняется только на первом листе
что необходимо дописать/исправить что бы выполнял на всех листах или на выбранных листах

заранее благодарю

Изменено: assedo - 21.07.2017 16:39:31
 
Для ВСЕХ листов
Код
Sub M55_DelRows2()
Dim sh As Worksheet, x  As Range, y As Range, fst As String
For Each sh In Worksheets
    With sh
        Set x = .Columns("B").Find(0, , xlValues, xlWhole)
        If Not x Is Nothing Then
            fst = x.Address
            Do
                If y Is Nothing Then Set y = x Else Set y = Union(y, x)
                Set x = .Columns("B").FindNext(x)
            Loop While fst <> x.Address
            y.EntireRow.Delete
        End If
    End With
Next
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja,
Благодарю, хорошего дня.
Страницы: 1
Наверх