시트가 있는지 테스트 또는 확인
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"
상세 정보:
- MSDN
Next
: …문(VBA) - MSDN : 스테이트먼트(VBA)
- MSDN : 비교 연산자(VBA)
이 솔루션은 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
'programing' 카테고리의 다른 글
std::목록을 반복하는 동안 목록에서 요소를 제거할 수 있습니까? (0) | 2023.04.16 |
---|---|
이중 괄호 또는 단일 괄호, 괄호, 컬리 괄호 사용 방법 (0) | 2023.04.16 |
SQL Server 2005 데이터베이스에서 어떤 테이블이 가장 많은 공간을 차지하는지 어떻게 알 수 있습니까? (0) | 2023.04.16 |
FullRow 선택 모드에서 DataGrid 현재 셀 테두리 사용 안 함 (0) | 2023.04.16 |
Swift - 시/분/초로 정수 변환 (0) | 2023.04.16 |