Как удалить код Vb при сохранении файла
Нужно, чтобы при сохранении файла удалялся весь код VB или навсегда отключались макросы в этой книге.
Это тебе нужно работать с библиотекой VBIDE.
Вот неплохая статейка с примерами
Это тебе нужно работать с библиотекой VBIDE.
Вот неплохая статейка с примерами
Статейку я посмотрел, много хорших примеров.
Только вот применить у меня их не получилось.
Как и было сказано, я подключил библиотеку.
Но возникают проблемы
[color=blue]
Sub DeleteModule()
Dim VBComp As VBComponent
Set VBComp = ThisWorkbook.VBProject.VBComponents("Module1")
ThisWorkbook.VBProject.VBComponents.Remove VBComp
End Sub
[/color]
Как только происходит выполнении строки[color=blue]
Set VBComp = ThisWorkbook.VBProject.VBComponents("Module1")[/color],
вылетает ошибка. Не пойму почему. Может я не всё сделал?
Статейку я посмотрел, много хорших примеров.
Только вот применить у меня их не получилось.
Как и было сказано, я подключил библиотеку.
Но возникают проблемы
[color=blue]
Sub DeleteModule()
Dim VBComp As VBComponent
Set VBComp = ThisWorkbook.VBProject.VBComponents("Module1")
ThisWorkbook.VBProject.VBComponents.Remove VBComp
End Sub
[/color]
Как только происходит выполнении строки[color=blue]
Set VBComp = ThisWorkbook.VBProject.VBComponents("Module1")[/color],
вылетает ошибка. Не пойму почему. Может я не всё сделал?
А как у тебя модуль называется? может "Модуль1" или вообще другое название, вообщем Module1 это не какое-то кодовое называние, а так, в качестве примера, если бы ты имел в проекте модуль под называнием "Module1"
А как у тебя модуль называется? может "Модуль1" или вообще другое название, вообщем Module1 это не какое-то кодовое называние, а так, в качестве примера, если бы ты имел в проекте модуль под называнием "Module1"
Он именно так и называется Module1
Он именно так и называется Module1
А положь сюда свой файл, посмотрю пока не ушел, а то что-то странное, уже и фантазия исякла
А положь сюда свой файл, посмотрю пока не ушел, а то что-то странное, уже и фантазия исякла
С одной ошибкой справился. Оказывается мало того, что нужно было подключить библиотеку, так ещё в самом Excele нужно было в безопасности макросов на закладке "Надежные источники" выставить галку "Доверять доступ к Visual Basic Project".
После этого код стал работать.
НО теперь возникает другая ошибка: при вставке или удалении процедуры из модуля, а также при удалении всего кода VBA из Workbook выдается такая ошибка Can't enter break mode at this time
:)) Это происходило на этапе пошагового выполнения кода, а в режиме нормальной работы, когда макросы запускаются непосредственно из Excelя, всё работает, чики-пики!!!
Так что всё просто супер!!! :)
Большое спасибо за статью!
Теперь мой пользователь сможет сохранять файл только под тем именем, которое я емй укажу, и в сохраненном файле не будет никаких макросов, а только тот отчет, который он сформировал с помощью рабочего файла с макросами.
Пока всё, что я хотел, добился. Если будут ещё какие проблемы, буду обращаться.
ну с этим все понятно, конечно такие действия при открытом VB-редакторе в пошаговом режиме сделать нельзя, не все можно отлаживать в пошаговом режиме :)
На счет галки. Тут конечно можно и пользователя спрашивать. Надо понимать, что микрософот прилагает все усилия чтобы нельзя было изнутри, средствами самого макроса менять уровни безопасности и т.д. Так что если какие пути находятся (как например раньше SendKeys), то в последующих версиях микрософт старается эти дырки сразу закрыть.
Вот наш топик на форуме по этой теме: http://ad3.bannerbank.ru/bb.cgi?cmd=ad&hreftarget=_blank&pubid=27583511&pg=1&vbn=587&w=468&h=60&num=1&r=ssi&ssi=nofillers&r=ssi&nocache=383519&ref=http%3A//forum.codenet.ru/forumdisplay.php%3Fs%3D%26forumid%3D49%26daysprune%3D30%26sortorder%3D%26sortfield%3Dlastpost%26perpage%3D25%26pagenumber%3D2&loc=http%3A//forum.codenet.ru/showthread.php%3Fs%3D%26threadid%3D15740
В довершении могу сказать, я сейчас заканчиваю писать на VB6 инсталяшку для макросов под Excel, и у меня уже готовая функция, которая при закрытом Excel'е меняет уровень безопасности (а также ставит галку - Предоставить доступ к проекту) в реестре, потом запускается Excel, там уже проделываются все свои дела, закрывается Excel и уже другая функция возвращает уровень безоп. и галку на место.
Вот наш топик на форуме по этой теме: http://ad3.bannerbank.ru/bb.cgi?cmd=ad&hreftarget=_blank&pubid=27583511&pg=1&vbn=587&w=468&h=60&num=1&r=ssi&ssi=nofillers&r=ssi&nocache=383519&ref=http%3A//forum.codenet.ru/forumdisplay.php%3Fs%3D%26forumid%3D49%26daysprune%3D30%26sortorder%3D%26sortfield%3Dlastpost%26perpage%3D25%26pagenumber%3D2&loc=http%3A//forum.codenet.ru/showthread.php%3Fs%3D%26threadid%3D15740
В довершении могу сказать, я сейчас заканчиваю писать на VB6 инсталяшку для макросов под Excel, и у меня уже готовая функция, которая при закрытом Excel'е меняет уровень безопасности (а также ставит галку - Предоставить доступ к проекту) в реестре, потом запускается Excel, там уже проделываются все свои дела, закрывается Excel и уже другая функция возвращает уровень безоп. и галку на место.
Ссылочка какая то странная, никуда не ведет.
Я тут полазил по форуму и встретил тему, где ты с mhaturov-ым как раз обсуждали тему по изменению настроек безопасности Excel-я. Вы пришли к выводу, что включить макросы можно только через правку реестра. А я как то искал материал по написанию макросов на VBA или просто про VBA и нашел один сайтик, где показано, как можно просто обойти сообщение об отключении (включении) макросов. Когда он мне попался, я не обратил особого внимания и не запомнил, а когда самому понадобилось, то уже не смог найти. Сайт был связан с приколами над пользователем. Вообщем не нашел я его. Если вдруг что-то такое найдешь, сообщи плиз.
Ссылочка какая то странная, никуда не ведет.
Я тут полазил по форуму и встретил тему, где ты с mhaturov-ым как раз обсуждали тему по изменению настроек безопасности Excel-я. Вы пришли к выводу, что включить макросы можно только через правку реестра. А я как то искал материал по написанию макросов на VBA или просто про VBA и нашел один сайтик, где показано, как можно просто обойти сообщение об отключении (включении) макросов. Когда он мне попался, я не обратил особого внимания и не запомнил, а когда самому понадобилось, то уже не смог найти. Сайт был связан с приколами над пользователем. Вообщем не нашел я его. Если вдруг что-то такое найдешь, сообщи плиз.
Я в той теме давал ссылку на этот сайт, там предлагалось снабдить макрос поддельн. сертификатом от микрософт, который Excel воспринимает без вопросов, но там помойму тоже были какие-то заморочки
Сдела я файлик в ОфисеХР, а у пользователей Офис97.
1)Элемент "Календарь" (который есть в ОфисеХР) не отображает числа в Офисе97.
2)Выдается ошибка "не найдена библиотека".
3)Где в 97 находится настройка безопасности макросов, чтобы выставить нужную галку?
Я так думаю, что нужно переделывать в 97-ом.
Что посоветуешь?
Возникла проблема.
Сдела я файлик в ОфисеХР, а у пользователей Офис97.
1)Элемент "Календарь" (который есть в ОфисеХР) не отображает числа в Офисе97.
2)Выдается ошибка "не найдена библиотека".
3)Где в 97 находится настройка безопасности макросов, чтобы выставить нужную галку?
Я так думаю, что нужно переделывать в 97-ом.
Что посоветуешь?
Наскоко я помню в 97 еще не было спец. галки о программном доступе к VB проекту, там все регламентировалось общим уровнем безопасности.
Насчет календаря: можно сделать свой или использовать готовый в виде ocx, но придется тогда еще таскать его с собой, регстрить у пользов. на машине
Наскоко я помню в 97 еще не было спец. галки о программном доступе к VB проекту, там все регламентировалось общим уровнем безопасности.
Насчет календаря: можно сделать свой или использовать готовый в виде ocx, но придется тогда еще таскать его с собой, регстрить у пользов. на машине
Вообщем календарик я переделал на 97-ом и всё стало нормально. Но возникли другие трудности:
97-ой не хочет обрабатывать событие BeforeClose, в котором я присваиваю параметру SaveChanges значение False.
А второе, это то, что сохранение с удалением всего кода на VBA происходит не совсем гладко.
Смотри
Dim VBComp As VBComponent
Set VBComp = ActiveWorkbook.VBProject.VBComponents("UserForm1")
ActiveWorkbook.VBProject.VBComponents.Remove VBComp
Set VBComp = ActiveWorkbook.VBProject.VBComponents("ЭтаКнига")
VBComp.CodeModule.DeleteLines 1, VBComp.CodeModule.CountOfLines
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim name, fName As String
If lEvent = 0 Then
lEvent = 1
name = ActiveWorkbook.Path + "\Реестр_" + Range("name_reestr") + ".xls"
MsgBox "Файл будет сохранён под именем " + name + " .", , "Внимание!"
'сохраняем файл
ThisWorkbook.SaveAs name
ElseIf lEvent = 1 Then
lEvent = 0
bolEx = True
End If
If lEvent = 0 And bolEx Then
bolEx = False
Cancel = False
'удаляем из файла VB-код
DeleteVB
Else
Cancel = True
End If
End Sub
Происходит вот что: при первом проходе события BeforeSave я вызываю сохранение файла под своим именем, а при втором проходе я удаляю код VB.
Вроде всё замечательно, да не совсем. После моего сохранения, которое я вызываю в программе, я хочу закрыть файл, а Excel опять спрашивает: "Сохранить?". Если я говорю "да", то код VB и код формы удаляются, а если говорю "нет", то код книги удаляется, а форма с кодом остается.
Я так думаю, это происходи потому, что параметру Cancel после удаления кода VB не присвается значение True. Но это, наверное, уже никак не обойти.
Выход из этой ситуации я нашел только один: в процедуре удаления кода VB я удаляю код формы, как и код книги, таким образом форма может и сотаться (в зависимости от ответа пользователя на сообщение Excel-я), а кода формы не будет.
Т.е. если провести простую аналогию с действием обычного пользователя, происходит все так, как если бы мы сначала сохранили файл под новым названием, потом поменяли бы что-нибудь в ячейках и закрываем Excel. Естественно что при этом Excel спрашивает нас о том, хотим ли сохранить файл!
Проблема вроде ясна, теперь как решать. По идее конечно надо после удаления кода как-то сохранить наши изменения.
Можно конечно просто убедить Excel что файл не был изменен - activeworkbook.Saved = True,
когда мы изменяем содержимое файла, Ecxel автоматом меняет это свойство в False, принудительно установив его в True.
Но это вряд ли нам поможет, потому что Excel конечно спрашивать ничего не будет при закрытии файла, но и сохранить в файле процесс удаления кода тоже тогда не возьмется и файл по идее должен остаться с кодом.
По идее тогда остается после сохранения файла и удаления кода еще раз иницииовать процесс уже сохранения (а не сохранить как), правда я пока плохо себя представляю, что за код активизируется на событие _BeforeSave, если мы предварительно удалили весь код...... надо смотреть, пробовать
а если подтверждает, то и форма, и код удаляются.
Пойдет! 8)