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
4 Réponses :
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
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.
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
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.
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
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 !!
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.
Merci pour vos efforts et vos contributions.
avez-vous besoin du "ws.name" dans "s? vous recherchez une feuille appelée ws.name et non la valeur de ws.name?