Как защитить паролем и скрыть все листы, за исключением двух рабочих листов?

Вам нужно создать функцию без параметров, которые вы можете использовать в качестве команды:

b = Button(admin, text='as', command=lambda: button('hey'))

См. раздел «Передача аргументов в обратные вызовы» в этом документе .

1
задан Chris 14 July 2018 в 00:38
поделиться

2 ответа

Вы не используете подарки, которые дает вам Workbook_SheetActivate. Sh - объект рабочего листа, который активируется.

Ваше объявление переменной является henky; вы объявляете Dim MySheets As String, но никогда не используете его и не назначаете MySheet = «Sheet1» и MySheet2 = «Sheet2», не объявляя их.

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

Option Explicit

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim response As String

    If IsError(Application.Match(Sh.CodeName, Array("Sheet1", "Sheet2"), 0)) Then
        Sh.Visible = xlSheetHidden

        response = InputBox("Enter password to view sheet")
        If response = "MyPass" Then
            Application.EnableEvents = False
            Sh.Visible = xlSheetVisible
            Sh.Activate
            Application.EnableEvents = True
        End If
    End If

    Sheet1.Visible = True
    Sheet2.Visible = True

End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

    If IsError(Application.Match(Sh.CodeName, Array("Sheet1", "Sheet2"), 0)) Then
        Sh.Visible = xlSheetHidden
    End If

End Sub
0
ответ дан Jeeped 17 August 2018 в 12:04
поделиться
  • 1
    Вы забыли обязательный & quot; Option Explicit сохраняет мир & quot; напоминание, хотя вы использовали его в своем примере кода :-) – AJD 14 July 2018 в 07:52
  • 2
    @AJD - Вы правы, конечно. Здесь . – Jeeped 14 July 2018 в 11:47

Другим вариантом является привязка к Named range. Вы создаете именованный диапазон с областью листа, например, следующим образом: Менеджер имен Ctrl + F3

Затем вы создаете дополнительную функцию, которая позволяет проверить, существует ли такое имя и получить его значение. В зависимости от результата лист будет скрыт или нет.

Public Function bIsVisible(ByRef wksSheet As Worksheet) As Boolean
    Dim bResult     As Boolean

    bResult = False
    On Error Resume Next
    bResult = Evaluate(wksSheet.Names("Visible").Value)

    bIsVisible = bResult
End Function

И вот код для скрытия листов (вы можете легко добавить здесь код для защиты листа и т. Д.):

Public Sub HideUnvisible()
    Dim wksSheet        As Worksheet

    For Each wksSheet In Worksheets
        If Not bIsVisible(wksSheet) Then
            wksSheet.Visible = xlSheetHidden
        End If
    Next wksSheet
End Sub
0
ответ дан Konstantin 17 August 2018 в 12:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: