Raccourcir une macro

Résolu/Fermé
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 - Modifié le 7 mai 2018 à 10:12
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 - 22 mai 2018 à 10:55
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 !!
A voir également:

7 réponses

jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
7 mai 2018 à 10:24
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
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
7 mai 2018 à 12:04
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié le 7 mai 2018 à 11:58
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
7 mai 2018 à 12:07
par exemple

1
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 2
7 mai 2018 à 14:35
Waouh ! merci à tous !

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

encore merci :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 2
7 mai 2018 à 16:18
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
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
7 mai 2018 à 17:59
0
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 2
7 mai 2018 à 19:10
ha super merci ! je le dépose mercredi alors.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
7 mai 2018 à 18:09
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
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
7 mai 2018 à 19:09
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
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 2
7 mai 2018 à 19:13
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
stitchbouck Messages postés 129 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 7 novembre 2024 2
22 mai 2018 à 10:55
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