대부분의 프로그래머가 싫어하는 오류시 다음 재시작을 사용하지 않고 디버깅하는 동안 '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
주 잘 패스입니다.
@DavidGard : 이에 더하여, On Error GoTo 0을 제거 할 수 있습니다. –
@PeterAlbert right – Steve
답장을 보내 주셔서 감사합니다. (지연되어 죄송하며 휴가를 보내고 있습니다.) 내가 일하러 돌아와서 어떻게 돌아가는지 볼 때 편집을 할 것입니다. 감사. –