Страницы: 1
RSS
Как пропустить ошибку при вызове несуществующего макроса ?
 
Доброго времени суток, уважаемые!

Суть в следующем:
Существует книга с n-ым кол-вом листов и модулей. В одном из модулей есть макрос, который, если коротко - копирует один из листов в новую книгу. Этот лист содержит в себе следующий код:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
                                       On Error Resume Next                             ' ОТКЛЮЧИТЬ ПОКАЗ ОШИБОК
                                       Application.DisplayAlerts = False                ' ОТКЛЮЧИТЬ ВЫВОД СИСТЕМНЫХ СООБЩЕНИЙ
                                       Application.ScreenUpdating = False               ' ОТКЛЮЧИТЬ ОБНОВЛЕНИЕ ЭКРАНА
                                       ActiveWorkbook.RemovePersonalInformation = False ' ОТКЛЮЧЕНИЕ ОКНА С ТЕКСТОМ О ПЕРСОНАЛЬНЫХ ДАННЫХ
'=========================================================================
    If ActiveSheet.Name <> "Операции с картами" Then Exit Sub
    Dim rng As Range: Set rng = [O23:O24] 'диапазон Вашей таблицы
    If Not Intersect(rng, Target) Is Nothing Then

    ApLe = Application.Left
    ApTo = Application.Top
    ApWi = Application.Width
    ApHe = Application.Height
    
    Call OK_ВыбратьНОМЕРАГруппКарт
    
    Application.Left = ApLe
    Application.Top = ApTo
    Application.Width = ApWi
    Application.Height = ApHe
    
    End If    
End Sub
Обратите внимание на    Call OK_ВыбратьНОМЕРАГруппКарт
Т.к. я копирую только лист из книги без модулей, то выполнение кода невозможно, т.к. В НОВОЙ книге модуль листа ссылается на несуществующий макрос.

Подскажите, пожалуйста, как пропустить эту ошибку, либо осуществить копирование листа без учета макросов в нем?

Спасибо!
Хорошего дня!
Улыбнись.
 
Можно определить некий критерий, по которому будет понятно, надо ли выполнять этот код. И вызывать его через Run:
Код
Application.Run "'" & thisWorkbook.Name & "'!OK_ВыбратьНОМЕРАГруппКарт"
Тогда код не будет вызывать ошибку сразу же, если модуля нет. Но как уже писал, лучше определить условие и только при его выполнении выполнять эту строку.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, благодарю Вас!
Сделал следую Вашей рекомендации и все ок.

Код
Private Sub Worksheet_Change(ByVal Target As Range)

                                       On Error Resume Next                             ' ОТКЛЮЧИТЬ ПОКАЗ ОШИБОК
                                       Application.DisplayAlerts = False                ' ОТКЛЮЧИТЬ ВЫВОД СИСТЕМНЫХ СООБЩЕНИЙ
                                       Application.ScreenUpdating = False               ' ОТКЛЮЧИТЬ ОБНОВЛЕНИЕ ЭКРАНА
                                       ActiveWorkbook.RemovePersonalInformation = False ' ОТКЛЮЧЕНИЕ ОКНА С ТЕКСТОМ О ПЕРСОНАЛЬНЫХ ДАННЫХ
'=========================================================================

    If ActiveSheet.Name <> "Операции с картами" Then Exit Sub
    
    
    
    Dim rng As Range: Set rng = [O23:O24] 'диапазон Вашей таблицы
    
    
    If Not Intersect(rng, Target) Is Nothing Then

    ApLe = Application.Left
    ApTo = Application.Top
    ApWi = Application.Width
    ApHe = Application.Height
    
    Application.Run "'" & ThisWorkbook.Name & "'!OK_ВыбратьНОМЕРАГруппКарт"
    
    Application.Left = ApLe
    Application.Top = ApTo
    Application.Width = ApWi
    Application.Height = ApHe
    
    End If
    
End Sub
Улыбнись.
 
Цитата
falmrom написал: макрос, который, если коротко - копирует один из листов в новую книгу....
...осуществить копирование листа без учета макросов в нем
Сохраните эту Новую книгу со скопированным листом, в формате БЕЗ поддержки макросов (*.xlsx) и все макросы исчезнут сами
Или...
Для того, чтобы удалить из текущей рабочей книги : все стандартные модули, модули класса, UserForm, а также программный код из всех модулей листа, книги, (VBProject не должен быть защищён)
Код
Private Sub DeleteModulesAndCode()
    For Each iVBComponent In ThisWorkbook.VBProject.VBComponents
        With iVBComponent
             Select Case .Type
                 Case 1 To 3: .Collection.Remove iVBComponent
                 Case 100: .CodeModule.DeleteLines _
                 1, .CodeModule.CountOfLines
             End Select
        End With
    Next
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Еще один рецепт: если лист планируется к экспорту, то лучше изначально обработку событий из него перенести в модуль книги (тем более, что в #1 приведен пример как раз из модуля книги).
Изменено: sokol92 - 01.04.2019 12:40:21
Владимир
 
Цитата
Sanja написал:
VBProject не должен быть защищён
и у того, кто будет выполнять код должна в параметрах безопасности стоять галка "Доверять доступ к объектной модели VBA"...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх