用于检查工作表是否存在的函数的VBA错误处理

用于检查工作表是否存在的函数的VBA错误处理,vba,error-handling,Vba,Error Handling,我有一个函数,可以添加一个工作表并对其重命名,但首先检查是否已经存在同名的工作表。为了做到这一点,我在这里使用了非常广泛可用的函数- Function WorksheetExists(ByVal WorksheetName As String) As Boolean On Error Resume Next ' Set to Resume Next as don't want to end macro if this fails WorksheetExists = (Sheet

我有一个函数,可以添加一个工作表并对其重命名,但首先检查是否已经存在同名的工作表。为了做到这一点,我在这里使用了非常广泛可用的函数-

Function WorksheetExists(ByVal WorksheetName As String) As Boolean

    On Error Resume Next ' Set to Resume Next as don't want to end macro if this fails
    WorksheetExists = (Sheets(WorksheetName).Name <> "")
    On Error GoTo 0

End Function
函数工作表列表(ByVal工作表名称为字符串)为布尔值
“错误时继续下一步”设置为“继续下一步”,因为如果此操作失败,则不希望结束宏
工作表列表=(工作表(工作表名称).Name“”)
错误转到0
端函数
我的问题是,我已经在调用此函数的父子系统中设置了
On Error GoTo Error\u exit
,因此在检查工作表是否存在后,设置
On Error GoTo 0

我在这个函数中尝试了
On Error GoTo Error\u exit
,但是我得到了以下错误-

Complie错误:未定义标签


有人知道我如何解决这个问题吗?

当您退出功能
工作表时,您的错误范围将自动恢复到以前的情况。
在调用子函数/函数中,无需执行任何操作即可恢复出错时的
转到错误退出


值得注意的是,如果从该函数中删除错误处理,并且不存在具有传递名称的工作表,则代码将在调用错误处理标签(即,在调用代码中的错误退出:标签)上继续执行

我想你的意思是,不使用大多数程序员不喜欢的错误恢复下一步,这也意味着在调试过程中,你不能使用“所有错误中断”来使代码停止运行(工具->选项->常规->错误捕获->所有错误中断)

对我来说,一个解决方案是将任何错误的简历下一步埋入一个编译过的DLL中,在过去这应该是VB6。今天你可以使用VB.NET,但我选择使用C

如果您可以使用VisualStudio,那么这里有一些源代码。该模式类似于C#的TryParse,它返回表示成功的布尔值,但也在返回参数(或C#术语中的out参数)中返回结果

这是C#源代码,启动一个名为Buryvbarrorscs的类库,设置ComVisible(true)添加对COM库“Microsoft Excel n”的引用,单击“注册”进行互操作

using Microsoft.Office.Interop.Excel;
using System;
using System.Runtime.InteropServices;

namespace BuryVBAErrorsCS
{
    // Requires adding a reference to COM library Microsoft Excel 
    // In AssemblyInfo.cs set ComVisible(true);
    // In Build tab check 'Register for Interop'
    public interface ICollectionItemTry
    {
        bool SheetsItemTry(Sheets worksheetsCol, object vItem, out Worksheet result);
        bool WorkbooksItemTry(Workbooks workbooksCol, object vItem, out Workbook result);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ICollectionItemTry))]
    public class CCollectionItemTry : ICollectionItemTry
    {
        public bool SheetsItemTry(Sheets worksheetsCol, object vItem, out Worksheet result)
        {
            result = null;
            try
            {
                result = worksheetsCol.Item[vItem];
                return true;
            }
            catch (Exception)
            { }
            return false;
        }

        public bool WorkbooksItemTry(Workbooks workbooksCol, object vItem, out Workbook result)
        {
            result = null;
            try
            {
                result = workbooksCol.Item[vItem];
                return true;
            }
            catch (Exception)
            { }
            return false;
        }
    }
}
对于Excel客户端VBA代码,这里有一些源代码

Sub TestCCollectionItemTry()
    Dim o As BuryVBAErrorsCS.CCollectionItemTry
    Set o = New BuryVBAErrorsCS.CCollectionItemTry

    Dim ws As Excel.Worksheet
    Debug.Assert Not o.SheetsItemTry(ThisWorkbook.Sheets, "Sheet3366", ws)
    Debug.Assert ws Is Nothing

    '* sanity check
    Set ws = ThisWorkbook.Worksheets.Item("Sheet1")
    Debug.Assert Not ws Is Nothing

    '* assuming Sheet1 exists
    Set ws = Nothing
    Debug.Assert o.SheetsItemTry(ThisWorkbook.Sheets, "Sheet1", ws)
    Debug.Assert Not ws Is Nothing

    Set ws = Nothing
    Debug.Assert o.SheetsItemTry(ThisWorkbook.Sheets, 1, ws)
    Debug.Assert Not ws Is Nothing

    '* workbooks
    Dim wb As Excel.Workbook
    Debug.Assert o.WorkbooksItemTry(Application.Workbooks, 1, wb)
    Debug.Assert Not wb Is Nothing

    Set wb = Nothing
    Debug.Assert o.WorkbooksItemTry(Application.Workbooks, ThisWorkbook.Name, wb)
    Debug.Assert Not wb Is Nothing

    Set wb = Nothing
    Debug.Assert Not o.WorkbooksItemTry(Application.Workbooks, "BonzoDogDoodah.xls", wb)
    Debug.Assert wb Is Nothing


End Sub

注意将工作表集合改为工作表集合。

@DavidGard:除此之外,您还可以删除错误转到0时的
。感谢您的回复(很抱歉延迟,我一直在度假)。当我回到工作岗位时,我会做一些编辑,看看进展如何。谢谢