[excel] 시트가 있는지 테스트 또는 확인

Dim wkbkdestination As Workbook
Dim destsheet As Worksheet

For Each ThisWorkSheet In wkbkorigin.Worksheets
    'this throws subscript out of range if there is not a sheet in the destination 
    'workbook that has the same name as the current sheet in the origin workbook.
    Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name)
Next

기본적으로 원본 통합 문서의 모든 시트를 반복 한 다음 destsheet대상 통합 문서에서 원본 통합 문서 의 현재 반복 된 시트와 동일한 이름을 가진 시트로 설정합니다.

해당 시트가 있는지 어떻게 테스트 할 수 있습니까? 다음과 같은 것 :

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then 



답변

일부 사람들은 오류 처리의 “부적절한”사용으로 인해이 접근 방식을 싫어하지만 VBA에서는 허용되는 것으로 간주됩니다. 대체 접근 방식은 일치하는 항목을 찾을 때까지 모든 시트를 반복하는 것입니다.

Function WorksheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet

    If wb Is Nothing Then Set wb = ThisWorkbook
    On Error Resume Next
    Set sht = wb.Sheets(shtName)
    On Error GoTo 0
    WorksheetExists = Not sht Is Nothing
End Function


답변

특별히 워크 시트에만 관심이있는 경우 간단한 Evaluate 호출을 사용할 수 있습니다.

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function


답변

이를 수행하기 위해 오류 처리가 필요하지 않습니다. 모든 워크 시트를 반복하고 지정된 이름이 있는지 확인하기 만하면됩니다.

For i = 1 To Worksheets.Count
    If Worksheets(i).Name = "MySheet" Then
        exists = True
    End If
Next i

If Not exists Then
    Worksheets.Add.Name = "MySheet"
End If


답변

컬렉션의 구성원을 확인하는 것이 일반적인 문제이므로 다음은 Tim의 답변을 추상화 한 버전입니다.

함수 Contains (objCollection As Object, strName as String) As Boolean
    개체로 Dim o
    오류시 다음 재개
    o = objCollection (strName) 설정
    포함 = (Err.Number = 0)
    Err. Clear
 끝 기능

이 기능 (오브젝트와 같은 모음으로 사용될 수있는 Shapes, Range, Names, Workbooks, 등).

시트의 존재를 확인하려면 If Contains(Sheets, "SheetName") ...


답변

수정 됨 :
오류 처리 없음 :

Function CheckIfSheetExists(SheetName As String) As Boolean
      CheckIfSheetExists = False
      For Each WS In Worksheets
        If SheetName = WS.name Then
          CheckIfSheetExists = True
          Exit Function
        End If
      Next WS
End Function


답변

누구나 VBA를 피하고 워크 시트가 순수하게 셀 수식 내에 존재하는지 테스트하려는 경우 ISREFINDIRECT함수를 사용할 수 있습니다.

=ISREF(INDIRECT("SheetName!A1"))

이 반환됩니다 TRUE통합 문서라는 시트가 포함되어있는 경우 SheetNameFALSE그렇지.


답변

나는 이것을 썼다.

Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function