2013-02-15 2 views
3

워크 시트를 추가하고 이름을 바꾸는 기능이 있지만 먼저 해당 이름의 워크 시트가 있는지 확인합니다. 이를 위해, 나는 여기에 꽤 널리 사용되는 기능을 사용하고 있습니다 -워크 시트가 있는지 확인하는 함수에 대한 VBA 오류 처리

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 

내 문제는 내가 이미 시트가 nulifies을 존재하는 경우 확인 후 너무 On Error GoTo 0,이 함수를 호출 부모 하위에 On Error GoTo error_exit를 설정했는지입니다 요구.

나는이 기능에 On Error GoTo error_exit을 시도했지만, 나는 다음과 같은 오류 얻을 -

Complie Error: Label not defined

아무도 내가이 문제를 해결할 수있는 방법을 알고 있나요을?

답변

5

WorksheetExists 기능을 종료하면 오류 범위가 자동으로 이전 상황으로 재개됩니다. 호출 하위/함수에서 On Error Goto error_exit을 재개하려면 아무 것도 할 필요가 없습니다.

이 함수에서 오류 처리를 제거하고 전달 된 이름이있는 워크 시트가 없으면 코드는 호출 오류 처리 레이블 (즉, error_exit : label)에서 실행을 다시 시작합니다

+3

@DavidGard : 이에 더하여, On Error GoTo 0을 제거 할 수 있습니다. –

+0

@PeterAlbert right – Steve

+0

답장을 보내 주셔서 감사합니다. (지연되어 죄송하며 휴가를 보내고 있습니다.) 내가 일하러 돌아와서 어떻게 돌아가는지 볼 때 편집을 할 것입니다. 감사. –

0

대부분의 프로그래머가 싫어하는 오류시 다음 재시작을 사용하지 않고 디버깅하는 동안 'Break On All Errors'를 사용하여 코드가 멈추는 것을 막을 수 없다는 것을 의미한다고 생각합니다 (도구 -> 옵션 -> 일반 -> 오류 트래핑 -> 모든 오류 중단).

저에게있어서 하나의 해결책은 컴파일 된 DLL에 On Error Resume Next를 묻는 것입니다. 예전에는 VB6이었을 것입니다. 오늘 당신은 VB.NET을 사용할 수 있지만 C#을 사용하도록 선택했습니다.

Visual Studio를 사용할 수있는 경우 여기에 몇 가지 소스가 있습니다. 패턴은 성공을 나타내는 부울을 반환하는 C#의 TryParse와 비슷하지만 반환 매개 변수 (또는 C# 구문의 out 매개 변수)에 결과를 반환합니다.

여기에 C# 소스가 있으며 BuryVBAErrorsCS라고하는 클래스 라이브러리를 시작하고 ComVisible COM 라이브러리 'Microsoft Excel n'에 대한 참조를 추가하고 Interop에 등록을 클릭하십시오. 여기 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; 
     } 
    } 
} 

어떤 소스를 대신 워크 시트 모음의 시트 컬렉션에서

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 

주 잘 패스입니다.

관련 문제