Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3036 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [RESOLU] [VBA] Test d'existence d'une feuille

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] [VBA] Test d'existence d'une feuille

n°2223884
Laebruhtra
Posté le 02-04-2014 à 15:33:54  profilanswer
 

Bonjour,  
 
[RESOLU]
 
Je fais des macros depuis quelques temps déjà, mais je suis actuellement face à un problème très problématique  [:poutrella]  
 
En gros, je veux tester si une feuille existe dans mon classeur de macro, et si oui, alors dans ce cas, je copie une autre feuille de ce classeur après une certaine feuille d'un autre classeur.
Si elle n'existe pas, je copie la feuille à la fin de cet autre classeur.
 
Je vous met le bout de code correspondant :
 

Code :
  1. Dim WS As Worksheet
  2.     On Error Resume Next
  3.     Set WS = ThisWorkbook.Worksheets("FAA " & ActiveSheet.Range("T4" ) & " - " & ActiveSheet.Range("S4" ))
  4.     On Error GoTo 0
  5.     If Not WS Is Nothing Then
  6.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets("FAA " & ActiveSheet.Range("T4" ) & " - " & ActiveSheet.Range("S4" ))
  7.     Else: ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets(Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets.Count)
  8.     End If
  9.     ActiveWorkbook.Save


 
La ligne d'erreur est en rouge.
Vous remarquerez surement que WS se trouve dans le workbook de la macro, tandis que je souhaite copier dans un autre workbook, mais ce n'est pas bloquant étant donné que WS a déjà été copié dans l'autre workbook.
 
Pour expliquer l'erreur, dans le cas où la feuille existe (80% des cas), alors pas de soucis, le premier choix marche et la macro continue.
Dans le cas où la feuille n'existe pas, la macro me donne une erreur 9, l'indice ne se trouve pas dans la sélection, en surlignant la ligne en rouge. Or ce que je ne comprends pas, c'est que si elle n'existe pas (ce qui est vrai pour ce cas), alors la macro devrai sauter au Else non ? Le Else qui lui ne pose pas d'erreur.
 
Merci d'avance


Message édité par Laebruhtra le 03-04-2014 à 10:59:30

---------------
Mon topal ACH/VDS
mood
Publicité
Posté le 02-04-2014 à 15:33:54  profilanswer
 

n°2223914
Marc L
Posté le 02-04-2014 à 17:07:42  profilanswer
 

 
           Bonjour,
 
           si vraiment sûr du bien-fondé de la ligne en rouge,
           j'ai lu dans une notice Microsoft que la copie d'une feuille de calculs pouvait déclencher une erreur !
 
           Il faudrait essayer d'enregistrer le classeur après chaque copie.
           Sinon ne pas utiliser cette méthode, créer d'abord une nouvelle feuille puis y copier les données …
 

n°2223920
Laebruhtra
Posté le 02-04-2014 à 17:32:08  profilanswer
 

Bonjour et merci pour le retour rapide.
 
Je suis en effet sûr de la partie en rouge, puisqu'elle fonctionne parfaitement quand la condition est respectée.
Je suis aussi sur de la partie après le Else, puisque la version de la macro que j'utilise actuellement est basé uniquement sur cette partie et ça fonctionne comme prévu.
L'avantage de faire cette nouvelle manip est d'avoir les feuilles organisées comme je le souhaite dans le nouveau classeur (puisque comme vous vous en doutez, c'est au milieu d'une boucle qui va créer puis copier comme ça une grosse 150aine de feuilles dans 8 classeurs différents.
Donc quand toutes les feuilles sont mis les uns à la suite des autres, c'est déjà bien, parce qu'elles sont dans un même classeur, mais faut encore s'y retrouver dans les 30  [:cheesecake]  
 
La problématique sera donc la même si je passe par la création d'une feuille pour copier les données. Cette nouvelle feuille ne sera pas organisée comme je le souhaite.
 
Je vais continuer à chercher d'autres solutions.
 
EDIT :  
Une solution serai de passer par le gestionnaire d'erreur, avec quelquechose comme ceci :
 

Code :
  1. On Error GoTo ErrorHandler
  2. ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets("FAA " & ActiveSheet.Range("T4" ) & " - " & ActiveSheet.Range("S4" ))
  3. ActiveWorkbook.Save
  4. On Error GoTo 0


 
Suivi à la fin de :
 

Code :
  1. ErrorHandler:
  2. ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets(Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets.Count)
  3. ActiveWorkbook.Save
  4. Resume Next


 
Ca marche bien  [:alyssa -] mais ce n'est que le début de la difficultée !
 
En effet, par la suite, je me retrouve dans la même situation, mais avec 1 possibilité supplémentaire :  
Je m'explique :  
Ici j'ai fait : Soit je copie ma feuille à tel endroit, soit je la copie à la fin.
Maintenant je veux : Soit je copie ma feuille à tel endroit, soit je la copie à tel autre, soit à la fin.
 
Or, puisque j'ai réussi à m'en sortir via le gestionnaire d'erreur pour le début, j'aimerai le faire pour la suite, en incluant une seconde gestion d'erreur, au sein de la première gestion d'erreur, ce qui permettrai :
Si le premier choix marche, ok, sinon erreur et donc second choix. Si le second choix marche, ok, sinon erreur et dernier choix.
 
Donc ma question est de savoir s'il est possible d'inclure une gestion d'erreur au sein d'une autre ?
 
Merci d'avance, et désolé pour la colle !

Message cité 1 fois
Message édité par Laebruhtra le 02-04-2014 à 17:41:42

---------------
Mon topal ACH/VDS
n°2223982
Marc L
Posté le 03-04-2014 à 09:41:52  profilanswer
 

 
           Voici une fonction pour vérifier l'existence d'un classeur et d'une feuille :
 

Code :
  1. Function ExistWorkbookSheet(CLASSEUR, FEUILLE) As Boolean
  2.                           V = Evaluate("ISREF('[" & CLASSEUR & "]" & FEUILLE & "'!A1)" )
  3.          ExistWorkbookSheet = IIf(IsError(V), False, V)
  4. End Function

 

n°2223983
Laebruhtra
Posté le 03-04-2014 à 09:43:06  profilanswer
 

Laebruhtra a écrit :


Or, puisque j'ai réussi à m'en sortir via le gestionnaire d'erreur pour le début, j'aimerai le faire pour la suite, en incluant une seconde gestion d'erreur, au sein de la première gestion d'erreur, ce qui permettrai :
Si le premier choix marche, ok, sinon erreur et donc second choix. Si le second choix marche, ok, sinon erreur et dernier choix.
 
Donc ma question est de savoir s'il est possible d'inclure une gestion d'erreur au sein d'une autre ?


 
Un exemple de ce que j'ai essayé, mais qui ne fonctionne pas en l'espèce:
 

Code :
  1. On Error GoTo ErrorHandler1
  2. ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FB " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  3. ActiveWorkbook.Save
  4. On Error GoTo 0


 
Suivi à la fin de la macro de :
 

Code :
  1. ErrorHandler1:
  2. On Error GoTo 0
  3. On Error GoTo ErrorHandler3
  4. ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FAA " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  5. ActiveWorkbook.Save
  6. On Error Resume Next
  7. Resume Next
  8. ErrorHandler3:
  9. ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets(Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets.Count)
  10. ActiveWorkbook.Save
  11. Resume Next


 
 [:huit]


---------------
Mon topal ACH/VDS
n°2223987
Marc L
Posté le 03-04-2014 à 09:53:12  profilanswer
 

 
           J'ai retrouvé l'article en anglais de Microsoft mais cela correspond à un autre message d'erreur …
 
           Donc soit c'est un souci pas répertorié soit cela vient du code (dont j'ai du mal à visualiser clairement le but) …
 
           Et avec ma fonction ?
 


