परीक्षण या जाँच करें कि क्या शीट मौजूद है


115
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 

जवाबों:


173

कुछ लोग त्रुटि से निपटने के "अनुचित" उपयोग के कारण इस दृष्टिकोण को नापसंद करते हैं, लेकिन मुझे लगता है कि यह 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

5
पूरी तरह से उपयोग IMO का उपयोग करें। यह एक बात यह है कि मौजूदा के समान समझा जाता है और नहीं करता है और एक लंबा इतिहास है है के लिए एक जाल है - सीएफ पर्ल सख्त, Stae आदि upvoted
Wudang

13
शायद ActiveWorkbookइसके बजाय एक का उपयोग करना चाहिए ThisWorkbook। उत्तरार्द्ध कार्यपुस्तिका को संदर्भित करता है जिसमें मैक्रो कोड होता है, जो कि कार्यपुस्तिका से अलग हो सकता है जो परीक्षण करना चाहता है। मुझे लगता है कि ActiveWorkbookज्यादातर मामलों के लिए उपयोगी होगा (आकस्मिक स्थिति हमेशा उपलब्ध होती है, हालांकि)।
sancho.s ReinstateMonicaCellio

3
sht Is Nothingहो जाएगा Trueइस नाम का कोई चादर वहाँ है, लेकिन हम वापस जाने के लिए चाहते हैं, तो Trueअगर वहाँ है कि इस नाम का पत्रक, इसलिए नहीं। यह थोड़ा आसान (लेकिन वैध) यदि आप के लिए एक सा फिर से व्यवस्थितSheetExists = sht Is Not Nothing
टिम विलियम्स

3
ध्यान दें कि यदि आप अपनी व्यक्तिगत मैक्रो वर्कबुक में इस कोड को चलाते हैं, तो इससे बदल If wb Is Nothing Then Set wb = ThisWorkbookदेंIf wb Is Nothing Then Set wb = ActiveWorkbook
हेनरिक के

2
यह एक अत्यधिक-कुशल दृष्टिकोण है (नीचे रोरी के जवाब के तहत बेंच मार्क के बारे में मेरी टिप्पणी देखें), इसलिए कौन परवाह करता है कि अवरोधक क्या सोचते हैं। ध्यान दें (अभी के अनुसार) आपके पास शून्य डाउन वोट हैं।
rory.ap

107

यदि आप विशेष रूप से केवल वर्कशीट में रुचि रखते हैं, तो आप एक साधारण मूल्यांकन कॉल का उपयोग कर सकते हैं:

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

14
@ रोरी ने इस बनाम टिम विलियम्स के जवाब पर कुछ बेंचमार्क टेस्ट चलाए। 500,000 से अधिक लूप्स, आपका 22 सेकंड और टिम ने <1 लिया।
rory.ap

17
@ रोरैप - यदि आपको इस 500,000 बार चलाने की आवश्यकता है, तो आपको अपने पूरे दृष्टिकोण पर पुनर्विचार करने की आवश्यकता है। ;)
रोरी

9
@roryap - हालांकि, कई धीमी विधियों का उपयोग करके सेकंड को जमा करना शुरू हो जाएगा। मैं कहूंगा कि यह अत्यंत मूल्यवान जानकारी है, क्योंकि एक्सेल "एप्लिकेशन" विभिन्न रेंज विधियों आदि के साथ आसानी से सेकंड रैक करना शुरू कर देता है
tedcurrent

4
@ नियम- यह जानकारी किस तरह से बातचीत के लिए मूल्यवान है? मैं केवल यह कह रहा हूं कि आपके कोड के आस-पास बिखरने वाले अयोग्य तरीके आवेदन को संपूर्ण रूप से धीमा कर देंगे। आप इस 500k बार परीक्षण भयानक है और मैं इसे करने के लिए धन्यवाद, 22 सेकंड महान नहीं है। (मैं आपसे सहमत हूँ)
tedcurrent

6
यहां तक ​​कि अगर यह धीमा है, तो यह स्वीकृत उत्तर की तुलना में बहुत क्लीनर समाधान जैसा दिखता है। मुझ से +1।
साशा एल।

