Удалить vba коды с листа excel

 

Как можно написать код, чтоб стирать определенные коды макросов (VBA) с определенного листа книги? Заранее очень благодарен!

 
 
 

Вот так можно удалить Module1  

  Sub KillModule1()  
   Dim iModule As Object  
   With ThisWorkbook.VBProject.VBComponents  
       For Each iModule In ThisWorkbook.VBProject.VBComponents  
           If iModule.Name = «Module1» Then .Remove iModule  
   Next  
   End With  
End Sub

 

Нет, не удалять весь модуль, а удалять определенные коды макросов с Листа где они написаны. Я думаю нам надо сперва выбрать по имени некоторые только коды и затем удалить с листа.

 

Я не знаю, как удалить отдельный макрос в модуле. Если узнаете — сообщите.  

  Вот вам интересная ссылка    

http://www.vbstreets.ru/VBA/Articles/65935.aspx

 

** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU====

Гость

Сервис -> Макрос -> Безопасность -> Надежные издатели -> [+] Доверять доступ к Visual Basic Project

  Для модуля первого листа:  
Sub TestVBE()  
MsgBox Application.VBE.VBProjects.Item(1).VBComponents(2).CodeModule.Lines(1, 1)    
End Sub  

  Циклом или ещё как подбираешь требуемые циферки и DeleteLines(от,сколько).

 

Спасибо,    
я посметрел ссылку там сложнее, строки удаляет. наверно будет проше удалять макросы по имени?  
А как удалить просто определенные макросы?

 

Вот нашёл  

  Source:

http://msoffice.nm.ru/faq/macros/module.htm#faq47  

  Sub DeleteProcedure()  
Dim iProcedure As String  
Dim iVBComponent As Object  
Dim iStartLine As Long  
Dim iCountLines As Long  
Dim Killed As Boolean  
   iProcedure = InputBox(Prompt:=»Введите имя макроса,» & _  
   vbCrLf & «который требуется удалить», Title:=»Удаление макроса»)  
   If iProcedure$ = «» Then _  
   MsgBox «Вы не указали имя ненужного макроса», 48, «Ошибка»: Exit Sub  
   For Each iVBComponent In ActiveWorkbook.VBProject.VBComponents  
       With iVBComponent.CodeModule  
            If .Find(«Sub » & _  
               iProcedure$, 1, 1, .CountOfLines, 1) = True Then  
               iStartLine& = .ProcStartLine(iProcedure$, 0)  
               iCountLines& = .ProcCountLines(iProcedure$, 0)  
               .DeleteLines iStartLine&, iCountLines&  
               Killed = True  
               Exit For  
            End If  
       End With  
   Next  
   If Killed = True Then  
       MsgBox «Макрос » & iProcedure$ & » удалён!», 64, «Удаление макроса»  
   Else  
       MsgBox «Макрос » & iProcedure$ & » не найден!», 48, «Удаление макроса»  
   End If  
End Sub

 

Спасибо. Знаешь для чего это нужно было? Просто я когда копирую определенный лист, вот там на создавшемся новом листе надо было удалить некоторые макросы, прибывшие от того листа. Вот я хотел чтоб когда лист копировался внутри этого кода пришить удаление некоторых кодов, так как в новом листе некоторые из них непонадобиться!  
Т.е мне не надо выводить форму, что спрашивала которую удалить, а я заранее напишу какую надо удалить! (Удалять не с модуля а с образовавшегося копий листа)  
Заранее спасибо!

 

{quote}{login=to……..Pavel55}{date=25.06.2008 03:51}{thema=}{post}Спасибо. Знаешь для чего это нужно было? Просто я когда копирую определенный лист, вот там на создавшемся новом листе надо было удалить некоторые макросы, прибывшие от того листа. Вот я хотел чтоб когда лист копировался внутри этого кода пришить удаление некоторых кодов, так как в новом листе некоторые из них непонадобиться!  
Т.е мне не надо выводить форму, что спрашивала которую удалить, а я заранее напишу какую надо удалить! (Удалять не с модуля а с образовавшегося копий листа)  
Заранее спасибо!{/post}{/quote}  
А не проще было эти лишние макросы хранить не  модуле листа, а в модуле проекта (Module1)?  
Если же это код, реагирующий на события листа, то его можно с минимальными корректировками переписать в модуль ЭтаКнига.

 

