পরীক্ষা করুন বা শীটটি বিদ্যমান কিনা তা পরীক্ষা করুন


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

কিছু লোক ত্রুটি পরিচালনার "অনুপযুক্ত" ব্যবহারের কারণে এই পদ্ধতির অপছন্দ করে, তবে আমি মনে করি এটি ভিবিএতে গ্রহণযোগ্য বলে মনে করা হচ্ছে ... আপনি কোনও ম্যাচ না পাওয়া পর্যন্ত সমস্ত শিট যদিও একটি বিকল্প পদ্ধতির লুপ হয়।

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
সম্পূর্ণরূপে আইএমও ব্যবহার করুন ror এটি এমন কোনও জিনিসের জন্য একটি ফাঁদ যা বিদ্যমান হিসাবে চিহ্নিত করা হয় এবং এটির দীর্ঘ ইতিহাস নেই - সিএফ পার্ল কঠোর, স্টাএ ইত্যাদি উত্সাহিত
Wudang

13
এর ActiveWorkbookপরিবর্তে সম্ভবত ব্যবহার করা উচিত ThisWorkbook। পরেরটি ম্যাক্রো কোড যুক্ত ওয়ার্কবুককে বোঝায় যা কোনও পরীক্ষার চেয়েও ওয়ার্কবুক থেকে আলাদা হতে পারে। আমার ধারণা, ActiveWorkbookবেশিরভাগ ক্ষেত্রেই কার্যকর হবে (যদিও স্বীকৃত পরিস্থিতি সর্বদা উপলভ্য থাকে)।
sancho.s পুনরায় ইনস্টল করুন মনিকাসেলিও

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
@ ররি আমি এই বনাম টিম উইলিয়ামসের উত্তর সম্পর্কে কিছু বেঞ্চমার্ক পরীক্ষা চালিয়েছি। ৫০০,০০০ এরও বেশি লুপ, আপনার 22 সেকেন্ড সময় নিয়েছিল এবং টিমস <1 নিয়েছিল।
rory.ap

17
@ ররিয়াপ - আপনার যদি এই ৫০০,০০০ বার চালানো দরকার হয়, আপনার নিজের সম্পূর্ণ পদ্ধতির পুনর্বিবেচনা করা দরকার। ;)
ররি

9
@ ররিয়াপ - তবে বেশ কয়েকটি ধীর পদ্ধতি ব্যবহার সেকেন্ডে পাইল আপ শুরু করবে। আমি বলব এটি অত্যন্ত মূল্যবান তথ্য, কারণ এক্সেল "অ্যাপ্লিকেশনগুলি" বিভিন্ন রেঞ্জের পদ্ধতি ইত্যাদির সাহায্যে খুব সহজেই কয়েক সেকেন্ড
রেকর্ড করতে শুরু করে

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

যেহেতু কোনও সংগ্রহের সদস্যদের জন্য পরীক্ষা করা একটি সাধারণ সমস্যা, তিমের উত্তরের একটি বিমূর্ত সংস্করণ এখানে:

বুলিয়ান হিসাবে ফাংশন (অবজেক্ট হিসাবে اعتراض, স্ট্রিং হিসাবে strName) ধারণ করে
    অবজেক্ট হিসাবে ডিমে ও
    ত্রুটি পুনরায় শুরু করার পরে
    সেট o = অবজেক্ট কালেকশন (strName)
    ধারণ করে = (এরার নাম্বার = 0)
    Err.Clear
 ফাংশন শেষ

এই ফাংশনটি বস্তুর মত কোন সংগ্রহ সঙ্গে ব্যবহার করা যেতে পারে ( Shapes, Range, Names, Workbooks, ইত্যাদি)।

কোনও শীটের অস্তিত্বের জন্য যাচাই করতে ব্যবহার করুন If Contains(Sheets, "SheetName") ...


5
এটি সংগ্রহে আদিম ধরণের ধরা পড়ে না কারণ Setকীওয়ার্ড দ্বারা ত্রুটি উত্থাপিত হবে । আমি খুঁজে পেয়েছি যে সংগ্রহের সদস্যের চেয়ে Setজিজ্ঞাসা করা TypeNameসমস্ত ক্ষেত্রে কাজ করে, অর্থাৎTypeName objCollection(strName)
নাগরিক কং

2
@ পিটার: ফানসিটনের সমাপ্তির আগে অস্তিত্বের ক্ষেত্রে যে ত্রুটিটি উত্থাপিত হবে তা পরিষ্কার করার জন্য কিছু যুক্ত করা সেরা Best অন্যথায় কলিং পদ্ধতিতে হ্যান্ডলিংয়ের ত্রুটিটি নিম্নলিখিতগুলির মতো ক্ষেত্রে অসাবধানতায় ট্রিগার হতে পারে। Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
jeffreyweir

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

যদি কেউ ভিবিএ এড়াতে চান এবং পরীক্ষা করতে চান যে কোনও কার্যপত্রকটি কোনও কোষ সূত্রে বিশুদ্ধভাবে উপস্থিত রয়েছে, তবে এটি 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
দুর্দান্ত ফাংশন! এটি কেবল দ্রুত নয়, এটি সর্বাধিক সংক্ষিপ্তও।
ক্রিসবি

আমি এই উত্তরটি প্রকাশ করি যা প্রশ্নের সাথে সবচেয়ে বেশি
মিল রয়েছে

আমার এটা ভাল লেগেছে. মনে রাখবেন যে এটি শীটএক্সজিস্টের বুলিয়ান ফাংশন হওয়ার কারণে শিটএক্সজিস্টের জন্য ডিফল্ট মানটি মিথ্যা হবে on অ্যাসাইনমেন্ট স্টেটমেন্টটি শীটএক্সজিস্টকে আসলে একটি মিথ্যা মান নির্ধারণ করে না যদি শীটটি বিদ্যমান না থাকে তবে এটি কেবল ত্রুটিযুক্ত হয়ে যায় এবং ডিফল্ট মানটি জায়গায় রেখে দেয়। আপনি যদি চান, আপনি এই সত্যের উপর নির্ভর করতে পারেন যে কোনও বুলিয়ান ভেরিয়েবলের জন্য নির্ধারিত কোনও অ-শূন্য মান একটি সত্য ফলাফল দেবে এবং> 0 তুলনাটি ছেড়ে দেবে: sheetExist = ActiveWorkbook.Sheets(sSheet).Index
অডাকর্ন

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)")

শিটের অস্তিত্ব না থাকলে সত্য প্রদান করে; শিট না থাকলে মিথ্যা। আপনি "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

আমি এটি করার একটি সহজ উপায় নিয়ে হাজির হয়েছি, তবে আমি এটির জন্য একটি নতুন উপ তৈরি করিনি। পরিবর্তে, আমি যে সাবটিতে কাজ করছি তার মধ্যে আমি কেবল "একটি চেক চালিয়েছি"। আমরা যে পত্রকের নাম খুঁজছি তা ধরে নেওয়া হচ্ছে "শীট_এক্সজিস্ট" এবং যদি পাওয়া যায় তবে আমরা এটি সক্রিয় করতে চাই:

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

এই উত্তরের সমস্যাটি হ'ল শীটটি বাস্তবে বিদ্যমান ছিল তা নির্ধারণের পরে, এটি মোছা হয়ে গেছে এবং তাই আর বিদ্যমান নেই। যদি এটি কোনও ফাংশন হিসাবে লেখা হয় তবে এটির শিটএকজিস্টএফটারডিলিশনের মতো একটি নাম থাকতে পারে এবং সর্বদা FALSE ফিরবে।
ক্রিসবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.