Raccourcir une macro

Résolu
stitchbouck Messages postés 137 Statut Membre -  
stitchbouck Messages postés 137 Statut Membre -
Bonjour,

j'ai composé une macro très répétitive, et je me demandais si quelqu'un voyait un moyen de la raccourcir.

J'intègre manuellement des données de compteur électrique sur une feuille nommée "ordre de relevé" selon leur emplacements physiques (donc selon le chemin que je prends pour aller les relever), et la macro s'occupe de distribuer ces données sur les feuilles correspondantes.
Au passage, la macro vérifie les données et renvoie un message selon la donnée erronée (indique la ou les colonnes fautives). C'est à ce niveau qu'il y a de multiples redondances...
ça fonctionne, mais c'est moche et ça pourrait surement être plus précis (indication de la cellule au lieu de la colonne seule, par exemple)

Voici donc un extrait de la macro

 ' Compteur ERDF 70
For i = 6 To Range("A65536").End(xlUp).Row
If IsNumeric(Sheets("Compteur électrique").Cells(i - 1, 10)) And Sheets("Compteur électrique").Cells(i, 10) <> "" And Sheets("Compteur électrique").Cells(i, 10) < Sheets("Compteur électrique").Cells(i - 1, 10).Value Then
MsgBox ("Erreur : relevé 'Compteur électrique' inférieur au précédent." & Chr(10) & "En colonne 10" & Chr(10) & "Vérifiez et modifiez sur feuille 'Ordre de relevé'" &  "en colonne 27" & "puis relancez le transfert de donnée. ")
End If
Next

' Compteur ERDF 71
For i = 6 To Range("A65536").End(xlUp).Row
If IsNumeric(Sheets("Compteur électrique").Cells(i - 1, 11)) And Sheets("Compteur électrique").Cells(i, 11) <> "" And Sheets("Compteur électrique").Cells(i, 11) < Sheets("Compteur électrique").Cells(i - 1, 11).Value Then
MsgBox ("Erreur : relevé 'Compteur électrique' inférieur au précédent." & Chr(10) & "En colonne 11" & Chr(10) & "Vérifiez et modifiez sur feuille 'Ordre de relevé'" &  "en colonne 28" & "puis relancez le transfert de donnée. ")
End If
Next

' Compteur ERDF 72
For i = 6 To Range("A65536").End(xlUp).Row
If IsNumeric(Sheets("Compteur électrique").Cells(i - 1, 12)) And Sheets("Compteur électrique").Cells(i, 12) <> "" And Sheets("Compteur électrique").Cells(i, 12) < Sheets("Compteur électrique").Cells(i - 1, 12).Value Then
MsgBox ("Erreur : relevé 'Compteur électrique' inférieur au précédent." & Chr(10) & "En colonne 12" & Chr(10) & "Vérifiez et modifiez sur feuille 'Ordre de relevé'" &  "en colonne 29" & "puis relancez le transfert de donnée. ")
End If
Next

etc...

A votre avis ? un moyen de condenser un peu tout ça, d'éviter de répéter un "corps" de msgbox identique ?

merci !!

