Excel - Break function...
Как известно, если при выполнении какого-либо макроса, нажать ctrl+break, то макрос остановится, как программно убрать эту функцию? Дело в том, что есть в книге ввод пароля, но если нажать ctrl+break, то надобность этой функции пропадает...
Прямых решений, боюсь, нет.
Я бы сделал следующим образм: при запуске макроса вызывал бы внешний резидент, который "глушил" бы Ctrl + Break, а по окончании работы "критичной" части отрубал бы эьтого резидента. Хотя, с другой стороны, резидента легко вырубить через диспетчер задач. Тоеть, нужно его как-то запускать так, чтобы он или в диспетчер не попадал. или с такм приоритетом, чтобы его срубить нельзя было. Но тогда возможны проблемы со стороны установленных на машине антивирусов...
Но, думаю, придумать что-нибудь можно... Я подумаю ещё.
О, кажись вспомнил, шутка была в том, чтобы просто занять эту комбинацию своей процедурой (ну или пустотой соотв.) через метод Application.OnKey()
А как дальше задать именно CtrlBreak? Application.OnKey(???)
А как дальше задать именно CtrlBreak? Application.OnKey(???)
Ща у себя потестирую и напишу...
Вообщем комбинацию я забиваю, но она отрабатывает мою пустышку-функцию только если если Excel не занимается вычислениями, а если нажать Ctrl-Break во время работы кода, то все равно вначале вываливается в дебагер - видно у него приоритет выше.
Application.EnableCancelKey = xlDisabled; xlErrorHandler; xlInterrupt
xlDisabled - отключает дебагер и на Ctrl-Break программа не реагирует
xlErrorHandler - очень прикольное свойство; на нажатие Ctrl-Break генерит в коде ошибку №18 и и если у тебя стоит On Error Goto ErrHandle, то соответственно код вываливается на метку ErrHandle. Т.о. можно узнать что пользователь хотел прервать программу, поругать его хорошенько и прекратить работать (или вернуться куда-нибудь).
xlInterrupt - ну это то что по умолчанию, т.е. диалоговое окно с предожением подебажить код и т.д.
Маленький нюанс: менять это свойство необходимо прям в коде функции, потому что по моим наблюдениям, изменение Application.EnableCancelKey в одной процедуре никак не влияет на другую процедуру. Судя по всему, по окончании функции Excel просто сбрасывает это свойство на умолч.
А почему ты не хочешь поставить пароль на проект, тогда Ctrl-Break конечно можно активизировать, но вот к коду уже не подлезешь, максимум что, это только вообще остановить выполнение макроса или продложить его дальше, все.... чем тебе такой вариант не устраивает
На книге тоже стоит пароль, но мне нужно, чтобы пользователь ввел свое имя и пароль. То есть я сделал распределение прав (администраторы и пользователи). Самое гнусное в этом деле, что если книгу открыть в обычном блокноте, то там открыт весь код VBA-проекта, даже если в свойствах книги поставить лпцию шифрования... Вот такой вот Excel "Мощный продукт"...
На книге тоже стоит пароль, но мне нужно, чтобы пользователь ввел свое имя и пароль. То есть я сделал распределение прав (администраторы и пользователи). Самое гнусное в этом деле, что если книгу открыть в обычном блокноте, то там открыт весь код VBA-проекта, даже если в свойствах книги поставить лпцию шифрования... Вот такой вот Excel "Мощный продукт"...
Тогда вариатн такой. Тут где-то описывался алгоритм шифрования файлов (если надо, вышлю примерчик). Вобщем, пишешь внешенее приложение, которое и будет открывать твой экселевский документ. При открытии он буде его расшифровывать, при закрытии - шифровать. А так уж внутри пишешь свой макрос.
Только расшифрованную копию экниги надо или в ОЗУ только хранить, или так ныкать, чтобы никто не нашёл.
Тогда вариатн такой. Тут где-то описывался алгоритм шифрования файлов (если надо, вышлю примерчик). Вобщем, пишешь внешенее приложение, которое и будет открывать твой экселевский документ. При открытии он буде его расшифровывать, при закрытии - шифровать. А так уж внутри пишешь свой макрос.
Только расшифрованную копию экниги надо или в ОЗУ только хранить, или так ныкать, чтобы никто не нашёл.
Библиотека шифрования:
Option Explicit
Public Function IsPrime(ByVal P As Long) As Boolean
'МАХ функция определения простоты числа
Dim Max As Long, F As Long
IsPrime = False 'МАХ пока число считаем сложным
If P < 2 Then Exit Function
'МАХ по методу Эрастосфена определяем простоту числа
If ((P And 1) = 0) Then
IsPrime = (P = 2)
Exit Function
End If
If ((P Mod 3) = 0) Then
IsPrime = (P = 3)
Exit Function
End If
Max = CLng(Int(Sqr(P)))
For F = 5 To Max Step 6
If (((P Mod F) = 0) Or ((P Mod (F + 2)) = 0)) Then Exit Function
Next
IsPrime = True 'МАх считаем число простым
End Function
Public Function SNBEM(Text)
'МАХ шифровка односторонним ключём
Dim I As Long, J As Long, K As Long, L As Long, P As Long, R As String, T As String
T = Text
For P = 1 To 2
R = ""
L = Len(Text)
For I = 1 To L
J = (L * I + 723) Mod (L + I)
For K = I To Len(Text)
J = ((J * Asc(Mid(Text, K, 1))) Mod 256)
Do While Not IsPrime(J)
J = J + 1
Loop
Next
J = J Mod 256
R = Chr(J) & R
Next
Text = R
Next
Text = T
SNBEM = R
End Function
Public Function OnceTimeNotepad(ByVal Text As String) As String
'МАХ Метод одноразового блокнота
Dim Res As String, I As Long
Dim AsN As Long
Dim Password As String
Password = SNBEM("/.,mnbvcxz’;lkjhgfdsa][poiuytrewq=-0987654321!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:”ZXCVBNM<>?")
Do While Len(Password) < Len(Text)
Password = Password & Password ' создаём цикличный ключ
Loop
For I = 1 To Len(Text)
AsN = (CLng(Asc(Mid$(Text, I, 1))) + CLng(Asc(Mid$(Password, I, 1))))
Res = Res & Chr(AsN Mod 256)
Next
OnceTimeNotepad = Res
End Function
Public Function ReOnceTimeNotepad(ByVal Text As String) As String
'МАХ Метод одноразового блокнота (расшифровка)
Dim Res As String, I As Long
Dim AsN As Long
Dim Password As String
Password = SNBEM("/.,mnbvcxz’;lkjhgfdsa][poiuytrewq=-0987654321!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:”ZXCVBNM<>?")
Do While Len(Password) < Len(Text)
Password = Password & Password ' создаём цикличный ключ
Loop
For I = 1 To Len(Text)
AsN = (CLng(Asc(Mid$(Text, I, 1))) - CLng(Asc(Mid$(Password, I, 1))))
Res = Res & Chr((AsN + 256) Mod 256)
Next
ReOnceTimeNotepad = Res
End Function
На книге тоже стоит пароль, но мне нужно, чтобы пользователь ввел свое имя и пароль. То есть я сделал распределение прав (администраторы и пользователи). Самое гнусное в этом деле, что если книгу открыть в обычном блокноте, то там открыт весь код VBA-проекта, даже если в свойствах книги поставить лпцию шифрования... Вот такой вот Excel "Мощный продукт"...
А по поводу "мощьного продукта" посмотри:
http://forum.codenet.ru/showthread.php?threadid=15740
Там хорошо показана вся безопастность "офиса" :D :D:D