Страницы: 1
RSS
Программно убрать свой пароль с кода VBA
 
Добрый день!  
Я защищаю свой код паролем. Далее, при определенных условиях, мне необходимо программно снять этот пароль для удаления всего кода. Подскажите, как это сделать?
 
Ситуация похожа на защиту книги и листа.. Ни у кого нет идей, как это сделать?  
Попробую объяснить зачем это нужно.. Файл Excel, после введения данных формируется файл отчета с помощью SaveAs с определенным именем, нужно, чтобы в файле отчета не было кода макросов.. Как удалить модуль VBA из книги я уже знаю, но если он защищен моим же паролем, то при закрытии отчета код остается..  
Сейчас приходится вручную сохранять файл отчета, а хотелось бы программно..  
Заранее спасибо.
 
Вот нашел на одном сайте:  
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)  
   '  
   ' Bill Manville, 29-Jan-2000  
   '  
   'Dim VBP As VBProject  
   'Dim oWin As VBIDE.Window  
   Dim wbActive As Workbook  
   Dim i As Integer  
       
   Set VBP = WB.VBProject  
   Set wbActive = ActiveWorkbook  
       
   If VBP.Protection <> vbext_pp_locked Then Exit Sub  
       
   Application.ScreenUpdating = False  
       
   ' Close any code windows To ensure we hit the right project  
   For Each oWin In VBP.VBE.Windows  
       If InStr(oWin.Caption, "(") > 0 Then oWin.Close  
   Next oWin  
       
   WB.Activate  
   ' now use lovely SendKeys To  unprotect  
   Application.OnKey "%{F11}"  
   SendKeys "%{F11}%TE" & Password & "~~%{F11}", True  
       
   If VBP.Protection = vbext_pp_locked Then  
       ' failed - maybe wrong password  
       SendKeys "%{F11}%TE", True  
   End If  
       
   ' leave no evidence of the password  
   Password = ""  
   ' go back To the previously active workbook  
   wbActive.Activate  
       
End Sub  
Sub test5()  
   UnprotectVBProject Workbooks("ABook.xls"), "Password"  
End Sub  
 
У меня как-то странно работает.. Подскажите, в чем проблемма?
 
может быть уже и поздно советовать такое :))  
 
но попробую - не используйте saveas, создайте новую книгу и туда перенесите нужные данные..
 
)) Да, к сожалению, поздно.. Сначало так и делал, но потом отказался от этого... Мне очень важно чтобы, сохранялось форматирование в отчете, то есть высота строк, ширина столбцов, объединенные ячейки и т.д. А при создании новой книги часть этого пропадает..
 
так что? у вас макросы в коде самого листа? или все же в модуле?  
 
если последнее, то кто мешает перенести в новую книгу весь  лист целиком, с форматированием и т.п. ?  
 
Sheets().Move Before:=Workbooks("Êíèãà1").Sheets(1)
 
Спасибо! Надо попробовать, если получится, то не придется мучиться.. А при таком переносе, лист в исходном файле сохраняется (это важно, нужно чтобы остался)...
 
Не остается. Остается так:  
Sheets().Copy Before:=Workbooks("Êíèãà1").Sheets(1)
 
{quote}{login=Дмитрий}{date=21.05.2008 03:19}{thema=}{post}  
 
У меня как-то странно работает.. Подскажите, в чем проблемма?{/post}{/quote}Странно это как? Защиту снимает?
 
В том то и дело, что нет... но, при нажатии на кнопку, открывается окно VBAProject Project Properties... Причем, в поле Project Name появляется мой пароль.. После этого сам редактор подвисает.. И еще, этот код хоть как-то выполняется при условии, что имя файла "ABook.xls", при других пишет ошибку...  
И постоянно ругается на Dim VBP As VBProject - пишет что это неизвестный пользовательский тип данных.. И не только в этом случае..  
PS. Использую Excel 2003.
 
Dim VBP As VBProject - разобрался, не подключена библиотека Microsoft Visual Basic for Application Extensibility 5.3 (у меня)  
Надо так Dim VBP As Object
 
Только хотел написать, что не хватает подключенной библиотеки.  
Имхо, лучше подключить. И попробовать еще раз  
ABook.xls - это пример. Надо название своей книги подставлять в вызывающий макрос Sub test5()
 
Пробовал подставлять имя своего файла - не работает..  
НО, решение есть, лежит тут:  
 
А вот сам код, на всякий случай:  
Sub test()  
   Dim objExcel As Excel.Workbook  
   Dim objVBProject As Object  
   Dim objVBComponent As Object  
   Dim objWindow As Object  
     
   Set objExcel = GetObject("C:\Test.xls")  
   Set objVBProject = objExcel.VBProject  
   For Each objWindow In objVBProject.VBE.Windows  
       If objWindow.Type = vbext_wt_ProjectWindow Then ' vbext_wt_ProjectWindow =6  
           objWindow.Visible = True  
           objWindow.SetFocus  
       End If  
   Next  
   Set objVBProject.VBE.ActiveVBProject = objVBProject  
   SendKeys "~123~", True 'где 123 - пароль  
     
   DoEvents  
   For Each objVBComponent In objVBProject.VBComponents  
       Debug.Print objVBComponent.Name  
   Next  
   Set objVBProject = Nothing  
   'objExcel.Close  
   Set objExcel = Nothing  
End Sub  
 
У меня работает) Большое спасибо всем за обсуждение и помощь!!
 
Находится тут:  
http://www.sql.ru/forum/actualthread.aspx?bid=22&tid=346886&hl=#3232797
 
Второй код мне уже лень пробовать, даром, что он Вам подошел.  
Первый код отлично работает (только что проверил) с подключенной библиотекой и (!) закрытым редактором VBE. Пошагово не работает.
 
{quote}{login=Лузер™}{date=22.05.2008 09:42}{thema=}{post}Второй код мне уже лень пробовать, даром, что он Вам подошел.  
Первый код отлично работает (только что проверил) с подключенной библиотекой и (!) закрытым редактором VBE. Пошагово не работает.{/post}{/quote}Наврал. Только пошагово не работает или с брейком. Если в VBE открыты окна, код из закрывает, потом снимает пароль.  
Второй код делает то же самое - посылает пароль SendKeys'ом
 
{quote}{login=Лузер™}{date=21.05.2008 05:27}{thema=}{post}Не остается. Остается так:  
Sheets().Copy Before:=Workbooks("Êíèãà1").Sheets(1){/post}{/quote}  
Еще раз большое спасибо за этот вариант!!! Действительно стало легче жить)))
Страницы: 1
Наверх