У меня и так коды написаны в Модуль1 Проекта, а на листе написаны только минимально ссылки на них, (т.е «Call …»), а мне надо чтоб один образцовый лист копировался и на копий удалялись ненужные уже (не все) коды, я их заранее перечислил бы! Ну это думаю не критично, т.к каждый код состоит из только 3-строк (Private Sub, Call…., и End Sub)  
и таких где то 10-кодов!!!  
 А на счет ЭТА КНИГА я этим не пользовался, не знаю его важность, просто когда я писал основной макрос там и вызывал с листа с помощью CALL тогда он не вызывался, а когда написал код в Модуле1 Проекта тогда получился. Если можете обясните разницу

 

{quote}{login=:)}{date=25.06.2008 11:45}{thema=Re: }{post}{quote}{login=to……..Pavel55}{date=25.06.2008 03:51}{thema=}{post}Спасибо. Знаешь для чего это нужно было? Просто я когда копирую определенный лист, вот там на создавшемся новом листе надо было удалить некоторые макросы, прибывшие от того листа. Вот я хотел чтоб когда лист копировался внутри этого кода пришить удаление некоторых кодов, так как в новом листе некоторые из них непонадобиться!  
Т.е мне не надо выводить форму, что спрашивала которую удалить, а я заранее напишу какую надо удалить! (Удалять не с модуля а с образовавшегося копий листа)  
Заранее спасибо!{/post}{/quote}  
А не проще было эти лишние макросы хранить не  модуле листа, а в модуле проекта (Module1)?  
Если же это код, реагирующий на события листа, то его можно с минимальными корректировками переписать в модуль ЭтаКнига.{/post}{/quote}  
Добрый день!  
Например, есть OptionButton25 на Лист1. Код обработки события Click написан в Лист1. Как перенести код в Модуль1, чтобы работало оттуда, подскажите?  
Спасибо!

 

Inter_E

Пользователь

Сообщений: 399
Регистрация: 01.01.1970

Добрый День Дмитрий! Короче код вставь в Модуль, и он должен начинаться не с Private Sub а просто Sub и имя Макроса. A код с листа надо убрать! И чтоб ссылалось на Модуль тебе надо написать на Лист1 код, например  

  Private Sub OptionButton25.Click ()  
Call «Имя макроса с модуля»  
End Sub  

  и все

With my best regards,      Inter_E

 

Спасибо, а если перенести код в модуль ЭтаКнига?  
Нужно, чтобы в модулях Лист1, Лист2 и т.д. не было кода..

 

Inter_E

Пользователь

Сообщений: 399
Регистрация: 01.01.1970

Если зделать как в случае Модуль1, то не будет работать, у меня не работало. Я думаю лучше не переносить в Эта книга. Я просто об Эта книга не знаю для чего она нужна. Ты лучше по эксперементируй. И мне обяснишь потом? Зачем нужна Эта книга? ОК?

With my best regards,      Inter_E

 

Алекс

Гость

#17

02.12.2008 19:27:26

www.spkk.ru

Кондиционеры тут

Прикрепленные файлы

  • post_41112.gif (3.86 КБ)

I want to delete the VBA code contained within a sheet through VBA. Currently, I have a code that copies a sheet across to a new workbook and deletes all images from it. However, these images are set to do things on Worksheet_Activate in the code, which then causes an error whenever I flick to that sheet with no images there.

I know I can get rid of modules etc using something along the lines of:

 With ActiveWorkbook.VBProject 
        For x = .VBComponents.Count To 1 Step -1 
            .VBComponents.Remove .VBComponents(x) 
        Next x 
        For x = .VBComponents.Count To 1 Step -1 
            .VBComponents(x).CodeModule.DeleteLines _ 
            1, .VBComponents(x).CodeModule.CountOfLines 
        Next x 
    End With

but that does not delete from the sheet (or the workbook for that matter. Would be interesting to know if that was possible too).

The code itself will need to be valid for Excel versions 2003 through to 2013 (so cannot use the save as xlsx workaround).

Nimantha's user avatar

Nimantha

6,6036 gold badges29 silver badges66 bronze badges