7 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Déjà, pourquoi faire 3 boucles alors qu'elles sont identiques ?
    Ensuite, le début de ton msgbox étant identique, tu pourrais le mettre dans une variable

    Un truc du genre
    Dim msgStart as String
    Dim msg2 as String  
    Dim sh as WorkSheet    
      Set Sh = Sheets("Compteur électrique")
    
    
    msgStart = "Erreur : relevé 'Compteur électrique' inférieur au précédent." & Chr(10) & "En colonne "
    msg2 = "Vérifiez et modifiez sur feuille 'Ordre de relevé'" &  "en colonne "
    
    For i = 6 To Range("A65536").End(xlUp).Row
      If IsNumeric(Sh.Cells(i - 1, 10)) And Sh.Cells(i, 10) <> "" And Sh.Cells(i, 10) < Sh.Cells(i - 1, 10).Value Then
        MsgBox (msgStart & "10" & Chr(10) & msg2 & "27" & "puis relancez le transfert de donnée. ")
      End If
    
      If IsNumeric(Sh.Cells(i - 1, 11)) And Sh.Cells(i, 11) <> "" And Sh.Cells(i, 11) < Sh.Cells(i - 1, 11).Value Then
        MsgBox (msgStart & "11" & Chr(10) & msg2 & "28" & "puis relancez le transfert de donnée. ")
      End If
    
      If IsNumeric(Sh.Cells(i - 1, 12)) And Sh.Cells(i, 12) <> "" And Sh.Cells(i, 12) < Sh.Cells(i - 1, 12).Value Then
        MsgBox (msgStart & "12" & Chr(10) & msg2 & "29" & "puis relancez le transfert de donnée. ")
      End If
    Next
    
    

    1
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Dans l'idée de michel, toujours pour éviter de faire plusieurs boucles (et donc ralentir le programme...)

      Sub tamacro()
          For i = 6 To Range("A65536").End(xlUp).row
           Call analyse(i, 10)
           Call analyse(i, 11)
           Call analyse(i, 12)
          Next
      End Sub
      
      Sub analyse(row, col)
          Dim sh As Worksheet
          Dim msgStart As String
          Dim msg2 As String
          Set sh = Sheets("Compteur électrique")
          
          msgStart = "Erreur : relevé 'Compteur électrique' inférieur au précédent." & Chr(10) & "En colonne "
          msg2 = "Vérifiez et modifiez sur feuille 'Ordre de relevé'" & "en colonne "
          If IsNumeric(sh.Cells(row - 1, col)) And sh.Cells(row, col) <> "" And sh.Cells(row, col) < sh.Cells(row - 1, col).Value Then
              MsgBox (msgStart & col & Chr(10) & msg2 & col + 17 & " puis relancez le transfert de donnée. ")
          End If
      
      End Sub
      
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    peut-^tre avec une macro parametrée

    Option Explicit
    '------------------------------------------------
    Sub vérifier_compteurs()
    Dim Colonne As Byte
    For Colonne = 10 To 12 (12? etc)
    Call analyser_compteur(Colonne)
    Next
    End Sub
    Sub analyser_compteur(Col)
    Dim i As Integer
    For i = 6 To Range("A65536").End(xlUp).Row
    If IsNumeric(Sheets("Compteur électrique").Cells(i - 1, Col)) And Sheets("Compteur électrique").Cells(i, Col) <> "" And Sheets("Compteur électrique").Cells(i, Col) < Sheets("Compteur électrique").Cells(i - 1, Col).Value Then
    MsgBox ("Erreur : relevé 'Compteur électrique' inférieur au précédent." & Chr(10) & "En colonne " & Col & Chr(10) & "Vérifiez et modifiez sur feuille 'Ordre de relevé'" & "en colonne " & Col + 17 & "puis relancez le transfert de donnée. ")
    End If
    Next

    End Sub


    mais il m'est impossible de vérifier n'ayant pas le classeur sous les yeux

    ta ligne de code pourrait être plus concise (et donc lisible) en utilisant les blocs

    1
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    par exemple

    1
  4. stitchbouck Messages postés 137 Statut Membre 2
     
    Waouh ! merci à tous !

    je décortique tout ça, je teste dans mon classeur et reviens vers vous !!

    encore merci :)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. stitchbouck Messages postés 137 Statut Membre 2
     
    Je me demandais pourquoi dans la msgbox vous mettiez "col +17". Et j'ai compris, mais la feuille "ordre de donnée" n'a pas toujours des colonnes qui se suivent (dsl, je n'avais pas pensé à ce point important). Ici on a 27 28 29 , mais pour d'autres c'est complètement disparate, donc "col +17" ne fonctionne plus.

    J'en conclue que c'est la réponse de Jordane qui me convient le plus, car il faut malgré tout indiquer la colonne nominativement.

    J'aimerai envoyer un extrait du fichier pour que ça soit plus clair, mais je n'arrive pas à trouver comment on fait... ?
    0
    1. stitchbouck Messages postés 137 Statut Membre 2
       
      ha super merci ! je le dépose mercredi alors.
      0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Je t'ai répondu en te faisant remarquer que tu m'avais bossé pour rien mais le dénommé Jordane, tout imbu de sa médaille de modérateur, l'a censuré
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Il y a des façons de repondre qui passent... d'autres non.
      Si ma façon de faire ne te plaît pas, tu peux venir en mp en discuter.
      0
    2. stitchbouck Messages postés 137 Statut Membre 2
       
      Pour rien ??? ben non... je n'avais pas penser qu'on pouvait faire ce que tu m'as donné (Sub vérifier_compteurs()).
      Sois bien sur qu'à mon niveau limité, toute aide de ce type me fait avancer !!
      alors, oui, il manquait un paramètre, d'importance qui plus est, mais rien n'est jeté : ça me servira probablement ailleurs.
      Donc, merci à vous deux pour ce beau coup de main :)
      0
  8. stitchbouck Messages postés 137 Statut Membre 2
     
    Bonjour,

    j'espère que vous avez passé un agréable mois de mai !! :)

    https://www.cjoint.com/c/HEwiPGsVIVD
    Ci-joint le lien vers le fichier entier pas encore modifier par vos remarques. j'ai bien compris que je pouvais simplifier la lecture au moins par des déclarations pour simplifier le nom des feuilles...
    Si vous voyez d'autres simplification, je suis preneur !!

    Merci à vous et bonne journée !
    0