用于检查工作表是否存在的函数的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时的。。感谢您的回复(很抱歉延迟,我一直在度假)。当我回到工作岗位时,我会做一些编辑,看看进展如何。谢谢