asked Nov 26, 2013 at 16:48

bmgh1985's user avatar

10

Found out the issue. My code works fine, just the computer I was testing it on did not allow access to the VBA project object model (and was running it with an On Error Resume Next earlier on in the code)

Will have to write an exception in to sort that out in such cases.

Thanks to @mehow @nixda @SiddharthRout and @DaveU for the help

Nimantha's user avatar

Nimantha

6,6036 gold badges29 silver badges66 bronze badges

answered Nov 27, 2013 at 9:10

bmgh1985's user avatar

bmgh1985bmgh1985

7781 gold badge14 silver badges38 bronze badges

0

Хитрости »

6 Июнь 2011              79278 просмотров


Как удалить макросы в книге?

Рано или поздно у разработчиков возникает вопрос: как удалить макросы, в том числе и из книги, в которой эти макросы расположены? Да еще так, чтобы об этом никто ничего не узнал?

Для изменения кодов программно необходимо, чтобы было проставлено доверие к объектной модели проекта VBA и изменяемый проект не должен быть защищен. Подробнее читайте в статье: Что необходимо для внесения изменений в проект VBA(макросы) программно
Без этого будет невозможно программное вмешательство в проект VBA.

  • Удалить все макросы из активной книги
  • Удалить отдельный модуль(Module), Форму(UserForm), Код листа или книги
  • Удалить отдельную процедуру из модуля
  • Удалить все макросы вручную

 
УДАЛИТЬ ВСЕ МАКРОСЫ ИЗ АКТИВНОЙ КНИГИ

Sub Delete_Macroses()
    Dim oVBComponent As Object, lCountLines As Long
    'Проверяем, защищен проект или нет
    If ActiveWorkbook.VBProject.Protection = 1 Then
        MsgBox "VBProject выбранной книги защищён." & vbCrLf & _
             "     Компоненты не будут удалены.", vbExclamation, "Отмена выполнения"
        Exit Sub
    End If
 
    For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents
        On Error Resume Next
        With oVBComponent
            Select Case .Type
            Case 1    'Модули
                .Collection.Remove oVBComponent
            Case 2    'Модули Класса
                .Collection.Remove oVBComponent
            Case 3    'Формы
                .Collection.Remove oVBComponent
            Case 100    'ЭтаКнига, Листы
                    lCountLines = .CodeModule.CountOfLines
                    .CodeModule.DeleteLines 1, lCountLines
            End Select
        End With
    Next
    Set oVBComponent = Nothing
End Sub

 
Так же можно удалить макросы только из одного компонента(листа или книги или модуля).

УДАЛИТЬ ОТДЕЛЬНЫЙ МОДУЛЬ(Module), ФОРМУ(UserForm) КОД ЛИСТА ИЛИ КНИГИ
Удалить модуль/форму целиком достаточно просто:

ActiveWorkbook.VBProject.VBComponents("UserForm1").Collection.Remove ActiveWorkbook.VBProject.VBComponents("UserForm1")
ActiveWorkbook.VBProject.VBComponents("Module1").Collection.Remove ActiveWorkbook.VBProject.VBComponents("Module1")

С листами несколько сложнее — если удалить компонент полностью, то будут потеряны и все данные на листе, а не только макросы. Поэтому удалять необходимо только код внутри листа. В качестве примера возьмем Лист1:

Sub Delete_Macroses_In_One_Comp()
    Dim oVBComponent As Object, lCountLines As Long
    Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Лист1")
    With oVBComponent
        lCountLines = .CodeModule.CountOfLines
        .CodeModule.DeleteLines 1, lCountLines
    End With
    Set oVBComponent = Nothing
End Sub

Здесь тоже есть небольшая поправка: Лист1 — это кодовое(внутреннее имя) листа. На ярлычке имя листа может отображаться как угодно, а вот внутреннее…Его можно лучше подглядеть через редактор VBA:

Подробнее про кодовое имя листа можно прочитать в этой статье: Кодовое имя листа — что это и зачем нужно? Какие плюсы и минусы?
Чтобы удалить коды из модуля книги необходимо вместо Лист1 указать ЭтаКнига(для англ.версии — ThisWorkbook).

 
УДАЛИТЬ ОТДЕЛЬНУЮ ПРОЦЕДУРУ ИЗ МОДУЛЯ
Если же Вам необходимо удалить лишь определенную процедуру из модуля формы, стандартного модуля, модуля листа или книги, то сделать это чуть сложнее. Рассмотрим на примере удаления процедуры с именем "Code2", расположенной в стандартном модуле "Module2"

Sub Delete_Sub_From_Module()
    Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Module2")
        'получаем кол-во строк кода в модуле
        lCountLines = .CodeModule.CountOfLines
        'получаем первую строку с кодом, исключая строки декларирования функции и опций модуля
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'цикл по всем строкам кода внутри модуля
        For li = lStartLine To lCountLines
            'получаем имя процедуры/функции, внутри которой строка кода
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'если имя процедуры совпадает с тем, которое нам нужно
            If sProcName = "Code2" Then
                'узнаем кол-во строк процедуры/функции
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'удаляем процедуру/функцию
                .CodeModule.DeleteLines li, lProcLineCount - 1
                Exit For
            End If
        Next li
    End With
End Sub

Здесь стоит обратить внимание на один момент: данный поиск чувствителен к регистру. Т.е. если требуется удалить процедуру "Code2", то и к сравнению надо вписывать имя именно так. Если записать "code2", то совпадения найдено не будет и процедура не будет удалена. Во избежание подобного можно приводить имена к одному регистру:
If LCase(sProcName) = LCase(«Code2») Then


УДАЛИТЬ ВСЕ МАКРОСЫ ВРУЧНУЮ

Еще хочу добавить, что если надо не скрыто, а просто быстро удалить все макросы из книги и Вы счастливый обладатель Excel версии 2007 и выше, то всего лишь необходимо книгу, из которой хотите удалить макросы, Сохранить как -обычная Книга Excel (

Файл(File)(или кнопка Меню для 2007 Excel)

Сохранить как(Save As)

Книга Excel(Excel Workbook)

).

Программно это можно сделать простым кодом:

Sub SaveBookWithoutMacro()
    ActiveWorkbook.SaveAs Filename:="C:Книга1.xlsx", FileFormat:=51
End Sub

Отдельную роль здесь играет параметр FileFormat, которому мы назначаем значение 51. По сути 51 — это значение константы xlOpenXMLWorkbook, которая говорит VBA, что файл надо сохранить в формате обычной книги Excel без поддержки макросов. Работает только начиная с 2007 Excel.

Для тех же, кто все еще использует офис 2003 и ранее и хочет удалить коды и макросы вручную — придется удалять каждый модуль из проекта и каждый код из модулей листов и книг поочередно, руками.

Также см.:
Копирование модулей и форм из одной книги в другую
Как программно снять пароль с VBA проекта?


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Содержание:

  1. Удалите все макросы, сохранив файл в формате XLSX
  2. Удалить определенные макросы из диалогового окна «Макрос»
  3. Удалите модуль с макросом

[lyte id=’lyNJbZfM7TU’ /]

Использование макросов VBA в Excel может значительно сэкономить время. Вы можете автоматизировать множество повторяющихся задач и создавать новые функции и возможности в Excel с помощью простых кодов макросов VBA.

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

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

В этом уроке я покажу вам несколько действительно простых способов удалить макросы из книги в Microsoft Excel.

Итак, приступим!

Удалите все макросы, сохранив файл в формате XLSX

Если вы хотите избавиться от всех макросов сразу, самый простой способ сделать это — сохранить существующую книгу в формате XLSX.

По умолчанию у вас не может быть кода макроса VBA в формате файла XLSX. Если вы это сделаете, он будет автоматически удален при сохранении файла Excel.

В Excel вы можете использовать макросы только в форматах .XLSM, .XLSB и более старых форматах .XLS. Когда вы сохраняете книгу в любом другом формате, макросы сразу теряются.