49

इसे पूरा करने के लिए आपको त्रुटि से निपटने की आवश्यकता नहीं है। आपको बस सभी वर्कशीट पर चलना है और जाँचना है कि क्या निर्दिष्ट नाम मौजूद है:

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

21

संग्रह के सदस्यों के लिए जाँच करना एक सामान्य समस्या है, यहाँ टिम के उत्तर का सार संस्करण है:

समारोह में शामिल हैं (ऑब्जेक्ट के रूप में objCollection, स्ट्रिंग के रूप में नाम) बूलियन के रूप में
    वस्तु के रूप में मंद ओ
    त्रुटि फिर से शुरू पर
    सेट ओ = ऑब्जेक्लेक्शन (स्ट्रैमनाम)
    शामिल हैं = (Err.Number = 0)
    Err.Clear
 अंत समारोह

इस समारोह वस्तु की तरह किसी भी संग्रह के साथ इस्तेमाल किया जा सकता ( Shapes, Range, Names, Workbooks, आदि)।

एक शीट के अस्तित्व की जांच करने के लिए, का उपयोग करें If Contains(Sheets, "SheetName") ...


5
यह संग्रह में प्राथमिक प्रकारों को नहीं पकड़ता क्योंकि Setकीवर्ड द्वारा एक त्रुटि उठाई जाएगी । मैंने पाया कि उपयोग करने के बजाय Set, TypeNameसंग्रह के सदस्य के लिए पूछना सभी मामलों के लिए काम करता है, अर्थातTypeName objCollection(strName)
Citkong

2
@Peter: फंक्सन समाप्त होने से पहले गैर-मौजूदगी की स्थिति में उठने वाली त्रुटि को दूर करने के लिए कुछ जोड़ने के लिए सबसे अच्छा है - या तो एक त्रुटिपूर्ण है। त्रुटि या अगले त्रुटि को फिर से शुरू करें। अन्यथा कॉलिंग प्रक्रिया में त्रुटि को अनजाने में निम्नलिखित जैसे मामलों में ट्रिगर किया जा सकता है। Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
जेफ्रीविर

16

सही किया: त्रुटि से निपटने के बिना:

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

14

मामले में किसी को भी VBA और परीक्षण से बचने के लिए एक वर्कशीट विशुद्ध रूप से एक सेल सूत्र के भीतर मौजूद है, तो चाहता है, इसे का उपयोग संभव है ISREFऔर INDIRECTकार्य:

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

TRUEयदि कार्यपुस्तिका में पत्रक नाम SheetNameऔर FALSEअन्यथा शामिल है, तो यह वापस आ जाएगी ।


12

मैंने इसे लिखा है:

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

1
शानदार समारोह! न केवल यह तेज है, यह सबसे संक्षिप्त भी है।
क्रिस बॉन

मैं यह उत्तर देता हूं कि यह प्रश्न सबसे अधिक मेल खाता है
जुआन जोया

मैं यह पसंद है। ध्यान दें कि यह इस तथ्य पर निर्भर करता है कि चादर के लिए डिफ़ॉल्ट मूल्य गलत होगा क्योंकि यह बूलियन फ़ंक्शन है। असाइनमेंट स्टेटमेंट वास्तव में शीट एक्सिस्ट को गलत मान नहीं देता है यदि शीट मौजूद नहीं है, तो यह केवल त्रुटियां करता है और डिफ़ॉल्ट मान को छोड़ देता है। यदि आप चाहते हैं, तो आप इस तथ्य पर भरोसा कर सकते हैं कि बूलियन चर को सौंपा गया कोई भी गैर-शून्य मान एक सच्चा परिणाम देगा और> 0 तुलना छोड़ देगा, जैसे कि: sheetExist = ActiveWorkbook.Sheets(sSheet).Index
oddacorn

5

मेरा समाधान टिम्स की तरह दिखता है, लेकिन गैर-वर्कशीट शीट - चार्ट के मामले में भी काम करता है

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


3

