我试图创建一个允许用户点击按钮的宏,并且Excel工作表将是1:移动到下一张/上一张或2:复制现有工作表然后移动到复制的工作表。
目前我处理错误处理情况并且不确定如何绕过它。我不确定我是否正确使用了On Error。如果一个页面不存在,我基本上需要它去我的下一个子。如果页面确实存在,只需要ActiveSheet.Index + 1,然后选择。
Sub Function1()
On Error GoTo fixer
Sheets(ActiveSheet.Index + 1).Select
fixer:
Call Copier2
End Sub
Sub Copier2()
ActiveWorkbook.ActiveSheet.Copy _
After:=ActiveWorkbook.ActiveSheet
End Sub
非常感谢任何帮助,我对这些东西都是一个新手,所以不要害怕为我愚蠢。
答案 0 :(得分:0)
让我们对此有一些乐趣,以说明机制。
首先让我们提取一个方法,其工作是激活给定的工作表。该方法将返回一个Boolean
值,指示它是否成功。因为我们想要返回值,所以这将是Function
过程:
Private Function ActivateSheet(ByVal index As Long) As Boolean
Dim result As Boolean
On Error GoTo CleanFail
ActiveWorkbook.Sheets(index).Select
result = True
CleanExit:
ActivateSheet = result
Exit Function
CleanFail:
Err.Clear
result = False
Resume CleanExit
End Function
“快乐路径”将result
分配给True
,然后将函数的返回值分配给result
,然后返回。
“错误路径”跳转到CleanFail
,这会清除错误(可能某些索引超出范围错误),将result
分配给False
并且然后Resume CleanExit
清除错误处理状态,恢复到CleanExit
,它将函数的返回值赋给result
,然后返回。
宏现在可以这样做了:
Public Sub NavigateRight()
If Not ActivateSheet(ActiveSheet.Index + 1) Then
'copy the current sheet if there's no next sheet:
ActiveSheet.Copy After:=ActiveSheet
End If
End Sub
我们也可以有这个:
Public Sub NavigateLeft()
If Not ActivateSheet(ActiveSheet.Index - 1) Then
'copy the current sheet if there's no previous sheet:
ActiveSheet.Copy Before:=ActiveSheet
End If
End Sub
不要仅仅为了制作程序而制作程序:将它们用于抽象概念:像Copier2
这样的程序实际上不需要存在,它只是包装一个调用Excel对象模型 - 最好将其内联到IMO。