Предположим, у вас есть файл с именем Example.xlsm (с макросами), ниже приведены шаги по удалению всех макросов из этого файла:

  1. Перейдите на вкладку Файл.
  2. Нажмите на опцию «Сохранить как» (в новых версиях Excel это «Сохранить копию»).
  3. Щелкните Обзор. Откроется диалоговое окно «Сохранить как».
  4. В диалоговом окне «Сохранить как» введите имя файла, с которым вы хотите его сохранить. Вы также можете сохранить существующее имя, если хотите
  5. Щелкните раскрывающийся список Тип файла.
  6. Выберите вариант «Книга Excel (* .xlsx)».
  7. Нажмите на Сохранить
  8. В появившемся запросе нажмите Да. Он просто информирует вас о том, что код VB будет утерян, если вы сохраните этот файл в формате .XLSX.

Вот и все! Теперь ваш файл не содержит макросов.

Этот метод удобен тем, что удаляет все макросы из текущей книги Excel за один раз. Однако, если вы хотите удалить некоторые макросы и удалить некоторые, этот метод не сработает для вас (см. Тот, который использует диалоговое окно «Макрос» для этого).

Еще одна хорошая особенность этого метода заключается в том, что у вас все еще есть копия исходного файла со всеми макросами (на случай, если она вам понадобится в будущем).

Удалить определенные макросы из диалогового окна «Макрос»

Хотя предыдущий метод удалял все макросы. это позволяет вам выбрать те, которые вы хотите удалить.

И если вы хотите удалить все макросы, вы также можете это сделать.

Предположим, у вас есть файл с именем Example.xlsm, в котором есть несколько макросов.

Ниже приведены шаги по удалению макроса из этой книги:

  1. Перейдите на вкладку Разработчик (если вы не видите вкладку Разработчик, обратите внимание на примечание желтого цвета после шагов)
  2. Щелкните по кнопке Macros. Откроется диалоговое окно «Макрос», в котором вы увидите все макросы в книге.
  3. Убедитесь, что в раскрывающемся списке «Макросы в» выбрана «Эта книга».
  4. Выберите имя макроса, который вы хотите удалить, из списка макросов.
  5. Щелкните по кнопке Удалить. Это удалит выбранный макрос

Если вы хотите удалить несколько (или все) макросов, повторите шаги 4 и 5.

Примечание. Если вы не видите вкладку разработчика, нажмите здесь, чтобы узнать, как отобразить вкладку разработчика на ленте в Excel. Кроме того, вы также можете использовать сочетание клавиш — ALT + 8, чтобы открыть диалоговое окно «Макрос».

Кроме того, вы также можете щелкнуть вкладку «Представления», щелкнуть раскрывающийся список «Макросы» и затем выбрать опцию «Просмотр макросов». Это также откроет диалоговое окно Macros.

Хотя этот метод отлично работает, он позволяет удалять только макросы, которые хранятся в модуле редактора Visual Basic. Если у вас есть макросы событий (в определенных листах или ThisWorkbook) или макросы в личной книге макросов, их нельзя удалить с помощью этого метода.

Удалите модуль с макросом

Другой способ удалить макросы — перейти в редактор Visual Basic и удалить оттуда макросы.

Этот метод дает вам наибольший контроль, поскольку вы можете получить доступ ко всем макросам (будь то в модуле, объектах или личной книге макросов).

Ниже приведены шаги по удалению макроса из редактора Visual Basic:

  1. Щелкните вкладку Разработчик на ленте.
  2. Нажмите на опцию Visual Basic (или воспользуйтесь сочетанием клавиш — ALT + F11)
  3. В редакторе VB у вас будут все объекты книги в Project Explorer. Если вы не видите Project Explorer, выберите опцию View в меню, а затем нажмите Project Explorer.
  4. В Project Explorer дважды щелкните объект с кодом макроса. Это может быть модуль, объект рабочего листа или ThisWorkbook.
  5. В открывшемся окне кода удалите макросы, которые хотите удалить. Если вы хотите удалить все, просто выберите все и нажмите клавишу удаления.

Если у вас есть модуль, который имеет код, который вы хотите удалить, вы можете щелкнуть правой кнопкой мыши объект модуля, а затем выбрать опцию «Удалить модуль».

Итак, это три способа удаления макросов из книги Microsoft Excel.

Надеюсь, вы нашли этот урок полезным!

Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

1

Удалить макрос из листа

06.02.2013, 17:26. Показов 3973. Ответов 20

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день!
Есть макрос на Лист1 (Проба)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column = 7 And Target.Row > 1 And Target.Cells.Count = 1 Then
        Set MyRange = ActiveCell
        Cancel = True
        wsDict.Select
       
       ' If Len(Target.Value) > 0 Then
           ' wsDict.Columns(1).AutoFilter Field:=1, Criteria1:="=" & Left$(Target.Value, 1) & "*"
       ' End If
    End If
    
 
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sNew As String
    If Target.Column = 7 Then
        With Application
            .EnableEvents = False
            sNew = Target.Value
            .Undo
            If Len(Target.Value) = 0 Then  
                Target.Value = sNew
            End If
            .EnableEvents = True
        End With
    End If
End Sub

Как с помощью макроса можно его удалить и сохранить книгу?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

06.02.2013, 17:26

20

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.02.2013, 17:37

2

Самое простое в новейших версиях — сохранить файл как xlsx.



0



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

06.02.2013, 18:28

 [ТС]

3

Hugo121, Я наверное не так написал, мне нужно с помощью макроса удалить этот код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column = 7 And Target.Row > 1 And Target.Cells.Count = 1 Then
        Set MyRange = ActiveCell
        Cancel = True
        wsDict.Select
       
       ' If Len(Target.Value) > 0 Then
           ' wsDict.Columns(1).AutoFilter Field:=1, Criteria1:="=" & Left$(Target.Value, 1) & "*"
       ' End If
    End If
    
 
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sNew As String
    If Target.Column = 7 Then
        With Application
            .EnableEvents = False
            sNew = Target.Value
            .Undo
            If Len(Target.Value) = 0 Then  
                Target.Value = sNew
            End If
            .EnableEvents = True
        End With
    End If
End Sub

а потом сохранить автоматически



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.02.2013, 18:41

4

Вы не написали, что это за Эксель.
Ну а я бы не мудрил, а просто сохранил файл без поддержки макросов — запишите такое сохранение рекордером, используйте.
Если конечно не на 2000/2003 сидите



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

06.02.2013, 18:49

 [ТС]

5

Hugo121, мне нужно обязательно удалить этот код с помощью макроса, у меня 2003



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.02.2013, 19:09

6

Вот дилемма — тут в правилах нельзя давать ссылки на другие сайты, там же «Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора».
Не буду ничего нарушать!



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

06.02.2013, 19:19

 [ТС]

7

Hugo121, ты че [удалено]



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.02.2013, 19:26

8

Лучший ответ Сообщение было отмечено как решение

Решение

Ого!
Разговор окончен.



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

06.02.2013, 19:38

 [ТС]

9

Hugo121, спасибо что «помог»



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

07.02.2013, 10:03

10

Visual Basic
1
2
3
4
5
6
7
Sub Del_ShCode()
    Dim lCountLines As Long
    With ActiveWorkbook.VBProject.VBComponents("Лист1")
        lCountLines = .CodeModule.CountOfLines
        .CodeModule.DeleteLines 1, lCountLines
    End With
End Sub

«Лист1» — это кодовое имя листа, а не то, что отображено на ярлычке. Его можно посмотреть либо из редактора, либо получить кодом:

Visual Basic
1
Activesheet.codename



2



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

07.02.2013, 13:35

 [ТС]

11

The_Prist, Спасибо большое за очередную поддержку, но я имею ввиду удалить не весь код в Лист1 а только

Visual Basic
1
2
3
4
5
6
7
8
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    .....
     
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
 ....
End Sub



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

07.02.2013, 13:40

12

Я Вам на другом форуме дал ссылку на статью. Там все расписано и Ваш случай так же упомянут. А Вам советую свои пожелания сразу нормально обозначать, не скупясь на слова и пояснения.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Delete_Sub_From_Module()
    Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Module2")
        'получаем кол-во строк кода в модуле
        lCountLines = .CodeModule.CountOfLines
        'получаем первую строку с кодом, исключая строки декларирования функции и опций модуля
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'цикл по всем строкам кода внутри модуля
        For li = lStartLine To lCountLines
            'получаем имя процедуры/функции, внутри которой строка кода
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'если имя процедуры совпадает с тем, которое нам нужно
            If sProcName = "Code2" Then
                'узнаем кол-во строк процедуры/функции
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'удаляем процедуру/функцию
                .CodeModule.DeleteLines li, lProcLineCount - 1
                Exit For
            End If
            li = li + lProcLineCount
        Next li
    End With
End Sub



1



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

07.02.2013, 13:48

 [ТС]

13

The_Prist, Вот я подправил код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub red_r()
Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Ëèñò1")
        'ïîëó÷àåì êîë-âî ñòðîê êîäà â ìîäóëå
        lCountLines = .CodeModule.CountOfLines
        'ïîëó÷àåì ïåðâóþ ñòðîêó ñ êîäîì, èñêëþ÷àÿ ñòðîêè äåêëàðèðîâàíèÿ ôóíêöèè è îïöèé ìîäóëÿ
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'öèêë ïî âñåì ñòðîêàì êîäà âíóòðè ìîäóëÿ
        For li = lStartLine To lCountLines
            'ïîëó÷àåì èìÿ ïðîöåäóðû/ôóíêöèè, âíóòðè êîòîðîé ñòðîêà êîäà
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'åñëè èìÿ ïðîöåäóðû ñîâïàäàåò ñ òåì, êîòîðîå íàì íóæíî
            If sProcName = "Worksheet_BeforeDoubleClick" Then
                'óçíàåì êîë-âî ñòðîê ïðîöåäóðû/ôóíêöèè
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'óäàëÿåì ïðîöåäóðó/ôóíêöèþ
                .CodeModule.DeleteLines li, lProcLineCount - 1
                Exit For
            End If
            li = li + lProcLineCount
        Next li
    End With
End Sub

Он удалил но оставил

Visual Basic
1
2
Option Explicit
End Sub

как это тоже удалить?
И как поставить еще чтобы он второй код удалял?



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

07.02.2013, 17:31

14

Лучший ответ Сообщение было отмечено как решение

Решение

По первому вопросу:

Visual Basic
1
.CodeModule.DeleteLines li, lProcLineCount - 1

заменить на

Visual Basic
1
.CodeModule.DeleteLines li, lProcLineCount

по второму:

Visual Basic
1
If sProcName = "Worksheet_BeforeDoubleClick" or sProcName = "имя другой процедуры" Then

Пора бы уже…

Может имеет смысл уже начать изучать синтаксис? Хотя бы начало, что ли. В статье даже написано как определяется имя процедуры. Осталось лишь дополнить конструкцию If … Then. Но без базовых знаний Вы, естественно, не можете этого сделать, т.к. даже не предполагаете где это делать. Это плохо. Форумы предназначены все же для помощи в изучении, а не для решения чужих задач.



2



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

08.02.2013, 08:57

 [ТС]

15

Спасибо большое, я пишу на 1С, я предполагал что нужно and или or ставить но не получилось оказало что нужно sProcName = «имя другой процедуры»

Добавлено через 13 часов 55 минут
The_Prist, Почему то второй не удалил код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub red_r()
Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Ëèñò1")
        'ïîëó÷àåì êîë-âî ñòðîê êîäà â ìîäóëå
        lCountLines = .CodeModule.CountOfLines
        'ïîëó÷àåì ïåðâóþ ñòðîêó ñ êîäîì, èñêëþ÷àÿ ñòðîêè äåêëàðèðîâàíèÿ ôóíêöèè è îïöèé ìîäóëÿ
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'öèêë ïî âñåì ñòðîêàì êîäà âíóòðè ìîäóëÿ
        For li = lStartLine To lCountLines
            'ïîëó÷àåì èìÿ ïðîöåäóðû/ôóíêöèè, âíóòðè êîòîðîé ñòðîêà êîäà
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'åñëè èìÿ ïðîöåäóðû ñîâïàäàåò ñ òåì, êîòîðîå íàì íóæíî
            If sProcName = "Worksheet_BeforeDoubleClick" Or sProcName = "Worksheet_Change" Then
                'óçíàåì êîë-âî ñòðîê ïðîöåäóðû/ôóíêöèè
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'óäàëÿåì ïðîöåäóðó/ôóíêöèþ
                .CodeModule.DeleteLines li, lProcLineCount
                Exit For
            End If
            li = li + lProcLineCount
        Next li
    End With
End Sub



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

08.02.2013, 10:21

16

