Provoquer une erreur après l'ouverture d'un fichier si la condition pas respectée

shenmicke

XLDnaute Junior
Voici la macro qu'une personne a réalisé sur le forum.

Code:
Sub Macro1()
Dim chem As String 'déclare la variable chem (CHEMin d accès)
Dim fs, d, f1, fd 'déclare les variables fs, d, f1 et fd
Dim cel As Range 'déclare la variable cel (CELlule)
Dim cl As Workbook 'déclare la varaible cl (CLasseur)
Dim t As Double 'déclare la variable t (Total)
 
'***********************
'ouverture des classeurs
'***********************
chem = ThisWorkbook.Path & "\" 'définit le chemin, ici c'est le dossier courant
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (Fichiers Système)
Set d = fs.GetFolder(chem) 'definit la variable d (dossier)
Set fd = d.Files 'définit la variable fd (Fichiers du Dossier)
For Each f1 In fd 'boucle sur tous les fichier du dossier
    If f1.Name <> "Carita - TOTAL.xls" Then Workbooks.Open chem & f1.Name 'ouvre le fichier
Next f1
 
'*****************
'calcul des totaux
'*****************
For Each cel In ThisWorkbook.Sheets("CARITA 2010 Mkt Plan FORECAST").Range("L10:Q501") 'boucle 1 : sur toutes les cellules cel de la plage L10:Q501 de l'onglet "CARITA 2010 Mkt Plan FORECAST"
   If cel.Interior.ColorIndex = 38 Then 'condition 1 : si le couleur de fond de la cellule est rose
        For Each cl In Workbooks 'boucle 2 : sur tous les classeurs ouverts
            If cl.Name <> ThisWorkbook.Name Then 'condition 2 : si le nom du classseur est différent du nom de celui-ci
                'redéfinit la variable t si la cellule correspondante est numérique
                 If IsNumeric(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address)) Then t = t + CDbl(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address))
            End If 'fin de la condition 2
        Next cl 'prochain classeur de la boucle 2
        cel.Value = t 'place t dans la cellule cel
        t = 0
    End If 'fin de la condition 1
Next cel 'prochaine cellul cel de la boucle 1
 
'***********************
'fermeture des classeurs
'***********************
For Each cl In Workbooks
    If cl.Name <> ThisWorkbook.Name Then cl.Close SaveChanges:=False 'ferme le fichier
Next cl
End Sub

La macro ouvre les fichier du dossier et fait une addition des cellules.
Exemple:
Dans le fichier TOTAL on veut l'addition des autres fichiers c'est à dire que dans le fichier TOTAL la Cellule L10 sera le résultat de l'addition des cellules L10 des autres fichiers du dossier. Celà implique alors que les fichiers soit tous identiques au niveau de leur structure. J'aimerai donc quelque chose pour vérifier ça. En vérifiant que la cellule H10 soit bien égal à la référence (valeur) 3197000 et H501 à 7992607. S'ils ne répondent pas à ces conditions il faudrait arrêter la macro afin de pas fausser le total.

Je pense qu'il faut le faire au niveau :
For Each cel In ThisWorkbook.Sheets("CARITA 2010 Mkt Plan FORECAST").Range("L10:Q501") 'boucle 1 : sur toutes les cellules cel de la plage L10:Q501 de l'onglet "CARITA 2010 Mkt Plan FORECAST"
If cel.Interior.ColorIndex = 38 Then 'condition 1 : si le couleur de fond de la cellule est rose

J'ai tenté de faire quelque chose comme If Cells.Value(10, 8) <> 3197000 Or Cells.Value(501, 8) <> 7992607 Then 'boucle 0
Exit For
End If

J'espère avoir été clair et que vous m'aiderez.

Merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonjour Shenmicke, bonjour le forum,

Toujours au forceps...
Shenmicke à dit:
En vérifiant que la cellule H10 soit bien égal à la référence (valeur) 3197000 et H501 à 7992607. S'ils ne répondent pas à ces conditions il faudrait arrêter la macro afin de pas fausser le total.
de quel onglet ?
Essaie comme ça :
Code:
Sub Macro1()
Dim chem As String 'déclare la variable chem (CHEMin d accès)
Dim fs, d, f1, fd 'déclare les variables fs, d, f1 et fd
Dim cel As Range 'déclare la variable cel (CELlule)
Dim cl As Workbook 'déclare la varaible cl (CLasseur)
Dim t As Double 'déclare la variable t (Total)
 
'***********************
'ouverture des classeurs
'***********************
chem = ThisWorkbook.Path & "\" 'définit le chemin, ici c'est le dossier courant
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (Fichiers Système)
Set d = fs.GetFolder(chem) 'definit la variable d (dossier)
Set fd = d.Files 'définit la variable fd (Fichiers du Dossier)
For Each f1 In fd 'boucle sur tous les fichier du dossier
    If f1.Name <> "Carita - TOTAL.xls" Then Workbooks.Open chem & f1.Name 'ouvre le fichier