परीक्षण को एक फ़ंक्शन में रखें और आप इसे फिर से उपयोग करने में सक्षम होंगे और आपके पास बेहतर कोड पठनीयता होगी।

"त्रुटि फिर से शुरू करें अगला" का उपयोग न करें क्योंकि यह आपके कोड के अन्य भाग के साथ संघर्ष कर सकता है।

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

3

कई साल देर से, लेकिन मुझे बस यह करने की ज़रूरत थी और पोस्ट किए गए किसी भी समाधान को पसंद नहीं किया ... इसलिए मैंने एक (जादू इंद्रधनुष हाथों के इशारे) "मूल्यांकन ()" के जादू के लिए सभी को धन्यवाद दिया!

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

यदि शीट मौजूद नहीं है तो TRUE लौटाता है; यदि शीट मौजूद है तो FALSE। आप "1: 1" के लिए जो भी सीमा पसंद करते हैं, उसे स्थानापन्न कर सकते हैं, लेकिन मैं एक एकल सेल, क्यूज़ का उपयोग करने के खिलाफ सलाह देता हूं यदि इसमें कोई त्रुटि है (उदाहरण के लिए, # एन / ए), तो यह सही वापस आ जाएगी।


3

कॉम्पैक्ट 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"

अधिक जानकारी:


2

नामित वर्कशीट मौजूद है या नहीं यह निर्धारित करने के लिए सिर्फ एक छोटे लूप का उपयोग क्यों नहीं किया जाता है? कहो कि क्या आप वर्तमान में खोली गई कार्यपुस्तिका में "शीट 1" नामक वर्कशीट की तलाश कर रहे थे।

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

2

यदि आप WorksheetFunction.एक गैर-अंग्रेजी देश से काम करते हैं या एक गैर-अंग्रेजी एक्सेल के साथ काम कर रहे हैं तो यह एक अच्छा उपाय है, जो काम करता है:

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

या इस तरह एक समारोह में:

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

1
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

1
    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

1

जो भी शीट नाम आपके लिए परीक्षण कर रहे हैं, उसका "डेटा" बदलें ...

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

1

किसी भी संदेह के बिना कि उपरोक्त फ़ंक्शन काम कर सकता है, मैंने अभी निम्नलिखित कोड के साथ समाप्त किया है जो बहुत अच्छी तरह से काम करता है:

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यह वह जगह है जहां मैं उपयोगकर्ता से नाम इनपुट करने के लिए कहता हूं, इसलिए यह आपके लिए समान नहीं हो सकता है।


0

मैंने एक और काम किया: एक शीट को केवल तभी हटाएं जब वह मौजूद हो - एक त्रुटि प्राप्त करने के लिए नहीं अगर यह नहीं है:

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

0

मैं इसे करने का एक आसान तरीका लेकर आया था, लेकिन मैंने इसके लिए एक नया उप नहीं बनाया। इसके बजाय, मैं अभी जिस उप पर काम कर रहा था, उसके भीतर "मैंने एक चेक चलाया"। हम जिस शीट के नाम की तलाश कर रहे हैं, उसे "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

जब शीट मौजूद नहीं है तो मैंने पॉप-अप भी जोड़ा।


0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन यहां एक और सरल उपाय है जो तेज है।

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


-4

मेरे पास वास्तव में यह जांचने का एक सरल तरीका था कि क्या शीट मौजूद है और फिर कुछ निर्देश निष्पादित करें:

मेरे मामले में मैं शीट को हटाना चाहता था और फिर उसी नाम से एक ही शीट को फिर से बनाया, लेकिन कोड बाधित हो गया था यदि प्रोग्राम शीट को हटाने में सक्षम नहीं था क्योंकि यह पहले ही हटा दिया गया था

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

इस उत्तर के साथ समस्या यह है कि यह निर्धारित करने पर कि शीट वास्तव में मौजूद थी, इसे हटा दिया गया है और इसलिए अब मौजूद नहीं है। यदि यह एक फ़ंक्शन के रूप में लिखा गया था, तो इसका नाम SheetExistsAfterDeletion हो सकता है और यह हमेशा FALSE लौटाएगा।
क्रिस जुएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.