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
Fondamentalement, je parcoure toutes les feuilles du classeur Origin, puis assigne destsheet
dans le classeur de destination à la feuille portant le même nom que celui actuellement itéré dans le classeur Origin.
Comment puis-je tester si cette feuille existe? Quelque chose comme:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Certaines personnes n'apprécient pas cette approche en raison d'une utilisation "inappropriée" du traitement des erreurs, mais je pense que cela est considéré comme acceptable dans VBA ... Une approche alternative consiste à boucler toutes les feuilles jusqu'à ce que vous trouviez une correspondance.
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
Si vous êtes spécifiquement intéressé par les feuilles de calcul uniquement, vous pouvez utiliser un simple appel d'évaluation:
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
Pour ce faire, vous n'avez pas besoin du traitement des erreurs. Tout ce que vous avez à faire est de parcourir toutes les feuilles de travail et de vérifier si le nom spécifié existe:
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
Comme la recherche de membres d'une collection est un problème général, voici une version abstraite de la réponse de Tim:
La fonction Contient (objCollection As Object, strName as String) As Boolean Dim o comme objet On Error Resume Next définir o = objCollection (strName) Contient = (Err.Number = 0) Err.Clear Fonction de fin
Cette fonction peut être utilisée avec n’importe quelle collection comme objet (Shapes
, Range
, Names
, Workbooks
, etc.).
Pour vérifier l'existence d'une feuille, utilisez If Contains(Sheets, "SheetName") ...
Corrigé: Sans traitement des erreurs:
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
Ma solution ressemble beaucoup à celle de Tims mais fonctionne également dans le cas de feuilles non fonctionnelles - graphiques
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
.
J'ai écrit celui-ci:
Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
Si vous êtes un fan de WorksheetFunction.
ou si vous travaillez dans un pays non anglais avec un Excel non anglais, voici une bonne solution:
WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))
Ou dans une fonction comme celle-ci:
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function
Plusieurs années de retard, mais j’avais juste besoin de faire cela et je n’aimais aucune des solutions publiées ... Alors j’en invente une, tout cela grâce à la magie de (geste des mains de SpongeBob Rainbow) "Évaluer ()"!
Evaluate("IsError(" & vSheetName & "!1:1)")
Renvoie VRAI si la feuille n'existe pas. FALSE si la feuille EXISTE . Vous pouvez remplacer la plage "1: 1" à votre guise, mais je vous déconseille d'utiliser une seule cellule, car si elle contient une erreur (par exemple, # N/A), elle retournera Vrai.
Mettez le test dans une fonction et vous pourrez le réutiliser et vous aurez une meilleure lisibilité du code.
N'utilisez PAS le message "On Error Resume Next", car cela pourrait entrer en conflit avec une autre partie de votre code.
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
Pourquoi ne pas simplement utiliser une petite boucle pour déterminer si la feuille de calcul nommée existe? Indiquez si vous recherchez une feuille de calcul nommée "Sheet1" dans le classeur actuellement ouvert.
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
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
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
J'ai fait autre chose: supprimer une feuille uniquement si elle existe - ne pas obtenir d'erreur si elle ne le fait pas:
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
Remplacez "Données" par le nom de la feuille que vous testez ...
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
wsExists
compacte (sans confiance dans le traitement des erreurs!)Voici une fonction courte et simple qui ne repose pas sur la gestion des erreurs pour déterminer si une feuille de calcul existe (et _ est correctement déclaré pour fonctionner dans toute situation!)
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
L'exemple suivant ajoute une nouvelle feuille de calcul nommée myNewSheet
, si elle n'existe pas déjà:
If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"
Sans aucun doute que la fonction ci-dessus peut fonctionner, je viens de finir avec le code suivant qui fonctionne plutôt bien:
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
Remarque: Sheets_Name
est l'endroit où je demande à l'utilisateur de saisir le nom, ce qui pourrait ne pas être identique pour vous.
Je sais que c'est un ancien post, mais voici une autre solution simple et rapide.
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
Je suis venu avec un moyen facile de le faire, mais je n'ai pas créé de nouveau sous-marin pour cela. Au lieu de cela, je viens juste de "faire un chèque" dans le sous-dossier sur lequel je travaillais. En supposant que le nom de la feuille que nous recherchons soit "Sheet_Exist", nous voulons simplement l'activer s'il est trouvé:
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
J'ai aussi ajouté un pop-up pour quand la feuille n'existe pas.