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 boucle sur toutes les feuilles du classeur d'origine puis définissez destsheet
dans le classeur de destination la feuille portant le même nom que celui actuellement itéré dans le classeur d'origine.
Comment puis-je tester si cette feuille existe? Quelque chose comme:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Réponses:
Certaines personnes n'aiment pas cette approche en raison d'une utilisation "inappropriée" de la gestion des erreurs, mais je pense qu'elle est considérée comme acceptable dans VBA ... Une autre approche consiste à parcourir toutes les feuilles jusqu'à ce que vous trouviez une correspondance.
la source
ActiveWorkbook
place deThisWorkbook
. Ce dernier fait référence au classeur qui contient le code de macro, qui peut être différent du classeur que l'on souhaite tester. Je suppose que ceActiveWorkbook
serait utile dans la plupart des cas (les situations artificielles sont toujours disponibles, cependant).sht Is Nothing
seraTrue
s'il n'y a pas de feuille avec ce nom, mais nous voulons revenirTrue
s'il est une feuille avec ce nom, d' où le non. C'est un peu plus facile (mais pas valide) si vous réorganisez un peu pourSheetExists = sht Is Not Nothing
If wb Is Nothing Then Set wb = ThisWorkbook
àIf wb Is Nothing Then Set wb = ActiveWorkbook
Si vous êtes spécifiquement intéressé par les feuilles de calcul uniquement, vous pouvez utiliser un simple appel Evaluate:
la source
Vous n'avez pas besoin de gestion des erreurs pour ce faire. Tout ce que vous avez à faire est de parcourir toutes les feuilles de calcul et de vérifier si le nom spécifié existe:
la source
La vérification des membres d'une collection étant un problème général, voici une version abstraite de la réponse de Tim:
Cette fonction peut être utilisée avec toute collection comme objet (
Shapes
,Range
,Names
,Workbooks
, etc.).Pour vérifier l'existence d'une feuille, utilisez
If Contains(Sheets, "SheetName") ...
la source
Set
mot clé. J'ai trouvé que plutôt que d'utiliserSet
, demanderTypeName
le membre de la collection fonctionne pour tous les cas, c'estTypeName objCollection(strName)
Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
Corrigé: sans gestion des erreurs:
la source
Au cas où quelqu'un voudrait éviter VBA et tester si une feuille de calcul existe uniquement dans une formule de cellule, il est possible d'utiliser les fonctions
ISREF
etINDIRECT
:=ISREF(INDIRECT("SheetName!A1"))
Cela reviendra
TRUE
si le classeur contient une feuille appeléeSheetName
etFALSE
autrement.la source
J'ai écrit celui-ci:
la source
sheetExist = ActiveWorkbook.Sheets(sSheet).Index
Ma solution ressemble beaucoup à Tims mais fonctionne également en cas de feuilles sans feuille de calcul - graphiques
.
la source
Mettez le test dans une fonction et vous pourrez le réutiliser et vous aurez une meilleure lisibilité du code.
N'utilisez PAS le "On Error Resume Next" car il peut entrer en conflit avec une autre partie de votre code.
la source
Plusieurs années de retard, mais j'avais juste besoin de le faire et je n'ai aimé aucune des solutions affichées ... Alors j'en ai inventé une, tout cela grâce à la magie du (geste des mains arc-en-ciel de SpongeBob) "Evaluate ()"!
Renvoie TRUE si la feuille n'existe PAS; FALSE si la feuille existe. Vous pouvez remplacer la plage de votre choix pour "1: 1", mais je déconseille d'utiliser une seule cellule, car si elle contient une erreur (par exemple, # N / A), elle retournera True.
la source
wsExists
Fonction compacte ( sans dépendre de la gestion 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ée pour fonctionner dans n'importe quelle situation!)
Exemple d'utilisation:
L'exemple suivant ajoute une nouvelle feuille de calcul nommée
myNewSheet
, si elle n'existe pas déjà:Plus d'information:
For Each
…Next
Déclaration (VBA)Exit
déclaration (VBA)la source
Pourquoi ne pas simplement utiliser une petite boucle pour déterminer si la feuille de calcul nommée existe? Dites si vous recherchez une feuille de calcul nommée «Sheet1» dans le classeur actuellement ouvert.
la source
Si vous êtes fan de
WorksheetFunction.
ou que vous travaillez dans un pays non anglais avec un Excel non anglais, c'est une bonne solution, qui fonctionne:Ou dans une fonction comme celle-ci:
la source
la source
la source
Remplacez "Données" par le nom de la feuille que vous testez ...
la source
Sans aucun doute que la fonction ci-dessus peut fonctionner, je viens de me retrouver avec le code suivant qui fonctionne plutôt bien:
Remarque:
Sheets_Name
c'est là que je demande à l'utilisateur de saisir le nom, donc ce n'est peut-être pas la même chose pour vous.la source
J'ai fait autre chose: supprimer une feuille uniquement si elle existe - ne pas avoir d'erreur si ce n'est pas le cas:
la source
J'ai trouvé un moyen simple de le faire, mais je n'ai pas créé de nouveau sous-marin pour cela. Au lieu de cela, j'ai juste "fait une vérification" dans le sous-marin sur lequel je travaillais. En supposant que le nom de la feuille que nous recherchons est "Sheet_Exist" et que nous voulons simplement l'activer s'il est trouvé:
J'ai également ajouté une fenêtre contextuelle lorsque la feuille n'existe pas.
la source
Je sais que c'est un ancien post, mais voici une autre solution simple et rapide.
la source
Court et propre:
la source
En fait, j'avais un moyen simple de vérifier si la feuille existe, puis d'exécuter une instruction:
Dans mon cas, je voulais supprimer la feuille puis recréer la même feuille avec le même nom mais le code a été interrompu si le programme n'était pas en mesure de supprimer la feuille car elle était déjà supprimée
la source