programing

시트가 있는지 테스트 또는 확인

linuxpc 2023. 4. 16. 14:41
반응형

시트가 있는지 테스트 또는 확인

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

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

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

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

Dim exists As Boolean

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

이렇게 썼어요.

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

컬렉션의 멤버를 확인하는 것은 일반적인 문제이기 때문에 @Tim의 답변의 추상화 버전을 다음에 나타냅니다.

Function Contains(objCollection As Object, strName as String) As Boolean
    Dim o as Object
    On Error Resume Next
    set o = objCollection(strName)
    Contains = (Err.Number = 0)
    Err.Clear
 End Function

이 함수는 모든 컬렉션과 같은 개체와 함께 사용할 수 있습니다.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를 피하고 셀 공식 내에 워크시트가 순수하게 존재하는지 검정하려는 경우 다음을 사용할 수 있습니다.ISREF그리고.INDIRECT기능:

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

이것은 돌아올 것이다.TRUE워크북에 라는 시트가 포함되어 있는 경우SheetName그리고.FALSE그렇지않으면.

작은wsExists기능하다

여기에서는, 에러 처리에 의존하지 않고, 워크시트가 존재하는지 아닌지를 판별하는 간단하고 간단한 함수를 소개합니다(어느 상황에서도 올바르게 동작한다고 선언되어 있습니다).

Function wsExists(wsName As String) As Boolean
    Dim ws: For Each ws In Sheets
    wsExists = (wsName = ws.Name): If wsExists Then Exit Function
    Next ws
End Function

사용 예:

다음 예제에서는 다음과 같은 새 워크시트를 추가합니다.myNewSheet아직 존재하지 않는 경우:

If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"

상세 정보:

이 솔루션은 Tims와 매우 비슷하지만 워크시트 이외의 경우에도 기능합니다(차트).

Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
    If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate
    Dim obj As Object
    On Error GoTo HandleError
    Set obj = wbWorkbook.Sheets(strSheetName)
    SheetExists = True
    Exit Function
HandleError:
    SheetExists = False
End Function

.

몇 년이나 늦었지만, 난 그저 이걸 해야 했고 어떤 해결책도 게시된 게 싫었어...(SpongeBob 무지개 손동작) "Evaluate" 마법 덕분에 하나 만들었어요!

Evaluate("IsError(" & vSheetName & "!1:1)")

시트가 없으면 TRUE를 반환하고, 시트가 있으면 FALSE를 반환합니다.원하는 범위로 "1:1"을 대체할 수 있지만, 단일 셀에 오류(예: #N/A)가 포함되어 있으면 True가 반환되기 때문에 사용하지 않는 것이 좋습니다.

짧고 깔끔함:

Function IsSheet(n$) As Boolean
    IsSheet = Not IsError(Evaluate("'" & n & "'!a1"))
End Function

테스트를 함수에 넣으면 다시 사용할 수 있고 코드 가독성이 향상됩니다.

"다음 오류 재개 시"는 코드의 다른 부분과 충돌할 수 있으므로 사용하지 마십시오.

Sub DoesTheSheetExists()
    If SheetExist("SheetName") Then
        Debug.Print "The Sheet Exists"
    Else
        Debug.Print "The Sheet Does NOT Exists"
    End If
End Sub

Function SheetExist(strSheetName As String) As Boolean
    Dim i As Integer

    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = strSheetName Then
            SheetExist = True
            Exit Function
        End If
    Next i
End Function
Public Function WorkSheetExists(ByVal strName As String) As Boolean
   On Error Resume Next
   WorkSheetExists = Not Worksheets(strName) Is Nothing
End Function

sub test_sheet()

 If Not WorkSheetExists("SheetName") Then
 MsgBox "Not available"
Else MsgBox "Available"
End If

End Sub

작은 루프를 사용하여 명명된 워크시트가 존재하는지 여부를 확인하는 것이 어떨까요?현재 열려 있는 워크북에서 "Sheet1"이라는 워크시트를 찾고 있다고 가정해 보십시오.

Dim wb as Workbook
Dim ws as Worksheet

Set wb = ActiveWorkbook

For Each ws in wb.Worksheets

    if ws.Name = "Sheet1" then
        'Do something here
    End if

Next
    For Each Sheet In Worksheets
    If UCase(Sheet.Name) = "TEMP" Then
    'Your Code when the match is True
        Application.DisplayAlerts = False
        Sheet.Delete
        Application.DisplayAlerts = True
    '-----------------------------------
    End If
Next Sheet

★★★★★★★★의 경우WorksheetFunction.또는 영어 이외의 국가에서 영어 이외의 Excel을 사용하여 작업하는 경우 다음과 같은 이점이 있습니다.

WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))

