Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как удалить код Vb при сохранении файла

5.5K
28 июня 2004 года
Sergan
26 / / 11.06.2004
Нужно, чтобы при сохранении файла удалялся весь код VB или навсегда отключались макросы в этой книге.
258
28 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Sergan
Нужно, чтобы при сохранении файла удалялся весь код VB или навсегда отключались макросы в этой книге.



Это тебе нужно работать с библиотекой VBIDE.

Вот неплохая статейка с примерами

5.5K
28 июня 2004 года
Sergan
26 / / 11.06.2004
Цитата:
Originally posted by SergeySV


Это тебе нужно работать с библиотекой 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],
вылетает ошибка. Не пойму почему. Может я не всё сделал?

258
28 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Sergan

Статейку я посмотрел, много хорших примеров.
Только вот применить у меня их не получилось.
Как и было сказано, я подключил библиотеку.
Но возникают проблемы
[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"

5.5K
28 июня 2004 года
Sergan
26 / / 11.06.2004
Цитата:
Originally posted by SergeySV


А как у тебя модуль называется? может "Модуль1" или вообще другое название, вообщем Module1 это не какое-то кодовое называние, а так, в качестве примера, если бы ты имел в проекте модуль под называнием "Module1"


Он именно так и называется Module1

258
28 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Sergan

Он именно так и называется Module1



А положь сюда свой файл, посмотрю пока не ушел, а то что-то странное, уже и фантазия исякла

5.5K
29 июня 2004 года
Sergan
26 / / 11.06.2004
Цитата:
Originally posted by SergeySV

А положь сюда свой файл, посмотрю пока не ушел, а то что-то странное, уже и фантазия исякла


С одной ошибкой справился. Оказывается мало того, что нужно было подключить библиотеку, так ещё в самом Excele нужно было в безопасности макросов на закладке "Надежные источники" выставить галку "Доверять доступ к Visual Basic Project".
После этого код стал работать.

НО теперь возникает другая ошибка: при вставке или удалении процедуры из модуля, а также при удалении всего кода VBA из Workbook выдается такая ошибка Can't enter break mode at this time

:)) Это происходило на этапе пошагового выполнения кода, а в режиме нормальной работы, когда макросы запускаются непосредственно из Excelя, всё работает, чики-пики!!!
Так что всё просто супер!!! :)
Большое спасибо за статью!

Теперь мой пользователь сможет сохранять файл только под тем именем, которое я емй укажу, и в сохраненном файле не будет никаких макросов, а только тот отчет, который он сформировал с помощью рабочего файла с макросами.
Пока всё, что я хотел, добился. Если будут ещё какие проблемы, буду обращаться.

258
29 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Нэ прицепилось :)
5.5K
29 июня 2004 года
Sergan
26 / / 11.06.2004
А как же быть с выставлением галки в безопасности макросов. Пользователю придется по моей просьбе ручками её выставлять что ли? Иначе никак сделать это нельзя?
258
29 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Can't enter break mode at this time -

ну с этим все понятно, конечно такие действия при открытом 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 и уже другая функция возвращает уровень безоп. и галку на место.
5.5K
30 июня 2004 года
Sergan
26 / / 11.06.2004
Цитата:
Originally posted by SergeySV

Вот наш топик на форуме по этой теме: 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 и нашел один сайтик, где показано, как можно просто обойти сообщение об отключении (включении) макросов. Когда он мне попался, я не обратил особого внимания и не запомнил, а когда самому понадобилось, то уже не смог найти. Сайт был связан с приколами над пользователем. Вообщем не нашел я его. Если вдруг что-то такое найдешь, сообщи плиз.

258
30 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Sergan

Ссылочка какая то странная, никуда не ведет.

