Condition dans une macro???

bertrand19

XLDnaute Nouveau
Bonjour à tous,

Le problème est comment faire continuer la macro si une feuille n'existe plus???

Je m'explique:

J'ai un document excel avec 10 pages
La première page est celle qui stocke les informations.

Ma macro fait des copier/coller
de la page 1 sur les pages 2 à 10.

Mon problème est comment faire pour que la macro continu si une des pages a été effacée entre temps.

Autrement dit, comment je peux dire à la macro:
'si la feuille 2 existe, fait l'application concernant la feuille 2, si elle n'existe pas, passe à l'application de la feuille 3'


Si quelqu'un à une idée???
J'ai essayé avec 'Do ... Loop' mais ca n'a pas été très concluant!!!!
 

coco_lapin

XLDnaute Impliqué
Bonjour Bertrand19 et Pascal76.

Une solution est de détecter si l'onglet existe.

Regarde ce code qui te servira d'exemple.

Code:
Sub detection_onglet()
For i = 1 To Worksheets.Count
  fhfh = Worksheets(i).Name
  If Worksheets(i).Name = 'Feuil1' Then
    MsgBox Worksheets(i).Name
    Else
    MsgBox 'C'est pas la feuille 1'
  End If
Next i
End Sub
 

bertrand19

XLDnaute Nouveau
Je comprends à peu près ce que tu as écrit (on peut dire que je suis un débutant expérimenté, mais quand même débutant)

Le 'hic', c'est que mes feuilles ne sont pas des variables numériques mais des noms... comment je peux faire???

je te donne un exemple de ma macro:

Selection.AutoFilter Field:=1, Criteria1:='>=60000000', Operator:=xlAnd, _
Criteria2:='=20000000', Operator:=xlAnd, _
Criteria2:='<=22999999'
Range('A5:B5').Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets('feuille verte').Select
Range('D57').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Sheets('BG').Select
Range('C5').Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets('feuille marron').Select
Range('K57').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False



Merci
 

coco_lapin

XLDnaute Impliqué
Avant de selectionner un onglet tu dois vérifier si celui existe donc tu boucles sur tous les onglets du classeur.

Tu as écris:
'Le \\'hic\\', c'est que mes feuilles ne sont pas des variables numériques mais des noms... '

Moi aussi ce sont des noms.

Le code Worksheets.Count te renvoie le nombre d'onglet du classeur.

La méthode de Pascal76 est une variante dans le bouclage, il utilise each ce qui marche aussi.

Aller, bon courage.
 

bertrand19

XLDnaute Nouveau
je repris la formule de Pascal 76 mais j'y ai ajouté un '=' entre le .name et le nom de la feuille car la macro n'en voulait pas sinon.

ca me donne donc

if ws.name = 'feuille verte' then


En revanche je voudrais être sûre de comprendre:

-le 'end if' est là pour marquer la fin du 1er 'if'
-le 'next ws' indique que l'on passe à une autre feuille

ce qui veut dire que mon code sera écrit de la manière suivante:

if ws.name = 'feuille verte' then
mon code...
end if

next ws
if ws.name = 'feuille jaune' then
mon code...
end if
 

PascalXLD

XLDnaute Barbatruc
Modérateur
re

Non

En fait le but du test etait de supprimé le cas de ta feuille qui te sert de modele

donc c'etait
if ws.name (signe different) 'nom feuille modele' then

après le tout est de savoir si c'est le même code pour chaque feuille

si oui il suffit juste de remplacer

sheets('Feuille verte') par ws

Si non il va falloir adapter
 

bertrand19

XLDnaute Nouveau
Je te montre ma macro...

En fait, il se peut que ma feuille 'A2-200 Amort' n'existe plus au moment ou l'un de mes collègues va faire la macro.
Donc, si tel est le cas, il faut que la Macro passe directement à 'A2-300 en cours'

j'ai mis en rouge les instructions que tu m'as recommandé

dim ws as worksheet

for each ws in worksheets
if ws.name = 'A2-200 amort' then



Sheets('A2-200 Amort').Select
Range('F50:K51').Select
Selection.Copy
Sheets('exp').Select
Range('B5').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

end if
next ws

if ws.name = 'A2-300 amort' then


Sheets('A2-300 en cours').Select
Range('B14:J45').Select
Selection.Copy
Sheets('exp').Select
Range('B10').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

end if
next ws

if ws.name = 'A3-100 prêt' then




Sheets('A3-100 prêt').Select
Range('B13:J43').Select
Selection.Copy
Sheets('exp').Select
Range('B47').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End if

End sub
 

bertrand19

XLDnaute Nouveau
Alors, ca à l'air de fonctionner à un détail près, c'est que ma macro ne veut plus s'arrêter?????

Voyez vous pourquoi?
J'ai le sentiment que mon 'next ws' le fait repartir au début et donc il ne lit plus le 'End Sub'
En revanche, si je ne mets pas mon 'next ws' on m'explique que j'ai un 'for' sans 'next'

Ci-joint la dernière version de macro:

Dim ws As Worksheet

For Each ws In Worksheets
If ws.Name = 'A2-200 amort' Then


Sheets('A2-200 Amort').Select
Range('F50:K51').Select
Selection.Copy
Sheets('exp').Select
Range('B5').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End If


If ws.Name = 'A2-300 amort' Then

Sheets('A2-300 en cours').Select
Range('B14:J45').Select
Selection.Copy
Sheets('exp').Select
Range('B10').Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End If



Next WS

End Sub