2014-10-23 1 views
1

У меня есть сценарий VBA в нескольких шаблонах книг, которые разблокируют текущий (активный) рабочий лист. Я использую ту же горячую клавишу, чтобы пользователям, которым разрешено использовать макрос, не нужно помнить, какая горячая клавиша позволяет им разблокировать книгу.Используйте ту же горячую клавишу в нескольких книгах

Это обычно не вызывает головных болей, так как большинство пользователей не могут открывать одновременно несколько книг (и, по всей вероятности, не используют горячие клавиши). Проблема в том, что если у меня открыто более одной рабочей книги и попробуйте запустить скрипт VBA с помощью горячей клавиши, в настоящее время я получаю случайный экземпляр скрипта VBA. Это вызывает проблемы, поскольку пароль отличается между книгами, поэтому, если горячая клавиша запускает скрипт VBA в WB X, а я в WB Y, я получаю сообщение об ошибке.

Как можно понять, есть ли способ сделать это так, чтобы сценарий VBA из активной книги по этой горячей клавише использовался? Запрос

Per Alter здесь это облагороженная версия моего lock_unlock VBA скрипта

Sub Lock_Unlock() 
    Dim CurrentUser As String 'holds the current users Windows login 
    Dim Approved As String 
    Approved = "|user1|user2|user3|"

'Give CurrentUser it's value CurrentUser = Environ$("username") 'Check if the user is approved If InStr(1, Approved, CurrentUser) > 0 Then 'The user can use this macro. Check if the sheet is currently locked If ActiveSheet.ProtectContents = True Then 'It is, unlock ActiveSheet.Unprotect Password:=PW() Else 'It isn't, relock ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _ False, Password:=PW() End If 'Not a user approved to use this macro, don't do anything End If End Sub Function PW() As String PW = "password" End Function
+0

Я был бы очень заинтересован в коде, если вы хотите его включить. У меня есть аналогичная проблема, которую мне нужно решить, и это может сэкономить много времени, если я использую ваши в качестве основы. – Alter

ответ

1

Это, как я хотел бы сделать это, модуляризую пароль к getFunction.

ex.

Function getPassword() 
    getPassword = "password1" 
End Function 

Теперь, когда вы хотите, пароль вызова Application.Run(ActiveWorkbook.Name & "!getPassword") Это позволит убедиться, что пароль извлекается из активной книги, независимо от книги ваш макрос запускается с

Ex.

Sub test() 
    MsgBox Application.Run(ActiveWorkbook.Name & "!getPassword") 
End Sub 

Function getPassword() 
    getPassword = "hello" 
End Function 

Вариант 2: проверить, если ThisWorkbook является ActiveWorkbook, если это не то вызвать макрос из ActiveWorkbook, используя тот же метод, который я использовал, чтобы получить пароль.

+0

D'oh! Почему я не подумал об этом? На самом деле у меня уже есть пароль, возвращенный из функции, как вы предлагаете (упрощает ее обновление время от времени). Спасибо за помощь! – JMichael

 Смежные вопросы

  • Нет связанных вопросов^_^