또는 다음과 같은 함수에서:

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function

테스트할 시트 이름으로 "데이터" 변경...

On Error Resume Next 

Set DataSheet = Sheets("Data")

If DataSheet Is Nothing Then

     Sheets.Add(after:=ActiveSheet).Name = "Data"
     ''or whatever alternate code you want to execute''
End If

On Error GoTo 0

위의 기능이 동작할 수 있는 것은 틀림없지만, 저는 다음과 같은 코드로 잘 동작하고 있습니다.

Sub Sheet_exist ()
On Error Resume Next
If Sheets("" & Range("Sheet_Name") & "") Is Nothing Then
    MsgBox "doesnt exist"
Else
    MsgBox "exist"
End if
End sub

★★★★★★Sheets_Name사용자에게 이름을 입력하도록 요구하는 장소이기 때문에, 이 경우는 동일하지 않을 수 있습니다.

다른 작업을 수행했습니다. 시트가 있는 경우에만 삭제 - 없는 경우 오류는 발생하지 않습니다.

Excel.DisplayAlerts = False 
Dim WS
For Each WS In Excel.Worksheets
    If WS.name = "Sheet2" Then
        Excel.sheets("Sheet2").Delete
        Exit For
    End If
Next
Excel.DisplayAlerts = True

이 기능을 사용하여 확인하고 필요에 따라 새 시트 이름을 반환합니다.WSname은 원하는 워크시트 이름이고 WBCur는 체크인할 워크북입니다.에러 처리가 불필요하고, 새로운 워크시트를 작성할 때마다 호출할 수 있기 때문에 사용하고 있습니다.

Public Function CheckNewWorksheetName(WSName As String, WBCur As Workbook) 'Will return New Name if needed
    Dim NewWSNum As Long, A As Integer, B As Integer, WorksheetFound As Boolean
    NewWSNum = 1
    WorksheetFound = False
    For A = 1 To WBCur.Worksheets.Count
        If WBCur.Worksheets(A).Name = WSName Then
            A = WBCur.Worksheets.Count
            WorksheetFound = True
        End If
    Next A
    
    If WorksheetFound = False Then
        CheckNewWorksheetName = WSName
    Else
        Do While WorksheetFound = True
            WorksheetFound = False
            For B = 1 To WBCur.Worksheets.Count
                If WBCur.Worksheets(B).Name = WSName & "_" & NewWSNum Then
                    B = WBCur.Worksheets.Count
                    WorksheetFound = True
                    NewWSNum = NewWSNum + 1
                End If
            Next B
        Loop
        CheckNewWorksheetName = WSName & "_" & NewWSNum
    End If
End Function

쉬운 방법이 떠올랐지만 새로운 잠수정은 만들지 않았어요.대신, 저는 제가 작업하던 잠수함 안에서 "체크"를 실행했습니다.찾고 있는 시트 이름이 "Sheet_Exist"라고 가정하고 찾은 경우 활성화하려고 합니다.

Dim SheetCounter As Integer

SheetCounter = 1

Do Until Sheets(SheetCounter).Name = "Sheet_Exist" Or SheetCounter = Sheets.Count + 1
 SheetCounter = SheetCounter +1
Loop
If SheetCounter < Sheets.Count + 1 Then
 Sheets("Sheet_Exist").Activate
Else
 MsgBox("Worksheet ""Sheet_Exist"" was NOT found")
End If

시트가 없을 때를 위한 팝업도 추가했습니다.

오래된 포스트인 것은 알지만, 여기 빠른 다른 간단한 해결책이 있습니다.

Public Function worksheetExists(ByVal wb As Workbook, ByVal sheetNameStr As String) As Boolean

On Error Resume Next
worksheetExists = (wb.Worksheets(sheetNameStr).Name <> "")
Err.Clear: On Error GoTo 0

End Function

실제로 시트가 존재하는지 확인하고 명령을 실행할 수 있는 간단한 방법이 있었습니다.

내 경우 시트를 삭제하고 같은 이름의 시트를 다시 작성하려고 했지만 이미 삭제되었기 때문에 프로그램이 시트를 삭제할 수 없는 경우 코드가 중단되었습니다.

Sub Foo ()

    Application.DisplayAlerts = False

    On Error GoTo instructions
    Sheets("NAME OF THE SHEET").Delete

    instructions:

    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "NAME OF THE SHEET"

End Sub

언급URL : https://stackoverflow.com/questions/6688131/test-or-check-if-sheet-exists

반응형