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

时间:2013-02-15 11:52:09

标签: 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 = (Sheets(WorksheetName).Name <> "")
    On Error GoTo 0

End Function

我的问题是我已经在调用此函数的父子集中设置了On Error GoTo error_exit,因此在检查表单是否存在之后On Error GoTo 0会调用该调用。

我在这个函数中尝试了On Error GoTo error_exit但是我收到以下错误 -

  

Complie错误:标签未定义

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

2 个答案:

答案 0 :(得分:5)

退出函数WorksheetExists时,错误范围会自动恢复到先前的情况。 您无需执行任何操作即可恢复调用子/函数中的On Error Goto error_exit

有趣的是,如果从此函数中删除错误处理并且不存在具有传递名称的工作表,则代码将在调用错误处理标签上继续执行(即在error_exit:label in调用代码)

答案 1 :(得分:0)

我认为你的意思是不使用大多数程序员不喜欢的On Error Resume Next,这也意味着在调试过程中你不能使用'Break On All Errors'来让代码停止运行(Tools-&gt; Options-&gt ; General-&gt;错误陷阱 - &gt;中断所有错误。)

对我来说,一个解决方案是将任何On Error Resume Next埋入已编译的DLL中,在过去,这将是VB6。今天你可以使用VB.NET,但我选择使用C#。

如果您可以使用Visual Studio,那么这里有一些来源。该模式类似于C#的TryParse,它返回boolean指示成功,但也返回结果返回参数(或C#用语中的out参数)

这是C#源代码,启动一个类库,调用它BuryVBAErrorsCS,设置ComVisible(true)添加对COM库'Microsoft Excel n'的引用,单击Register for Interop。

atos App.app/App -l <load address> -arch arm64 <unsymbolicated adresses>

对于Excel客户端VBA代码,这里有一些来源

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;
        }
    }
}

注意WELL 传入Sheets集合而不是Worksheets集合。