Попробуйте цикл организовать снизу вверх:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
        For li = lCountLines To lStartLine Step -1
            'получаем имя процедуры/функции, внутри которой строка кода
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'если имя процедуры совпадает с тем, которое нам нужно
            If sProcName = "Worksheet_BeforeDoubleClick" Or sProcName = "Worksheet_Change" Then
                'узнаем кол-во строк процедуры/функции
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'удаляем процедуру/функцию
                .CodeModule.DeleteLines li, lProcLineCount
                Exit For
            End If
        Next li



1



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

08.02.2013, 10:28

 [ТС]

17

The_Prist, Все равно не удаляет

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub red_r()
Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Ëèñò1")
        'ïîëó÷àåì êîë-âî ñòðîê êîäà â ìîäóëå
        lCountLines = .CodeModule.CountOfLines
        'ïîëó÷àåì ïåðâóþ ñòðîêó ñ êîäîì, èñêëþ÷àÿ ñòðîêè äåêëàðèðîâàíèÿ ôóíêöèè è îïöèé ìîäóëÿ
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'öèêë ïî âñåì ñòðîêàì êîäà âíóòðè ìîäóëÿ
         For li = lCountLines To lStartLine Step -1
            'ïîëó÷àåì èìÿ ïðîöåäóðû/ôóíêöèè, âíóòðè êîòîðîé ñòðîêà êîäà
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'åñëè èìÿ ïðîöåäóðû ñîâïàäàåò ñ òåì, êîòîðîå íàì íóæíî
            If sProcName = "Worksheet_BeforeDoubleClick" Or sProcName = "Worksheet_Change" Then
                'óçíàåì êîë-âî ñòðîê ïðîöåäóðû/ôóíêöèè
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'óäàëÿåì ïðîöåäóðó/ôóíêöèþ
                .CodeModule.DeleteLines li, lProcLineCount
                Exit For
            End If
        Next li
    End With
End Sub



0



1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

08.02.2013, 10:49

18

Ну да. И Exit For уберите из цикла.



1



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

08.02.2013, 11:23

 [ТС]

19

The_Prist, Теперь он удаляет весь код кроме

Visual Basic
1
sProcName = "Worksheet_BeforeDoubleClick" Or sProcName = "Worksheet_Change"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub red_r()
Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Ëèñò1")
        
        lCountLines = .CodeModule.CountOfLines
       
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        
         For li = lCountLines To lStartLine Step -1
           
            sProcName = .CodeModule.ProcOfLine(li, 0)
          
            If sProcName = "Worksheet_BeforeDoubleClick" Or sProcName = "Worksheet_Change" Then
              
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
               
                .CodeModule.DeleteLines li, lProcLineCount
                
            End If
        Next li
    End With
End Sub



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

08.02.2013, 11:54

20

в принципе-то да…знаете что. Лучше это в виде функции оформите с передачей в качестве параметра имени функции(и имени компонента для универсальности). И все.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Function Del_Proc(sCompName As String, sProcForDelName As String)
    Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents(sCompName)
        'получаем кол-во строк кода в модуле
        lCountLines = .CodeModule.CountOfLines
        'получаем первую строку с кодом, исключая строки декларирования функции и опций модуля
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'цикл по всем строкам кода внутри модуля
        For li = lStartLine To lCountLines
            'получаем имя процедуры/функции, внутри которой строка кода
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'если имя процедуры совпадает с тем, которое нам нужно
            If sProcName = sProcForDelName Then
                'узнаем кол-во строк процедуры/функции
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'удаляем процедуру/функцию
                .CodeModule.DeleteLines li, lProcLineCount
                Exit For
            End If
            li = li + lProcLineCount
        Next li
    End With
End Function

и вызывайте её два раза:

Visual Basic
1
2
    Call Del_Proc("Лист1", "Worksheet_BeforeDoubleClick")
    Call Del_Proc("Лист1", "Worksheet_Change")

ну или сколько Вам там еще процедур надо удалить.



1



Like this post? Please share to your friends:
  • Удалить microsoft office word 2007
  • Удаления одинаковы строк excel
  • Удалить alt enter в ячейке excel
  • Удаление ячейки таблицы excel
  • Удалит лишние пробелы в excel