[VBA Excel] Erreur 1004 lors d'un recalcul automatique

Signaler
Messages postés
12
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
18 avril 2012
-
Messages postés
12
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
18 avril 2012
-
Bonjour,

J'ai la formule suivante dans la cellule G8 :
=ESTDOUBLON(A8;C8)


Avec la macro suivante :
Private Const nVERT As Integer = 4  'Vert

Function ESTDOUBLON(Plage1 As Range, Plage2 As Range) As String
 Dim nCouleur As Long
 Dim sRetour As String

    On Error Resume Next
    
    sRetour = ""
    nCouleur = Plage1.Interior.ColorIndex
    
    If (Err.Number > 0) Then
        Err.Clear
        
        nLigne = Plage1.Row
        nCol = Plage1.Column
        nCouleur = Cells(nLigne, nCol).Interior.ColorIndex
        If (Err.Number > 0) Then
            Err.Clear
            ESTDOUBLON = "ERREUR"
            Exit Function
        End If
    End If
    
    If (nCouleur = nVERT) Then
        sRetour = "Plage 1"
    End If

    nCouleur = 0
    nCouleur = Plage2.Interior.ColorIndex
    If (nCouleur = nVERT) Then
        If (Len(sRetour) > 0) Then
            sRetour = sRetour & " et 2"
        Else
            sRetour = "Plage 2"
        End If
    End If

    If (Len(sRetour) > 0) Then
        sRetour = "Vert dans " & sRetour
    End If
    
    ESTDOUBLON = sRetour

End Function


J'ai ensuite ma macro principale :
Sub Princ()
    'Pour gagner en perf
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    'Mise en place de données, des couleurs et des formules
    ...

    'On active le filtrage
    If (ActiveSheet.AutoFilterMode = False) Then
        'Filtre inactif => on l'active
        Rows("4:4").AutoFilter
    End If

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

    Selection.AutoFilter Field:=5, Criteria1:="Mon critère"

End Sub


Le problème :
A la fin de la macro "Princ", Excel lance le recalcul automatique et à ce moment là, j'ai toujours Err.Number = 1004 dans "ESTDOUBLON" après un accès à ColorIndex.
Pour info, la formule fonctionne correctement si je m'amuse avec le filtre hors macros.

Quelqu'un saurait-il comment je pourrais vérifier la couleur de fond de la cellule, même pendant cette phase de recalcul ?

Cordialement,

10 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

De prime abord, il n'y a aucun lien entre ta sub Princ et ta fonction ESTDOUBLON.
Donc, impossible d'expliquer ce phénomène vu d'ici.

Dans ESTDOUBLON, tu sembles gérer la détection de défaut quand tu t'adresses à Plage1, mais pas pour Plage2 : Ne connaissant pas la syntaxe d'appel de ta fonction, impossible de t'aider.

Sur quelle ligne as-tu cette erreur ?
Débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
Quand tu écris :
nCouleur = Cells(nLigne, nCol).Interior.ColorIndex

Cells ne se rapporte à aucune feuille précise !
on se demande d''ailleurs pourquoi toutes ces "circonvolutions".
Que serait
Cells(nLigne, nCol)
ou
nLigne Plage1.Row et nCol Plage1.Column

???
Rien d'autre que la plage plage1 (la cellule A8 dans ton exemple, puisque ta formuler n'utilise qu'une seule cellule (A8) pour la plage plage1 passée en paramètre !
et ton erreur ne vient pas, comme je te l'ai vu affirmer, d'une "couleur indisponible" (), mais d'une plage non défibnie (Cells(nLigne, nCol))
Et ta gestion d'erreur n'a aucune raison d'être présente !
Et tu n'as nul besoin des variables nligne et nCol !
Allez ! je te laisse te réveiller et corriger (facile et tu sais où, maintenant) tout cela tout seul, comme un grand, hein.
__________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et (avant d'arriver à d'autres "circonvolutions" étranges ou des conclusions indues) :
Je ne t'ai ici pas parlé de ton problème de fonds (un conflit, sans aucun doute), mais de la toute nouvelle erreur 1004 que tu viens de générer (en plus, donc, du reste) !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et il est par ailleurs assez vraisemblable (bien que tu ne nous en aies pas dit un mot) que lors de tes diverses opérations, tu changes de feuille active, ce qyui tendrait )à expliquer ce qui t'étonne, à savoir :
Pour info, la formule fonctionne correctement si je m'amuse avec le filtre hors macros.
*
car là, tu es bien sur la feuille concernée (manuellement)



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
12
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
18 avril 2012

Bonjour,

Retour 1 :
Dans ESTDOUBLON, tu sembles gérer la détection de défaut quand tu t'adresses à Plage1, mais pas pour Plage2 : Ne connaissant pas la syntaxe d'appel de ta fonction, impossible de t'aider.
Je ne gère que l'erreur sur la première plage car si l'un ne fonctionne pas, le 2e qui est identique ne fonctionnera pas mieux.
De plus, si le 1er ne fonctionne pas, on sort de la fonction.

Retour 2 :
Sur quelle ligne as-tu cette erreur ?
    nCouleur =   Plage1.Interior.ColorIndex
    
    If (Err.Number > 0) Then
Sur celle qui précéde la gestion d'erreur.

Pour ce qui est du débugage, j'ai :
? Plage1.Interior.ColorIndex
Qui déclenche l'erreur 1004 avec le message suivant :
Erreur 1004

Impossible de lire la propriété Interior de la classe Range.


Retour 3 :
Cells ne se rapporte à aucune feuille précise !
on se demande d''ailleurs pourquoi toutes ces "circonvolutions".
Que serait
Cells(nLigne, nCol)
ou
nLigne Plage1.Row et nCol Plage1.Column
J'ai ajouté :
    Windows("signature_report.xls").Activate
    Sheets("Exports").Select
    Plage1.Select

    nCouleur = PlageDA.Interior.ColorIndex
    nCouleur = ActiveSheet.Cells(nLigne, nCol).Interior.ColorIndex
    nCouleur = Selection.Interior.ColorIndex
Ces 3 variantes pour récupérer la couleur déclenchent toutes l'erreur.

Retour 4 :
Et il est par ailleurs assez vraisemblable (bien que tu ne nous en aies pas dit un mot) que lors de tes diverses opérations, tu changes de feuille active, ce qyui tendrait )à expliquer ce qui t'étonne

Les opérations effectuées sont :
- ouverture de 2 csv,
- Tri des données qui s'y trouvent,
- Copie dans la feuille courante (Exports), (Colonne AB pour l'un et CD pour l'autre)
- Fermeture de ces 2 fichiers csv, (Là, je me retrouve sur la feuille Exports)
- Alignement des lignes pour faire correspondre A et C, (Mise en place des couleurs pendant cette phase)
- Et mise en place de formules dans les colonnes EFG dont pour G :
    ActiveCell.FormulaR1C1   = "=ESTDOUBLON(RC[-6],RC[-4])"
Je confirme que la fonction ESTDOUBLON n'est appelée que via cette formule et non depuis le code VBA.

Cordialement,
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Commence par la prudence :
passe les noms du classeur et de la feuille en paramètre supplémentaire de ta fonction.
Ce sera plus propre et moins tortueux

pareil pour :
ActiveCell.FormulaR1C1 = "=ESTDOUBLON(RC[-6],RC[-4])"

remplace activecell par ses pointeurs complets (feuille et range)
Ce sera également plus propre, déjà

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et par ce procédé plus propre (et en enlevant bien évidemment les "On Error Resume Next" (désastreux cache-crottes), tu verras normalement très vite la raison de ton erreur 2004 !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
12
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
18 avril 2012

Bonjour,

Retour 1 :
passe les noms du classeur et de la feuille en paramètre supplémentaire de ta fonction.
Ce sera plus propre et moins tortueux
Si tu parles de la formule, elle ne travaille que sur la feuille courante. La formule deviendrai :
=ESTDOUBLON("signature_report.xls";"Exports";A6;C6)
Alors que c'est sur ce fichier et cette feuille que se trouve la formule.
Je pense que là ça deviendrai tortueux

Retour 2 :
remplace activecell par ses pointeurs complets (feuille et range)

La mise en place de la formule ne pose pas de problème puisqu'elles se trouvent sur les bonnes cellules dans la bonne feuille.

C'est lors de l'exécution de la formule (l'appel à ESTDOUBLON) que suivant les cas (ici pendant le recalcul automatique) que la propriété "Interior" n'est plus accessible.

Cordialement,
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Alors fais donc à ta tête !

et pour ton info, la chose est pour moiu claire :
la propriété "Interior" n'est plus accessible

ce n'est pas cette propriété seule, qui est innaccessible, mais carrément l'objet auquel elle est censée appartenir.

Et ton "on error resume next" ? tu le supprimes, oui ?
et relis donc TRES ATTENTIVEMENT mon messqge du 3 décembre 2011 à 07:28:09
Moi, je te souhaite bonne chance, maintenant.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
12
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
18 avril 2012

Bonjour,

Là je ne comprends plus.
Rien d'autre que la plage plage1 (la cellule A8 dans ton exemple, puisque ta formuler n'utilise qu'une seule cellule (A8) pour la plage plage1 passée en paramètre !
et ton erreur ne vient pas, comme je te l'ai vu affirmer, d'une "couleur indisponible" (), mais d'une plage non définie (Cells(nLigne, nCol))

Je ne comprends pas comment les cellules adjacentes à celle où se trouve la formule peuvent être non définies.

J'essaie juste de mettre en place une fonction pour déterminer si 2 cellules ont un fond vert et retourner un message.

Cordialement,