procyom
Messages postés3Date d'inscriptionvendredi 18 avril 2008StatutMembreDernière intervention 5 mai 2008
-
5 mai 2008 à 10:10
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 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.
procyom
Messages postés3Date d'inscriptionvendredi 18 avril 2008StatutMembreDerniè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.
procyom
Messages postés3Date d'inscriptionvendredi 18 avril 2008StatutMembreDerniè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.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 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