Я тут полазил по форуму и встретил тему, где ты с mhaturov-ым как раз обсуждали тему по изменению настроек безопасности Excel-я. Вы пришли к выводу, что включить макросы можно только через правку реестра. А я как то искал материал по написанию макросов на VBA или просто про VBA и нашел один сайтик, где показано, как можно просто обойти сообщение об отключении (включении) макросов. Когда он мне попался, я не обратил особого внимания и не запомнил, а когда самому понадобилось, то уже не смог найти. Сайт был связан с приколами над пользователем. Вообщем не нашел я его. Если вдруг что-то такое найдешь, сообщи плиз.



Я в той теме давал ссылку на этот сайт, там предлагалось снабдить макрос поддельн. сертификатом от микрософт, который Excel воспринимает без вопросов, но там помойму тоже были какие-то заморочки

5.5K
30 июня 2004 года
Sergan
26 / / 11.06.2004
Возникла проблема.
Сдела я файлик в ОфисеХР, а у пользователей Офис97.
1)Элемент "Календарь" (который есть в ОфисеХР) не отображает числа в Офисе97.
2)Выдается ошибка "не найдена библиотека".
3)Где в 97 находится настройка безопасности макросов, чтобы выставить нужную галку?

Я так думаю, что нужно переделывать в 97-ом.

Что посоветуешь?
258
30 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Sergan
Возникла проблема.
Сдела я файлик в ОфисеХР, а у пользователей Офис97.
1)Элемент "Календарь" (который есть в ОфисеХР) не отображает числа в Офисе97.
2)Выдается ошибка "не найдена библиотека".
3)Где в 97 находится настройка безопасности макросов, чтобы выставить нужную галку?

Я так думаю, что нужно переделывать в 97-ом.

Что посоветуешь?



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

Насчет календаря: можно сделать свой или использовать готовый в виде ocx, но придется тогда еще таскать его с собой, регстрить у пользов. на машине

5.5K
30 июня 2004 года
Sergan
26 / / 11.06.2004
Цитата:
Originally posted by SergeySV


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

Насчет календаря: можно сделать свой или использовать готовый в виде ocx, но придется тогда еще таскать его с собой, регстрить у пользов. на машине


Вообщем календарик я переделал на 97-ом и всё стало нормально. Но возникли другие трудности:
97-ой не хочет обрабатывать событие BeforeClose, в котором я присваиваю параметру SaveChanges значение False.
А второе, это то, что сохранение с удалением всего кода на VBA происходит не совсем гладко.
Смотри

Код:
Sub DeleteVB()
  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-я), а кода формы не будет.
258
30 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Проблема я так понимаю в том, что после сохранения файла, когда мы говорим уже Cancel=False, мы этим удалением кода VB переводим файл в состояние - измененный.

Т.е. если провести простую аналогию с действием обычного пользователя, происходит все так, как если бы мы сначала сохранили файл под новым названием, потом поменяли бы что-нибудь в ячейках и закрываем Excel. Естественно что при этом Excel спрашивает нас о том, хотим ли сохранить файл!

Проблема вроде ясна, теперь как решать. По идее конечно надо после удаления кода как-то сохранить наши изменения.

Можно конечно просто убедить Excel что файл не был изменен - activeworkbook.Saved = True,
когда мы изменяем содержимое файла, Ecxel автоматом меняет это свойство в False, принудительно установив его в True.
Но это вряд ли нам поможет, потому что Excel конечно спрашивать ничего не будет при закрытии файла, но и сохранить в файле процесс удаления кода тоже тогда не возьмется и файл по идее должен остаться с кодом.

По идее тогда остается после сохранения файла и удаления кода еще раз иницииовать процесс уже сохранения (а не сохранить как), правда я пока плохо себя представляю, что за код активизируется на событие _BeforeSave, если мы предварительно удалили весь код...... надо смотреть, пробовать
5.5K
01 июля 2004 года
Sergan
26 / / 11.06.2004
Я остановился на том, что если пользователь не подтверждает второе сохранение, то форма остается, а код нет,
а если подтверждает, то и форма, и код удаляются.
Пойдет! 8)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог