web-dev-qa-db-fra.com

Excel VBA si feuille de calcul ("wsName") existe

Je me demande s'il existe une fonctionnalité de coupe nette qui renvoie Vrai ou Faux si une feuille de calcul à l'intérieur d'un classeur existe?

Ce serait bien, mais pas essentiel, s'il est possible de le faire sans sauter la gestion des erreurs.

La seule chose que j'ai trouvée ne fonctionne pas vraiment:

On Error Resume Next
If (Worksheets("wsName").Name <> "") Then
    Debug.Print "Worksheet exists!"
Else
    Debug.Print "Worksheet doesn't exist!"
End If
On Error GoTo ErrHandler
36
Matt Rowles

Une version sans traitement d'erreur:

Function sheetExists(sheetToFind As String) As Boolean
    sheetExists = False
    For Each sheet In Worksheets
        If sheetToFind = sheet.name Then
            sheetExists = True
            Exit Function
        End If
    Next sheet
End Function
77
Dante May Code

Il n'y a pas de fonction intégrée pour cela.

Function SheetExists(SheetName As String, Optional wb As Excel.Workbook)
   Dim s As Excel.Worksheet
   If wb Is Nothing Then Set wb = ThisWorkbook
   On Error Resume Next
   Set s = wb.Sheets(SheetName)
   On Error GoTo 0
   SheetExists = Not s Is Nothing
End Function
29
Tim Williams

aussi une version légèrement différente. Je viens de faire une application.sheets.count pour savoir combien de feuilles de travail j'ai en plus. bien et mettre un peu renommer aswell

Sub insertworksheet()
    Dim worksh As Integer
    Dim worksheetexists As Boolean
    worksh = Application.Sheets.Count
    worksheetexists = False
    For x = 1 To worksh
        If Worksheets(x).Name = "ENTERWROKSHEETNAME" Then
            worksheetexists = True
            'Debug.Print worksheetexists
            Exit For
        End If
    Next x
    If worksheetexists = False Then
        Debug.Print "transformed exists"
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = "ENTERNAMEUWANTTHENEWONE"
    End If
End Sub
8
jogrohs

Un autre version de la fonction sans traitement des erreurs. Cette fois, il n’est pas sensible à la casse et un peu plus efficace.

Function WorksheetExists(wsName As String) As Boolean
    Dim ws As Worksheet
    Dim ret As Boolean        
    wsName = UCase(wsName)
    For Each ws In ThisWorkbook.Sheets
        If UCase(ws.Name) = wsName Then
            ret = True
            Exit For
        End If
    Next
    WorksheetExists = ret
End Function
6
Erik K.

Légèrement changé en code de David Murdoch pour la bibliothèque générique

Function HasByName(cSheetName As String, _ 
                   Optional oWorkBook As Excel.Workbook) As Boolean

    HasByName = False
    Dim wb

    If oWorkBook Is Nothing Then
        Set oWorkBook = ThisWorkbook
    End If

    For Each wb In oWorkBook.Worksheets
        If wb.Name = cSheetName Then
            HasByName = True
            Exit Function
        End If
    Next wb
End Function
4
ShamBhagwat