Vba 如果工作表存在,则运行sub。如果不存在,则显示消息并退出sub

Vba 如果工作表存在,则运行sub。如果不存在,则显示消息并退出sub,vba,excel,boolean,Vba,Excel,Boolean,尽管在其他线程上查找此主题,但我还是被卡住了。我希望得到以下方面的帮助: 如果宏可以找到一个名为“Transfers”的工作表,我希望它激活该工作表并运行sub的其余部分,从而使“Transfers”成为最后一个工作表 如果找不到名为“传输”的工作表,我希望它能显示一条消息(请确保您将数据表重命名为“传输”),然后退出sub。我下面的代码不起作用 Sub Double_Transfer_Report() Dim er As Boolean er = False On Error Resume

尽管在其他线程上查找此主题,但我还是被卡住了。我希望得到以下方面的帮助:

如果宏可以找到一个名为“Transfers”的工作表,我希望它激活该工作表并运行sub的其余部分,从而使“Transfers”成为最后一个工作表

如果找不到名为“传输”的工作表,我希望它能显示一条消息(请确保您将数据表重命名为“传输”),然后退出sub。我下面的代码不起作用

Sub Double_Transfer_Report()
Dim er As Boolean
er = False

On Error Resume Next
'Worksheets("Transfers").Activate
er = true

If er Then
MsgBox ("Please make sure that you renamed your data sheet : Transfers)
Exit Sub
End If

ActiveSheet.Move _
After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)

您的想法是尝试激活工作表,如果失败,请注意是否发生了错误

Sub Double_Transfer_Report()
    Dim er As Boolean

    er = False
    On Error Resume Next
    Worksheets("Transfers").Activate
    er = (Err.Number <> 0)
    On Error GoTo 0

    If er Then
        MsgBox "Please make sure that you renamed your data sheet : Transfers)"
    Else
        ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub
您可以按如下所示修改代码。修改涉及
er
变量获取其值的方式。在
Activate
方法失败后,
Err
对象将包含错误号(和其他详细信息),直到发生另一个错误或遇到另一个
On error
语句(除其他外)。将布尔值
er
设置为逻辑测试
Err.Number 0
将检测到发生了错误

Sub Double_Transfer_Report()
    Dim er As Boolean

    er = False
    On Error Resume Next
    Worksheets("Transfers").Activate
    er = (Err.Number <> 0)
    On Error GoTo 0

    If er Then
        MsgBox "Please make sure that you renamed your data sheet : Transfers)"
    Else
        ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub
Sub-Double\u Transfer\u Report()
作为布尔值的dimer
er=假
出错时继续下一步
工作表(“传输”)。激活
er=(错误编号0)
错误转到0
如果呃那么
MsgBox“请确保您重命名了数据表:传输)”
其他的
ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
如果结束
端接头

您的想法是尝试激活工作表,如果激活失败,请注意是否发生了错误

Sub Double_Transfer_Report()
    Dim er As Boolean

    er = False
    On Error Resume Next
    Worksheets("Transfers").Activate
    er = (Err.Number <> 0)
    On Error GoTo 0

    If er Then
        MsgBox "Please make sure that you renamed your data sheet : Transfers)"
    Else
        ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub
您可以按如下所示修改代码。修改涉及
er
变量获取其值的方式。在
Activate
方法失败后,
Err
对象将包含错误号(和其他详细信息),直到发生另一个错误或遇到另一个
On error
语句(除其他外)。将布尔值
er
设置为逻辑测试
Err.Number 0
将检测到发生了错误

Sub Double_Transfer_Report()
    Dim er As Boolean

    er = False
    On Error Resume Next
    Worksheets("Transfers").Activate
    er = (Err.Number <> 0)
    On Error GoTo 0

    If er Then
        MsgBox "Please make sure that you renamed your data sheet : Transfers)"
    Else
        ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub
Sub-Double\u Transfer\u Report()
作为布尔值的dimer
er=假
出错时继续下一步
工作表(“传输”)。激活
er=(错误编号0)
错误转到0
如果呃那么
MsgBox“请确保您重命名了数据表:传输)”
其他的
ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
如果结束
端接头

不要使用错误对象进行体操。只需通过循环检查该表是否存在



不要用错误对象做体操。只需通过循环检查该表是否存在



如果您可以在某处留出两个单元格,则可以避免循环和错误处理,例如我们使用B1B2。在B1中放置建议的工作表名称,并使用以下方法填写B2

Range("B2").Value = "=ISNUMBER(ROWS(INDIRECT(""'""&B1&""'!A1"")))"
然后检查B2中的布尔结果:


如果您可以在某处留出两个单元格,您可以避免循环和错误处理,例如我们使用B1B2。在B1中放置建议的工作表名称,并使用以下方法填写B2

Range("B2").Value = "=ISNUMBER(ROWS(INDIRECT(""'""&B1&""'!A1"")))"
然后检查B2中的布尔结果:


只是另一种方法,并不是说它比Cyboashu的(或else的答案)更好

使用Xl4Macro创建一个命名范围,例如
SheetExists
,并将其放入引用中:
=SUBSTITUTE(GET.WORKBOOK(1),“[”&GET.WORKBOOK(16)&“],”)

现在,您可以在任何工作表上添加此(数组)公式,它将返回工作表的实际索引(如果可用)

{=MATCH(“Sheet1091”,转置(SheetExists),0)}


只是另一种做事方式。:

只是另一种方式,并不是说它比Cyboashu的(或else的答案)更好

使用Xl4Macro创建一个命名范围,例如
SheetExists
,并将其放入引用中:
=SUBSTITUTE(GET.WORKBOOK(1),“[”&GET.WORKBOOK(16)&“],”)

现在,您可以在任何工作表上添加此(数组)公式,它将返回工作表的实际索引(如果可用)

{=MATCH(“Sheet1091”,转置(SheetExists),0)}


这是另一种处理方法。

如果er-Then
可以重写为
如果为True,那么
-这是完全无条件的编译时常量,无论是否发生错误。
在错误恢复下一步
的意思正是:如果有错误,下一行将执行,因此您需要检查某个地方的
Err.Number
,以获得有用的条件。
如果er-Then
可以重写为
如果为True,则
-无论是否发生错误,它都是完全无条件的编译时常量。
在error Resume Next上
的意思就是:如果有错误,下一行e不管怎样执行-因此你需要在某个地方检查
Err.Number
,以获得一个有用的条件。这是可行的,但如果工作簿包含很多很多工作表,效率将毫无用处。尽管如此,将逻辑抽象为其自己的专用功能还是值得称赞的。同意,它确实增加了一层执行。但是,对于1200张工作表,它需要no找到工作表存在的时间到了。如果我们有更多的工作表,那么就有更大的问题要处理。:)很遗憾Excel集合没有公开Exists方法。@Excelosaurus是Excel的局限性让这项工作保持了趣味性。:)只有四到五张工作表,这样就行了。谢谢!这很有效,但没有用。@Excelosaurus如果工作簿包含很多很多工作表,则效率低下。不过,将逻辑抽象为自己的专用功能是值得称赞的。同意的,它确实增加了一层执行。但是有1200张工作表,就不需要花时间去发现工作表的存在。如果我们有更多的工作表