Next f1
 
'*****************
'calcul des totaux
'*****************
For Each cel In ThisWorkbook.Sheets("CARITA 2010 Mkt Plan FORECAST").Range("L10:Q501") 'boucle 1 : sur toutes les cellules cel de la plage L10:Q501 de l'onglet "CARITA 2010 Mkt Plan FORECAST"
   If cel.Interior.ColorIndex = 38 Then 'condition 1 : si le couleur de fond de la cellule est rose
        For Each cl In Workbooks 'boucle 2 : sur tous les classeurs ouverts
            If cl.Name <> ThisWorkbook.Name Then 'condition 2 : si le nom du classseur est différent du nom de celui-ci
                If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
                    cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then GoTo suite
                'redéfinit la variable t si la cellule correspondante est numérique
                 If IsNumeric(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address)) Then t = t + CDbl(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address))
            End If 'fin de la condition 2
suite:
        Next cl 'prochain classeur de la boucle 2
        cel.Value = t 'place t dans la cellule cel
        t = 0
    End If 'fin de la condition 1
Next cel 'prochaine cellul cel de la boucle 1
 
'***********************
'fermeture des classeurs
'***********************
For Each cl In Workbooks
    If cl.Name <> ThisWorkbook.Name Then cl.Close SaveChanges:=False 'ferme le fichier
Next cl
End Sub
 

shenmicke

XLDnaute Junior
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonjour Robert,

ahhh, j'ai essayé de détailler un maximum pour éviter les forceps :(
Oui sur cet onglet, y'a t'il possibilité d'arrêter la macro plutôt que d'aller à la suite: si la condition n'est pas remplie ?

par exemple si je fais ceci:

Code:
For Each cel In ThisWorkbook.Sheets("CARITA 2010 Mkt Plan FORECAST").Range("L10:Q501") 'boucle 1 : sur toutes les cellules cel de la plage L10:Q501 de l'onglet "CARITA 2010 Mkt Plan FORECAST"
   If cel.Interior.ColorIndex = 38 Then 'condition 1 : si le couleur de fond de la cellule est rose
        For Each cl In Workbooks 'boucle 2 : sur tous les classeurs ouverts
            If cl.Name <> ThisWorkbook.Name Then 'condition 2 : si le nom du classseur est différent du nom de celui-ci
                If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
                    cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then GoTo suite
                'redéfinit la variable t si la cellule correspondante est numérique
                 If IsNumeric(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address)) Then t = t + CDbl(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address))
            End If 'fin de la condition 2
        Next cl 'prochain classeur de la boucle 2
        cel.Value = t 'place t dans la cellule cel
        t = 0
    End If 'fin de la condition 1
Next cel 'prochaine cellul cel de la boucle 1

suite:
Exit For
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonsoir Shenmicke, bonsoir le forum,

Je crois comprendre... Le code que je t'ai donné passait au classeur suivant alors que toi, tu voudrais passer à la cellule suivante en laissant tomber le total pour cette cellule. Si c'est ça, ton idée est bonne mais pas sa syntaxe car un Exit For doit se trouver à l'intérieur d'une boucle For ... Next. La ligne ci-dessous devrait résoudre le probleme (supprime alors l'étiquette Suite:) :
Code:
If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
                    cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then Exit For

Le code complet pour qu'il n'y ait pas de confusion :
Code:
Sub Macro1()
Dim chem As String 'déclare la variable chem (CHEMin d accès)
Dim fs, d, f1, fd 'déclare les variables fs, d, f1 et fd
Dim cel As Range 'déclare la variable cel (CELlule)
Dim cl As Workbook 'déclare la varaible cl (CLasseur)
Dim t As Double 'déclare la variable t (Total)
 
'***********************
'ouverture des classeurs
'***********************
chem = ThisWorkbook.Path & "\" 'définit le chemin, ici c'est le dossier courant
Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (Fichiers Système)
Set d = fs.GetFolder(chem) 'definit la variable d (dossier)
Set fd = d.Files 'définit la variable fd (Fichiers du Dossier)
For Each f1 In fd 'boucle sur tous les fichier du dossier
    If f1.Name <> "Carita - TOTAL.xls" Then Workbooks.Open chem & f1.Name 'ouvre le fichier
Next f1
 
'*****************
'calcul des totaux
'*****************
For Each cel In ThisWorkbook.Sheets("CARITA 2010 Mkt Plan FORECAST").Range("L10:Q501") 'boucle 1 : sur toutes les cellules cel de la plage L10:Q501 de l'onglet "CARITA 2010 Mkt Plan FORECAST"
   If cel.Interior.ColorIndex = 38 Then 'condition 1 : si le couleur de fond de la cellule est rose
        For Each cl In Workbooks 'boucle 2 : sur tous les classeurs ouverts
            If cl.Name <> ThisWorkbook.Name Then 'condition 2 : si le nom du classseur est différent du nom de celui-ci
                If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
                    cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then Exit For
                'redéfinit la variable t si la cellule correspondante est numérique
                 If IsNumeric(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address)) Then t = t + CDbl(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address))
            End If 'fin de la condition 2
        Next cl 'prochain classeur de la boucle 2
        cel.Value = t 'place t dans la cellule cel
        t = 0
    End If 'fin de la condition 1
