0
votes

Le nom de la feuille existe déjà, comment gérer l'erreur et supprimer la feuille par défaut dans Excel?

La création d'une feuille avec un nom à partir de sheet1 fonctionne très bien. Cependant, si j'exécute à nouveau le code par erreur, cela donne une erreur d'exécution 1004, car le nom de feuille nouvellement créé existe déjà. C'est bien, mais comment puis-je gérer cette erreur et empêcher Excel de créer une feuille par défaut avec un nom aléatoire?

Je veux Excel pour MsgBox me dire qu'il y a un doublon et qu'il ne devrait alors rien faire. Je sais qu'il y a des fils similaires, mais ils n'ont pas répondu à ma question. Merci.

Private Sub CreateSheet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add(After:= _
             Worksheets("Sheet1"))

    Application.DisplayAlerts = False

    ws.Name = Sheets("Sheet1").Range("N1")

    On Error Resume Next

    If (Worksheets("ws.Name").Name <> "") Then

    MsgBox ("name already exists, please delete")

    Else

    ws.Visible = xlSheetVisible

    ThisWorkbook.Sheets("Sheet1").Range("A:AB").Copy
    ThisWorkbook.Sheets(ws.Name).Range("A1").PasteSpecial Paste:=xlPasteValues

    End If

End Sub


1 commentaires

avez-vous besoin du "ws.name" dans "s? vous recherchez une feuille appelée ws.name et non la valeur de ws.name?


4 Réponses :


4
votes

Vous pouvez créer une fonction personnalisée et le tester dans votre code avant d'exécuter le code de création de feuille ...

Sub Test()
    If SheetExists(ThisWorkbook.Name, "Sheet2") Then
        MsgBox "Sheet Exists!"
    Else
        MsgBox "Sheet Doesn't Exist!"
    End If
End Sub


1 commentaires

Merci pour vos efforts. Le vôtre fonctionne bien sûr aussi. J'ai accepté la réponse de Storax, car il a tout codé sans utiliser le CV d'erreur. Rien contre le vôtre, c'est juste que je préfère le sien.



1
votes

Cela devrait fonctionner. Pourquoi ne pas simplement parcourir les feuilles existantes et comparer leurs noms? Si un doublon est trouvé, ne créez simplement pas la nouvelle feuille.

Private Sub CreateSheet()

    Dim ws As Worksheet

    Dim sheet_counter As Integer
    Dim check_duplicates As Boolean

    check_duplicates = False
    Application.DisplayAlerts = False

    WS_Count = ActiveWorkbook.Worksheets.Count


    For sheet_counter = 1 To WS_Count
        If ActiveWorkbook.Worksheets(sheet_counter).Name = Sheets("Sheet1").Range("N1") Then:
            check_duplicates = True
            MsgBox ("Name already exists, Worksheet not created")

    If Not check_duplicates Then:
        Set ws = ThisWorkbook.Sheets.Add(After:=Worksheets("Sheet1"))


    If Not Sheets("Sheet1").Range("N1") = "" Then
        ws.Name = Sheets("Sheet1").Range("N1")


    On Error Resume Next


        ws.Visible = xlSheetVisible

        ThisWorkbook.Sheets("Sheet1").Range("A:AB").Copy
        ThisWorkbook.Sheets(ws.Name).Range("A1").PasteSpecial Paste:=xlPasteValues

    End If

End Sub


1 commentaires

Merci pour vos efforts. Le vôtre fonctionne bien sûr aussi. J'ai accepté la réponse de Storax, car il a tout codé sans utiliser le CV d'erreur. Rien contre le vôtre, c'est juste que je préfère le sien.



2
votes

L'autre façon de vérifier si une feuille existe est une boucle que certaines personnes préfèrent au lieu de On Error ...

Private Sub CreateSheet()
    Dim ws As Worksheet

    'Application.DisplayAlerts = False

    Dim newName As String
    newName = Sheets("Sheet1").Range("N1")

    If sheetExists(newName, ThisWorkbook) Then
        MsgBox ("name already exists, please delete")
    Else
        Set ws = ThisWorkbook.Sheets.Add(After:= _
            Worksheets("Sheet1"))

        ws.Visible = xlSheetVisible
        ws.Name = newName

        ThisWorkbook.Sheets("Sheet1").Range("A:AB").Copy
        ws.Range("A1").PasteSpecial Paste:=xlPasteValues

    End If

End Sub

Ensuite, vous pouvez réécrire votre sous comme ça

 Public Function sheetExists(SheetName As String, Optional wrkBook As Workbook) As Boolean

    If wrkBook Is Nothing Then
        Set wrkBook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate
    End If

    On Error GoTo EH

    sheetExists = False  ' Not really neccessary as this is the default

    Dim sht As Object

    For Each sht In wrkBook.Sheets
        If Ucase(sht.Name) = UCase(SheetName) Then
            sheetExists = True
            Exit For
        End If
    Next sht

    Exit Function

EH:
    sheetExists = False
End Function


1 commentaires

sainte vache, cela fonctionne parfaitement. La belle partie à ce sujet est que vous avez une fonction réutilisable à d'autres fins. Très cool, merci !!



1
votes

Personnellement, je ne suis pas un grand fan des déclarations On Error , bien que cela puisse être légitime ici. Cependant, voici une autre idée, ajustez-vous à vos besoins:

Dim nom As String: nom = "Sheet1"

If VarType(Evaluate(Replace("?!A1", "?", nom))) <> vbError Then
    'Sheet exists
Else
    'Sheet does not exists
End If

Remarque: Cela fonctionnerait si la cellule évaluée ne contient pas d'erreur elle-même. Alors peut-être choisissez une cellule dont vous savez qu'elle n'a pas de formule.


1 commentaires

Merci pour vos efforts et vos contributions.