Boucle/ignorer 1 itération

procyom Messages postés 3 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 5 mai 2008 - 5 mai 2008 à 10:10
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 6 mai 2008 à 03:15
Je
rencontre un problème récurent dans tous mes programmes en VBA sur excel :





Comment
ignorer une itération  de la boucle et
passer à la suivante lorsqu’une condition n’est pas réalisée. Je travaille sur
Excel 2003 et n’ai pas le recours à la nouvelle fonction 2005 qui permet de
pallier à cet inconvénient (« For…continue »).

Dans mon
exemple, je crée des feuilles nommées en fonction d’une liste de noms disponibles
dans une série de cellule (« A1 :A6 ») de la feuille « feuil8 ».





Voici le
code :






Sub ad()







Feuil8.Select







For Each C In Range("A1:A6")







Worksheets.Add







ActiveSheet.Name = C.Value







Next C







End Sub







 






Problème
quand une cellule est vide ou que, surtout, une feuille du même nom existe la
procédure est irrémédiablement interrompue par un message erreur. J’ai donc
essayé de recourir à la gestion d’erreur « On Error Resume Next » :







 



Sub ad()







Feuil8.Select







For Each C In Range("A1:A6")







Worksheets.Add







On Error Resume Next







ActiveSheet.Name = C.Value







On Error GoTo 0







Next C







End Sub






Résultat :
le programme ignore bien chaque message erreur si une feuille porte déjà le même
nom, par contre, normal, crée néanmoins des feuilles par défaut (Feuil1, Feuil2…)
à chaque erreur( et pour chaque itération de la boucle). Cela provient
probablement du fait que la gestion d’erreur est placée après « Worksheets.Add ».






Problème :

je n’arrive pas à utiliser la
gestion d’erreur pour obtenir le résultat escompté : créer une feuille uniquement si son nom n’existe pas dans le classeur.





Il est fort
possible que la méthode que j’emploie actuellement ne soit pas la plus adaptée
pour y parvenir.





D’avance je
remercie celles ou ceux qui pourront m’apporter leur aide précieuse.

7 réponses

cs_Exploreur Messages postés 4822 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 14
5 mai 2008 à 10:18
Salut,

Je dirais de vérifier le contenu de ta cellule avant de faire l'ajout, avec par exemple : VbNullString ou  tout simplement ""

Enfin je crois....

A+
Exploreur

 Linux a un noyau, Windows un pépin
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
5 mai 2008 à 11:32
Pas mieux qu'Exploreur :

Sub ad()<?XML:NAMESPACE PREFIX = O /??>

Feuil8.Select

For Each C In Range("A1:A6")

   if C.value <> "" then
      Worksheets.Add
      ActiveSheet.Name = C.Value
   end if

Next C

End Sub

Molenn
0
procyom Messages postés 3 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 5 mai 2008
5 mai 2008 à 13:05
Bonjour,
Merci pour vos réponses.

En fait la partie qui m'intéresse le plus  n'est pas le test de la cellule vide mais plutôt celui de la feuille déjà nommée. J'ai une série de cellules toutes remplies de valeurs. Mon code doit pouvoir les parcourir toutes et créer pour chacune  une feuille correpondante portant le même nom ( la même valeur ). Si cette feuille existe déjà il doit ignorer la cellule corespondante et passer à la prochaine.

D'avance merci pour votre aide.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2008 à 13:06
Salut,

Quel est le rapport avec VB.NET ????

Je déplace vers le forum approprié !
______________________________________
DarK Sidious
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
procyom Messages postés 3 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 5 mai 2008
5 mai 2008 à 15:17
Bonjour,

Merci pour votre coutoisie,

Pour un "modérateur" c'est le comble de la modération.
Au fait, le titre du forum est " [infomsg.aspx Thèmes] / [infomsgf_VISUAL-BASIC_1.aspx Visual Basic 6] / [infomsgt_LANGAGES-DERIVES_287.aspx Langages dérivés] / [infomsgt_VBA_244.aspx VBA] /"
Je ne suis pas l'auteur des catégories définies par ce site, et vous ?
Mais puisque vous avez l'air d'y connaître quelque chose, pourquoi ne suggérez-vous pas une solution.
Il est vrai qu'apporter une pierre à l'édifice est plus difficile que de le détruire.

Cdt,
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2008 à 18:57
Salut,

Oui, j'ai déplacé ton sujet, donc c'est normal qu'il soit dans le bon forum maintenant, mais tout à l'heure, il était dans le forum VB.NET, langage qui n'a rien à voir avec VBA !

Sinon concernant ma courtoisie, je vois pas en quoi tu as à te plaindre... il me semble être resté courtois !
______________________________________
DarK Sidious
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 22
6 mai 2008 à 03:15
Salut procyon,

Fais attention à la manière dont tu traites les gens de ce site... Prend le temps de regarder le nombre de message que Dark Sidious a postés, prend le temps de regarder le nombre de sources qu'il a mises à disposition sur ce site... Imagine le nombre d'heures bénévoles...

Pour ton problème, j'irais avec une Function booléenne pour savoir si la feuille existe ou non.

Quelque chose comme
Function DoesExist(Feuille as String) As Boolean
    Dim Ws As Worksheet

    For each Ws In worksheets
       If Ws.Name = Feuille then
          DoesExist = True
          Exit function
       End If
    Next
End Function

Donc, dans ta procédure, avant de créer la feuille, tu mets quelque chose comme
    If C.Value <> "" And Not DoesExist(C.Value) Then
       Worksheets.Add
       '...
    Else
       'là tu fais ce que tu dois faire...
    End If

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Rejoignez-nous