Next cel 'prochaine cellul cel de la boucle 1
 
'***********************
'fermeture des classeurs
'***********************
For Each cl In Workbooks
    If cl.Name <> ThisWorkbook.Name Then cl.Close SaveChanges:=False 'ferme le fichier
Next cl
End Sub

Une question Shenmicke ! Ça serait pas plus facile avec des formules ?
 

shenmicke

XLDnaute Junior
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonsoir Robert,
je testerai demain matin.
Soit mon supérieur optera pour cette option soit je devrais carrément arrêter la macro si une des feuilles ouverte ne répond pas aux conditions

If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then Exit For

Peux tu me renseigner sur l'arrêt de la macro s'il te plait?
 

shenmicke

XLDnaute Junior
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonjour Robert, j'avais testé ça

If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then GoTo fin
'redéfinit la variable t si la cellule correspondante est numérique
If IsNumeric(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address)) Then t = t + CDbl(cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Range(cel.Address))
End If 'fin de la condition 2
Next cl 'prochain classeur de la boucle 2
cel.Value = t 'place t dans la cellule cel
t = 0
End If 'fin de la condition 1
Next cel 'prochaine cellul cel de la boucle 1
fin: Exit Sub


ainsi que celà:

If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607 Then Exit Sub


Mais j'ai une erreur :

la procédure Property Let n'est pas définie et la procédure Property Get n'a pas renvoyé d'objet

Ceci au niveau de :

If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(10, 8) <> 3197000 Or _
cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells.Value(501, 8) <> 7992607
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonjour Shenmicke, bonjour le forum

Le Goto fin est inutile ! Il te suffit d'écrire Then Exit Sub (ta deuxième proposition) et de supprimer l'étiquette fin:. Tu avais déjà fait le même coup avec Exit For placé en fin de code après une étiquette...
Par contre je n'ai aucune idée de ce qui provoque le message... Ça n'a rien à voir, à mon avis, avec l'ajout de ce Exit Sub. Au pire essaie End à la place de Exit Sub pour voir...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonjour Shenmicke, bonjour le forum,

Stop ! j'ai trouvé ta bêtise... tu as inversé :
Cells.Value(10, 8) à la place de Cells(10, 8).Value et idem pour Cells.Value(501, 8) à la place de Cells(501, 8).Value.
Bon tu feras 200 lignes de : Je dois faire gaffe quand je recopie le code que Robert s'est décarcassé à me donner pour ne pas l'inverser....
 

shenmicke

XLDnaute Junior
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Merci Robert, en effet j'ai tenté de faire ça moi même et j'ai tout inversé !
Merci pour ta patience.

Bon tu feras 200 lignes de : Je dois faire gaffe quand je recopie le code que Robert s'est décarcassé à me donner pour ne pas l'inverser....

ça marche si je fais des copier coller ? :D
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Bonjour Shenmicke, bonjour le forum,

Shenmicke à dit:
ça marche si je fais des copier coller ? :D
oui il vaut mieux... Sinon t'es capable de m'écrire : Je dois me décarcasser de recopier le code de Robert sans l'inverser et faire gaffe de pas me faire gauler....
 

shenmicke

XLDnaute Junior
Re : Provoquer une erreur après l'ouverture d'un fichier si la condition pas respecté

Dernière question et je t'embeterai plus après !
Est-il possible de faire 2 actions après un then ?
Mon idée serait de dire quelle feuille ne remplie pas les 2 conditions et de faire un exit sub juste après.

If cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells(10, 8).Value <> 3197000 Or _
cl.Sheets("CARITA 2010 Mkt Plan FORECAST").Cells(501, 8).Value <> 7992607 Then MsgBox "Il y a une erreur dans la feuille &cl&"
End Sub

Un truc de ce style mais ça me sort une erreur If sans end if :confused:

Merci
 
Dernière édition:

Statistiques des forums

Discussions
312 047
Messages
2 084 864
Membres
102 689
dernier inscrit
moshe yaacov abnaim