我有一个将添加工作表并重命名的函数,但首先检查是否已存在该名称的工作表。为此,我在这里使用了相当广泛的功能 -
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错误:标签未定义
有人知道如何解决这个问题吗?
答案 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集合。