On Error GoTo отображается, когда нет ошибок (для выбора случая) - PullRequest
0 голосов
/ 09 мая 2018

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

У меня есть форма (Access), который появляется каждый раз, когда кто-то открывает Excel, и он должен ввести свою фамилию, тогда лист с его именем и другой лист с именем «Stats» будут видны им.Все остальное скрыто.Теперь, если кто-то введет «NOI», это «главный пароль», если хотите, и почти все отобразится.

Если они неправильно вводят свои заглавные буквы или что-то неправильно пишут, СЛЕДУЕТ вывести сообщение об ошибке.Тем не менее, форма выводит сообщение об ошибке, даже если входные данные не являются ошибками.Будут отображаться правильные листы, но появится окно с сообщением об ошибке независимо от того, что вы ввели.Я знаю, что должен быть лучший способ, чем Error GoTo, но я не настолько опытен в использовании Try ...

Вот код:

Private Sub CommandButton1_Click()
    Dim pword As String
    On Error GoTo endit
          pword = TextBox1
          Select Case pword
          Case Is = "NOI": Call UnHideAllSheets
          Case Is <> "NOI": Sheets(TextBox1.Value).Visible = True
    End Select
    Sheets("ERROR").Visible = False
    Sheets("Stats").Visible = True
    Sheets(TextBox1.Value).Activate
    Me.Hide
    Exit Sub
    endit: MsgBox "Incorrect Input: check spelling and capitalization"
End Sub

Я сделалНе устанавливайте абсолютные пароли с индивидуальным «Case Is =», потому что он предназначен для людей, которые абсолютно не знают, как вносить какие-либо обновления или изменения в VBA.Все люди, которые будут использовать и обновлять это, не знают, что вкладка разработчика в Excel существует.

Вот код, к которому относится Case, когда он говорит Call UnHideAllSheets:

Sub UnHideAllSheets()
    Application.ScreenUpdating = False

    Dim n As Single
    For n = 1 To Sheets.Count
        Sheets(n).Visible = True
    Next n

    Application.ScreenUpdating = True

    Sheets("CleanData").Visible = False
    Sheets("Template").Visible = True
    Sheets("ERROR").Visible = False
    Sheets("2018").Activate
End Sub

Все это код, который я изменил из других мест.Как я уже сказал, он отлично работал 24 часа назад.Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 09 мая 2018
  1. Вам не нужен оператор Select, для этого достаточно простого If … Else.
  2. Всегда отключайте ваш обработчик ошибок после строки, где вы ожидаете ошибку. В противном случае любая ошибка, которая возникнет позже, также вызовет этот обработчик ошибок, и вы можете получить ошибочное сообщение об ошибке.

Итак, мы придумываем что-то вроде этого.

Private Sub CommandButton1_Click()
    Dim pword As String
    pword = TextBox1.Value

    If pword = "NOI" Then
        UnHideAllSheets
    Else
        On Error GoTo endit
        Sheets(TextBox1.Value).Visible = True
        On Error GoTo 0 'always deactivate error handler after the expected error
    End If

    Sheets("ERROR").Visible = False
    Sheets("Stats").Visible = True
    Sheets(TextBox1.Value).Activate
    Me.Hide

    Exit Sub
endit: 
    MsgBox "Incorrect Input: check spelling and capitalization"
End Sub
...