Страницы: 1
RSS
Удаление макросов из модуля листа при его копировании в новую книгу
 
Всех приветствую!
Информации на эту тему порядочно. Читал здесь и здесь, но у меня не получается это реализовать :(

Есть макрос копирования двух листов в новую книгу
Скрытый текст

В модулях обоих листов на событие Worksheet_Activate повешены макросы. Разумеется они копируются вместе с листами. Код из указанных выше ссылок для удаления макросов в скопированных листах не срабатывает в моем исполнении, когда я его интегрирую в макрос копирования листов. Интегрирую - громко сказано :) Как варианты, запихивал код после Set NewWb = ActiveWorkbook, пробовал перед вызовом диалога выбора пути для сохранения, и по всякому крутил - тщетно. Метод тыка не сработал, прошу помощи.

 
а если сохранять в расширении xlsx
Код
NewWb.SaveAs Filename:=iPath & "Копия_" & DateString & ".xlsx"
Лень двигатель прогресса, доказано!!!
 
Лучше указать параметр FileFormat, а не расширение файла:
Код
NewWb.SaveAs Filename:=iPath & "Копия_" & DateString, FileFormat:=xlOpenXMLWorkbook
Изменено: sokol92 - 08.10.2018 16:15:11
Владимир
 
и перед этим удалить макросы руками
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Сергей, sokol92, к сожалению, дело не в этом.
Ігор Гончаренко, не то.

Приложу файл примера, может с ним будет удобнее. Там макрос запускается с третьего листа, копирует 1 и 2 листы, создаёт новый файл, но макросы из модулей созданных копированием листов не удаляет... на этом и застревает с ошибкой. Код удаления макросов сам по себе рабочий, я его отдельно проверил. Наверняка я его неверно помещаю в общий макрос. На всякий случай код из файла примера под спойлером.
Скрытый текст
Изменено: khama - 09.10.2018 02:56:19
 
Цитата
khama написал:
к сожалению, дело не в этом.
дело как раз в этом. xlsx формат не подразумевает сохранения макросов, и никакого кода по удалению городить не надо.
единственное, что в вашем случае надо будет добавить
Код
Application.EnableEvents = False
     Application.DisplayAlerts = False
 
Цитата
Dima S написал:
xlsx формат не подразумевает сохранения макросов
Тут не поспоришь. Но таким вариантом эксель ругается, что я пытаюсь сохранить файл с макросами в файл с типом их не поддерживающим. Спасибо за подсказку про отключение сообщений о событиях, сам недотрямкал, но с ними начинается чертовщина. Делаю так:
Код
...
    NewWb.SaveAs Filename:=iPath & "Копия_" & DateString, FileFormat:=xlOpenXMLWorkbook
    NewWb.Close

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True

    MsgBox "Копия_" & DateString & " сохранена в папку: " & iPath, vbInformation, "Завершено"
End Sub
В итоге новый файл сохраняется, MsgBox не выводится, исходный файл закрывается, новый файл остаётся открытым и еще и спрашивает подтверждение на сохранение изменений при закрытии. Жить, в принципе, можно... но задумка была другая и хочется реализовать именно её.
Изменено: khama - 09.10.2018 03:54:03
 
пробуйте.
Скрытый текст
 
Dima S, попробовал, результат корректный. Спасибо Вам за отклик и оптимизацию кода
 
Коллеги, прошу посодействовать в корректировке кода.
Задача - сохранить копию активного листа в новую книгу, при этом без макросов, которые ест в исходной книге (и желательно без элементов управления, которые ест на активном лисе (CommandButton1))
Мой код вот такой:
Код
ActiveSheet.CommandButton1.Visible = False
    NewFileName = "C:\Export\" & strNameFile & ".xls"
    ActiveSheet.Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=NewFileName _
        , FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
    ActiveWorkbook.Close SaveChanges:=False
    Application.DisplayAlerts = True
    ActiveSheet.CommandButton1.Visible = True


Но при открытии сохраненной книги Excel "ругается" что есть отключенные макросы. Как сохранить активный лист без макросов в исходном листе?

Спасибо за участие в решении вопроса.
 
Цитата
написал:
Как сохранить активный лист без макросов в исходном листе?
прочесть тему внимательнее и при сохранении задать нужное расширение и тип файла. А сейчас выглядит так, будто Вы не читая тему совершенно просто задали вопрос, не пытаясь что-то сделать самостоятельно.
xls не тоже самое, что xlsx.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
DEL.
С критикой из сообщения #13 согласен, это сообщение можно удалить.


Ещё вариант.

Programming In The VBA Editor (cpearson.com)
  • First, you need to set an reference to the VBA Extensibility library. The library contains the definitions of the objects that make up the VBProject. In the VBA editor, go the the Tools menu and choose References. In that dialog, scroll down to and check the entry for Microsoft Visual Basic For Applications Extensibility 5.3. If you do not set this reference, you will receive a User-defined type not defined compiler error.
Код
    Sub DeleteAllVBACode()
        Dim VBProj As VBIDE.VBProject
        Dim VBComp As VBIDE.VBComponent
        Dim CodeMod As VBIDE.CodeModule
        
        Set VBProj = ActiveWorkbook.VBProject
        
        For Each VBComp In VBProj.VBComponents
            If VBComp.Type = vbext_ct_Document Then
                Set CodeMod = VBComp.CodeModule
                With CodeMod
                    .DeleteLines 1, .CountOfLines
                End With
            Else
                VBProj.VBComponents.Remove VBComp
            End If
        Next VBComp
    End Sub
Изменено: МатросНаЗебре - 02.11.2022 09:19:54
 
Цитата
написал:
Ещё вариант.
в первом сообщении две ссылки - одна из них ведет на мою статью, где такой вариант так же рассматривается, плюс там есть отсылка на подробный разбор того, что еще потребуется для того, чтобы макросы по изменению проекта VBA заработали(например, галка в настройках). Поэтому сохранение в xlsx более универсально.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх