Gestion des erreus

Résolu
Bonjour,

je fais une macro afin de faire une synthèse des notes obtenues par nos fournisseurs.

A chaque évaluation( 2 par an) on rajoute le "relevé de notes" des fournisseurs dans une nouvelle feuille du classeur.
Dans la feuille synthèse, j'ai en colonne: le nom de chaque fournisseur, et en ligne: ses notes obtenues à chaque évaluation.
Le problème est que: les fournisseur ne sont pas tous évalués chaque fois, mais lorsque je lance la macro, même si le fournisseur n'a pas été évalué, j'obtiens une note pour cette période et je ne comprends pas d'où elle sort.
Je mets si dessous ma macro, le problème vient sans aucun doute du: On error resume next, je me rends bien compte que la macro ignore alors le fait que le fournisseur n'a pas été évalué..... Mais je ne sais pas comment faire.

Sub comparaison_fournisseurs()

Dim derlig As Long
Dim dercol As Integer

Dim cel As Range
Dim ligne As Long
Dim eval
Dim fournisseur
Dim i As Byte
Dim j As Byte

Sheets("Synthèse").Activate

derlig = Range("C" & Rows.Count).End(xlUp).Row
dercol = Cells(4, Cells.Columns.Count).End(xlToLeft).Column

For i = 5 To derlig
        For j = 4 To dercol
        eval = Cells(4, j).Value
        fournisseur = Cells(i, 3)
        
Sheets(eval).Activate
        
Set cel = Cells.Find(What:=fournisseur, LookAt:=xlWhole)
On Error Resume Next   'c'est là que ça ne va pas il me semble. Si le fournisseur n'est pas  trouvé sur la page, je veux que la valeur affiché dans mon tableau de synthèse soit par exemple "/" 

ligne = cel.Row

Sheets("Synthèse").Activate
Cells(i, j).Value = Sheets(eval).Cells(ligne, 15)



Next j
Next i



End Sub


Merci d'avance pour votre aide,

Megatronnbjja

4 réponses

  1. Re,

    essayez ceci (eval et fournisseur peuvent etre enlevees puisqu'utilisees une seule fois)

    Sub comparaison_fournisseurs()
        Dim derlig As Long
        Dim dercol As Integer
        Dim cel As Range
        Dim eval
        Dim fournisseur
        Dim i As Byte
        Dim j As Byte
    
        With Sheets("Synthèse")
            derlig = .Range("C" & Rows.Count).End(xlUp).Row
            dercol = .Cells(4, .Cells.Columns.Count).End(xlToLeft).Column
            For i = 5 To derlig
                For j = 4 To dercol
                    eval = .Cells(4, j).Value
                    fournisseur = .Cells(i, 3)
                    Set cel = Sheets(eval).Cells.Find(What:=fournisseur, LookAt:=xlWhole)
                    If Not cel Is Nothing Then
                        .Cells(i, j).Value = Sheets(eval).Cells(cel.Row, 15)
                    Else
                        .Cells(i, j).Value = "/"
                    End If
                Next j
            Next i
        End With
    End Sub
    1. Re,

      Merci pour les infos. ça marche très bien. J'appliquerai pour mes prochaines macro.

      A+
  2. Bonjour,

    Merci pour ta réponse Mélanie. J'avais bien compris ce que faisait ma macro (c'est moi qui l'ai écrit)... : ) Ma colonne 15 contient en fait la moyenne obtenue par chaque fournisseur évalué. Elle est donc renseignée à chaque fois.
    Ce qui varie , c'est la liste de fournisseur évalués. Dans ma feuille de synthèse, j'ai la liste complète de tous les fournisseurs de notre pannel. Mais tous les fournisseurs ne sont pas évalués à chaque fois. Donc mon problème était que même si le fournisseur n'était pas présent sur la feuille d'évaluation, ma macro lui "inventait" une note...

    f894009, merci pour ton aide!!! Ma macro marche à présent. J'avais testé cette méthode mais en écrivant : If not cel = nothing........ Je ne savais pas que la bonne syntaxe était If not cel is nothing.....

    En tous cas, merci beaucoup à vous deux. C'est très appréciable d'obtenir des réponses rapidement.

    PS: f894009, je suis encore novice en vba mais ça me plait bien, si tu as des conseils pour "alléger" mon code, je suis preneur!! (si tu as un peu de temps bien sur).
    1. Bonjour a vous deux,

      une facon de faire (voir aide excel range.find)

      Sub comparaison_fournisseurs()
      
      Dim derlig As Long
      Dim dercol As Integer
      
      Dim cel As Range
      Dim ligne As Long
      Dim eval
      Dim fournisseur
      Dim i As Byte
      Dim j As Byte
      
          Sheets("Synthèse").Activate
      
          derlig = Range("C" & Rows.Count).End(xlUp).Row
          dercol = Cells(4, Cells.Columns.Count).End(xlToLeft).Column
      
          For i = 5 To derlig
              For j = 4 To dercol
                  eval = Cells(4, j).Value
                  fournisseur = Cells(i, 3)
              
                  Sheets(eval).Activate
              
                  Set cel = Cells.Find(What:=fournisseur, LookAt:=xlWhole)
                  'On Error Resume Next   'c'est là que ça ne va pas il me semble. Si le fournisseur n'est pas  trouvé sur la page, je veux que la valeur affiché dans mon tableau de synthèse soit par exemple "/"
      
                  If Not cel Is Nothing Then
                      ligne = cel.Row
                      Sheets("Synthèse").Activate
                      Cells(i, j).Value = Sheets(eval).Cells(ligne, 15)
                  Else
                      Sheets("Synthèse").Activate
                      Cells(i, j).Value = "/"
                  End If
              Next j
          Next i
      End Sub
      


      ce code pourrait etre un peu modife pour eviter les .activate

      Bonne suite
      1. Coucou,

        Pour mieux comprendre,
        il faudrait ton tableau sur cjoint.com.

        mais ton pb vient de la :

        Cells(i, j).Value = Sheets(eval).Cells(ligne, 15)
        car si ton fournisseur est trouvé, ton évaluation = feuille fournisseur ligne ou ton fournisseur a été trouvé, colonne 15.
        Que contient ta colonne 15 de chacun de tes fournisseurs?? Y compris ceux qui ne sont pas évalués??

        Je vais te traduire ce que fait la macro, ca sera déjà un début:

        Sub comparaison_fournisseurs()

        Dim derlig As Long
        Dim dercol As Integer

        Dim cel As Range
        Dim ligne As Long
        Dim eval
        Dim fournisseur
        Dim i As Byte
        Dim j As Byte

        Sheets("Synthèse").Activate ' on active la feuille synthèse

        derlig = Range("C" & Rows.Count).End(xlUp).Row 'la variable derlig est égale à la dernière ligne de la feuille synthèse
        dercol = Cells(4, Cells.Columns.Count).End(xlToLeft).Column 'la variable dercol est égale à la dernière colonne de la feuille synthèse

        For i = 5 To derlig 'à partir de la ligne 5 jusqu'à la dernière ligne
        For j = 4 To dercol ' à partir de la colonne 4 jusqu'à la dernière colonne
        eval = Cells(4, j).Value ' la variable eval = valeur de la cellule ligne 4 colonne J
        fournisseur = Cells(i, 3) ' fournisseur = valeur de la cellule de la ligne i colonne 3

        Sheets(eval).Activate 'on sélectionne la feuille qui porte le nom de la variable eval soit la cellule ligne 4 colonne j

        Set cel = Cells.Find(What:=fournisseur, LookAt:=xlWhole) ' dans cette feuille, on recherche le fournisseur
        On Error Resume Next ' ici ca indique que si en dessous il y a un problème, on passe à la colonne suivante
        ligne = cel.Row ' la variable ligne = ligne où le fournisseur a été trouvé. Ex : ton fournisseur se trouve en B5, ligne = 5

        Sheets("Synthèse").Activate ' on active la feuille synthèse
        Cells(i, j).Value = Sheets(eval).Cells(ligne, 15) 'Pour moi ton pb se trouve ici!!!! Car on dit que la cellule de la ligne i et de la colonne j = à la cellule de la ligne i et de la colonne 15. Donc à toi de voir ce que contient la colonne 15 si elle est toujours renseigné, voila pourquoi tu as toujours une valeur

        Next j
        Next i

        End Sub