Erreur d'éxécution

Bonjour le Forum,

dans le fichier joint, j'ai une macro qui me permets d'additionner les heures de chaque

étape d'un processus de fabrication d'une commande sélectionnée dans l'onglet "Ref dossier".

Je la lance avec le bouton "Recherche temps dans ce même onglet.

La macro m'affiche au final un userform avec ces infos.

Malheureusement, elle me renvoie "Erreur d'éxécution 13" incompatibilité de type.

Je n'arrive pas à comprendre pourquoi.

Merci pour vos réponses.

10test-01-11-19.xlsm (269.07 Ko)

Bonsoir,

l'erreur se produits sur la cellule F1070 où il y a une erreur de division par 0 !

Résolvez ceci et le reste de la macro devrait fonctionner.

Par contre f1070 est hors champ, il vous faut peut-être revoir la boucle avec UsedRange qui prend "tout"... A voir

@ bientôt

LouReeD

Merci,

effectivement, cela fonctionne mais dans le fichier donné je n'ai pas reporté tous les onglets.

J'en ai autant que de semaines.

Du coup, j'ai toujours une rreur d'éxécution.

Existe t-il un moyen de détecter les cellules avec une division par zéro, et de remplacer la valeur

par 0 par exemple.

Bonjour,

une solution est d'incorporer une gestion d'erreur dans votre code :

For Each sht In Worksheets 'boucle sur toutes les feuilles du classeur

    For Each Cel In sht.UsedRange 'boucle sur les cellules d'une feuille
        ' mise en place de la gestion d'erreur afin de ne pas arrêter le déroulement du code
        On Error Resume Next
        ' s 'il y a une erreur sur une cellule
        If Err > 1 Then
            ' on passe la cellule à 0
            Cel.Value = 0
            ' on remet la gestion d'erreur à 0
            Err = 0
        End If
        If Cel.Value = Commande And Cel.Offset(0, 1).Font.Underline = xlUnderlineStyleSingle And Cel.Offset(0, 1).Interior.ColorIndex = 43 Then
            CompteurHeureDebit = Cel.Offset(0, 1).Value + CompteurHeureDebit ' somme des heures débit
            CompteurDebit = CompteurDebit + 1 ' nombre d'occurence débit

            ElseIf Cel.Value = Commande And Cel.Offset(0, 1).Font.Underline = xlUnderlineStyleSingle And Cel.Offset(0, 1).Interior.ColorIndex = 6 Then
            CompteurHeureUsi = Cel.Offset(0, 1).Value + CompteurHeureUsi ' somme des heures usinage
            CompteurUsi = CompteurUsi + 1 ' nombre d'occurence usinage

            ElseIf Cel.Value = Commande And Cel.Offset(0, 1).Font.Underline = xlUnderlineStyleSingle And Cel.Offset(0, 1).Interior.ColorIndex = 15 Then
            CompteurHeureSer = Cel.Offset(0, 1).Value + CompteurHeureSer ' somme des heures usinage
            CompteurSer = CompteurSer + 1 ' nombre d'occurence sertissage

            ElseIf Cel.Value = Commande And Cel.Offset(0, 1).Font.Underline = xlUnderlineStyleSingle And Cel.Offset(0, 1).Interior.ColorIndex = 40 Then
            CompteurHeureMon = Cel.Offset(0, 1).Value + CompteurHeureMon ' somme des heures montage
            CompteurMon = CompteurMon + 1 ' nombre d'occurence montage

        End If
        ' on arrête la gestion d'erreur
        On Error GoTo 0
     Next
Next

En faisant comme cela, la valeur "erreur" de la cellule n'est pas modifiée, seule sa "représentation" sous VBA l'est :

la valeur de Cel est égale à 0, mais Cel est une copie de la cellule de la plage considérée.

Donc mise en place de la gestion d'erreur, s'il y a erreur, valeur = à 0, puis init des erreurs pour la boucle suivante.

Ca a l'air de fonctionner, à tester pour la cohérence des résultats.

@ bientôt

LouReeD

Après un test le résultat n'est pas celui attendu...

Alors le plus simple serait de mettre la gestion d'erreur au niveau des cellules avec par exemple en F1070 :

=SIERREUR((E1070-B1070)/B1070;0)

Si la formule renvoie une erreur alors afficher 0

Toutes les cellules de la colonne F contenant une formule comme celle-là devraient avoir cette gestion d'erreur, du coup au niveau du code VBA vous pourrez rester sur le code d'origine.

@ bientôt

LouReeD

Merci LouReeD,

mais dans mon fichier, j'ai la possibilité de cette erreur (division par zéro) dans d'autres cellules.

Je pensais pour la gestion des erreurs à WorksheetFunction.IsError(). Je suis en train de travailler dessus

pour voir si je peux l'intégrer dans ma macro.

A suivre.

Bonjour à tous,

Tu boucles sur toutes les cellules de toutes les feuilles pour trouver ta chaine.

Ce n'est pas efficace et doit prendre un temps considérable.

Il vaut mieux rechercher ta chaine :

Sub test()
    Dim Commande As String, sh As Worksheet, c As Range
    Dim adr1 As String
    Commande = ActiveCell
    For Each sh In Worksheets
        If sh.Name <> ActiveSheet.Name Then
            Set c = Cells.Find(Commande, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                adr1 = c.Address
                Do
                    ' traitement
                    MsgBox sh.Name & ", " & c.Address
                Loop While c.Address <> adr1    'And Not c Is Nothing
            End If
        End If
    Next sh
End Sub

Avantage supplémentaire : tu zappes les cellules en erreur qui te gênent.

Je n'ai mis que la boucle principale, à toi d'ajouter le traitement si ça correspond à ce que tu veux.

Et plutôt qu'un bouton tu pourrais te servir de l'événement double-clic sur la cellule voulue.

eric

Bonjour eriic,

merci pour ta solution.

Effectivement, ma macro prenait un peu de temps.

Je l'ai considérablement réduit en ne faisant ma recherche que sur les 10 dernières semaines (càd les 10 dernières feuilles)

une parties des cellules (A4:M65).

J’ai intégré la boucle suivante dans ma macro:

For i = DébutFeuilles To FinFeuilles

For Each Cel In Worksheets(i).Range("A4:M65").Cells

Heuuu, et pas envie de tester ma proposition ???

Bien sûr.

J'y suis dessus.

Rechercher des sujets similaires à "erreur execution"