宏转到工作表

时间:2015-02-11 12:30:43

标签: excel excel-vba vba

我有一个包含大量工作表标签的Excel工作簿,为了方便用户导航,我添加了一个宏来调出输入框,以便他们可以输入工作表想要去。

它可以工作,但问题是,如果他们输入的工作表名称不正确,它什么都不做,输入框就会消失,用户就会留在他们已经在的同一张纸上。我希望它能做的是,如果用户键入一个不存在的工作表名称,则会打开一个包含所有选项卡列表的框,并允许他们从列表中进行选择。除此之外,至少有一个消息框告知他们他们输入了一个不存在的工作表名称并再次尝试,然后返回输入框而不是消失。这是我到目前为止一直在使用的代码 -

如果这不可行,我宁愿让它首先显示可用工作表的列表,并完全忘记输入框。我的想法是,输入所需的工作表而不是每次都要对列表进行排序会很好,但它最好不要发生任何事情。

Sub GotoSheet()
Dim sSheet As String

sSheet = InputBox( _
  Prompt:="Sheet name or number?", _
  Title:="Input Sheet")
On Error Resume Next
If Val(sSheet) > 0 Then
    Worksheets(Val(sSheet)).Activate
Else
    Worksheets(sSheet).Activate
End If 
End Sub

3 个答案:

答案 0 :(得分:0)

这将为您完成并处理所有错误,而无需使用On Error语句。

Function Validate(SheetName As String) As Boolean
For i = 1 To ThisWorkbook.Worksheets.Count
If SheetName = ThisWorkbook.Worksheets(i).Name Then
Validate = True
Exit Function
Else
Validate = False
End If
Next
End Function

Sub GotoSheet()
Dim sSheet As String

sSheet = InputBox( _
  Prompt:="Sheet name or number?", _
  Title:="Input Sheet")
Do While Validate(sSheet) = False
'This if statement is true when the user click cancel or x button
If sSheet = "" Then
Exit Do
End If
MsgBox (sSheet & " does not exist. Please enter a valid sheet name.")
sSheet = InputBox( _
  Prompt:="Sheet name or number?", _
  Title:="Input Sheet")
Loop
If sSheet <> "" Then
    Worksheets(sSheet).Activate
End If
End Sub

答案 1 :(得分:0)

我认为目前问题的根源是On Error Resume Next。这会导致sub在您的else语句遇到错误时退出,例如工作表不存在。相反,您需要通过使用On Error GoTo之类的东西来处理该错误。如:

Sub GotoSheet()
Dim sSheet As String

sSheet = InputBox( _
  Prompt:="Sheet name or number?", _
  Title:="Input Sheet")
On Error GoTo noSheet
If Val(sSheet) > 0 Then
    Worksheets(Val(sSheet)).Activate
    Exit Sub
Else
    Worksheets(sSheet).Activate
    Exit Sub
End If 

noSheet:
'Enter your code to display a warning that the sheet does not exist
'and/or bring up a selection box of all sheets

End Sub

以下是有关On Error声明的更多信息,可能有用:https://msdn.microsoft.com/en-us/library/aa266173%28v=vs.60%29.aspx

答案 2 :(得分:0)

如果你想要弹出一个可用工作表列表,那么你可以选择一个只做一个快速的UserForm,插入一个ListBox(一个ComboBox也可以工作,我更喜欢一个ListBox),并让它填充在userform_initialize上:

Private Sub UserForm_Initialize()
Dim WS As Worksheet
    For Each WS In Worksheets
        ListBox1.AddItem WS.Name
    Next WS
End Sub

确保单选的MultiSelect属性设置为0,然后创建一个转到所选工作表的确定按钮:

Private Sub CommandButton1_Click()
    Sheets(ListBox1.Value).Activate
    Unload Me
End Sub

然后创建一个按钮或任何显示表单的内容。