---------------
                Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !                             Liste des accus FAD !
n°2223990
Laebruhtra
Posté le 03-04-2014 à 10:00:59  profilanswer
 

Je suis en train d'essayer avec la fonction, ça peut en effet être une solution.
 
Le but du code est de, à partir de 4 classeurs distincts de chacun plusieurs milliers de lignes, condenser ces 4 tableaux en 4 TCD, puis à partir de ces TCD de les "éclater" (showdetails) en onglets suivant certains critères inclus dans les tableaux de base, et ensuite de réorganiser tous ces onglets issus des 4 TCD en créants plusieurs fichiers.
 
Je peux upload le fichier si ça t'intéresse.


---------------
Mon topal ACH/VDS
n°2224004
Laebruhtra
Posté le 03-04-2014 à 10:58:15  profilanswer
 

Rebonjour !
C'est résolu avec une fonction !
 
Je t'avoue que je ne comprenais pas tout dans la tienne, donc je m'en suis fait une à ma sauce, mais dans tout les cas, tu m'as donné l'idée, donc merci beaucoup !
 
Je donne les parties du code correspondantes :
 
La fonction :

Code :
  1. Function WsExist(Nom$) As Boolean
  2. On Error Resume Next
  3. WsExist = Sheets(Nom).Index
  4. End Function


 
Et les différents tests :
 

Code :
  1. If WsExist("FAA " & ActiveSheet.Range("T4" ) & " - " & ActiveSheet.Range("S4" )) = True Then
  2.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets("FAA " & ActiveSheet.Range("T4" ) & " - " & ActiveSheet.Range("S4" ))
  3.     Else: ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets(Workbooks("Apurements - " & ActiveSheet.Range("T4" ) & ".xlsx" ).Sheets.Count)
  4.     End If
  5.     ActiveWorkbook.Save


 

Code :
  1. If WsExist("FB " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" )) = True Then
  2.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FB " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  3. ElseIf WsExist("FAA " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" )) = True Then
  4.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FAA " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  5. Else: ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets(Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets.Count)
  6. End If
  7. ActiveWorkbook.Save


 

Code :
  1. If WsExist("FNP " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" )) = True Then
  2.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FNP " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  3. ElseIf WsExist("FB " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" )) = True Then
  4.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FB " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  5. ElseIf WsExist("FAA " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" )) = True Then
  6.     ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets("FAA " & ActiveSheet.Range("O4" ) & " - " & ActiveSheet.Range("N4" ))
  7. Else: ActiveSheet.Copy After:=Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets(Workbooks("Apurements - " & ActiveSheet.Range("O4" ) & ".xlsx" ).Sheets.Count)
  8. End If
  9. ActiveWorkbook.Save


 
Tout ça marche au poil, merci encore pour le coup de main, je met en résolu !
 
 
 
 
 
 
 
 


---------------
Mon topal ACH/VDS

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [RESOLU] [VBA] Test d'existence d'une feuille

 

Sujets relatifs
[VBA] Fermer une fenêtre excel ouverte dans IE[Problème Maro Vba ] Exporter une colonne en fichier Texte.
Aide Programmation VBA avec MSP[VBA] Problème actualisation des données
VBA excel - Importation de .csv dans une feuille unique xlsTest rendus sous toutes versions IE + javascript
Module/ UserForm/ Excel VBA[VBA] Donner une valeur numérique à une chaine de caractère
cherche numero collissimo pour test 
Plus de sujets relatifs à : [RESOLU] [VBA] Test d'existence d'une feuille


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR