我有一个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
这将为您做到这一点,并处理所有错误,而无需使用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
我相信您目前的问题根源在于下一步恢复时出错。这会导致在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(v=vs.60). aspx
如果您希望弹出可用工作表列表,以便选择一个,只需创建一个快速用户表单,插入一个列表框(组合框也可以,我更喜欢直观的列表框),并将其填充到用户表单上
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
然后创建一个按钮或任何东西来显示表单。
我试图将活动工作表和2个指定工作表复制到一个新工作簿,然后让宏继续在新工作簿上运行,以便在保存它之前更改一些内容 null
我使用这段代码将工作簿中的每一张工作表复制到一个新的工作簿中,它工作得很好,但它颠倒了工作表的顺序,是否有任何办法阻止它这样做? 我正在复制所有的工作表,这样我就可以将它保存为不同的文件扩展名,这是我发现唯一有效的方法。
作为预先警告,我是使用VBA的新手。 我已经拼凑了以下代码来执行以下操作:1。找到工作表“intrastat”2。复制此工作表3的使用范围。作为值粘贴到新工作簿4中。重新格式化B5栏中的日期。将工作簿保存在原始工作簿的位置。 然而,只有当我将宏保存在原始工作簿中时,这才起作用。我需要的是能够有宏保存在一个不同的工作簿和运行宏,我需要能够选择“原始”工作簿从一个文件位置在我的硬盘。 有什么想法吗?
这里是VBA新手。 谢谢你的教育!
然后另一个问题是工作簿的名称都不同,所有300个。是否有一个宏可以复制我打开的工作簿,而不是每次都输入实际的名称?
试图从当前工作簿“Create Report.xlsm”中复制工作表名称“Headings Explantions”,该工作簿打开到我要求打开的工作簿中,我得到了下标超出范围的错误