Amélioration d'un programme fonctionnel

Bonjour,

Je viens de finir un programme. Celui-ci fonctionne, mais étant novice en VBA, je pense que je l'ai écrit "à la bourrin".

Le but de la manœuvre est aussi d'en apprendre plus sur l'utilisation de VBA, ainsi pourriez vous me donner quelques astuces pour l'améliorer/le simplifier ?

J'ai la date/l'heure de mes données colonne A, et des données qui s'additionnent au fil du temps dans les colonnes C à N.

Je veux récupérer les données quotidiennes des colonnes C à N : je prends donc la dernière valeur de chaque journée. Je la soustrais au final la valeur de chaque jour, à celle du jour précédent (étant donné qu'elles s'additionnent au fil du temps). A noter que le pas de temps entre chaque donnée est un peu aléatoire.

Voici ma manière de procéder :

Sub Macro1()

haut = Fix(Range("A2").Value)
bas = Fix(Range("A3").Value)    'je prends la valeur entière de la case : il ne reste que la date, l'heure est donc supprimée
result = bas - haut    'les trois premières lignes servent d'initialisation pour pouvoir lancer la boucle
ligne = 2
fin = 2
Do Until result < 0    'si result est négatif, on est arrivé en bas de la colonne
    haut = Fix(Cells(ligne, 1).Value)    'je remets haut et bas dans la boucle avec des variables pour parcourir la colonne
    ligne = ligne + 1
    bas = Fix(Cells(ligne, 1).Value)
    result = bas - haut
    If result = 1 Then    'si result = 1, cela signifie  qu'on change de date : je note la valeur plus loin dans mon tableau
        Range(Cells(ligne, 3), Cells(ligne, 14)).Copy
        Cells(fin, 17).Select
        Selection.PasteSpecial Paste:=xlPasteValues    'je fais un collage spécial car les données des colonnes C à N sont des formules : je ne garde que les valeurs
        fin = fin + 1
    End If
Loop
For i = 17 To 28     'Cette double boucle sert à soustraire la valeur de chaque jour, à celle du jour précédent
    For j = 60 To 2 Step -1
        Cells(j, i).Value = Cells(j, i) - Cells(j - 1, i)
    Next j
Next i

End Sub

Qu'en pensez-vous ? Y a-t-il un moyen de procéder plus simplement ?

Merci beaucoup !

Bonjour,

Alors pour faire propre, voici déjà quelques (bonnes) règles à suivre :

  • toujours déclarer toutes les variables avec des types adaptés (par ex Dim haut as double). Au passage c'est bien de cocher l'option "Déclaration des variables obligatoire" via le menu Outils/Option.
  • utiliser les fonctions les plus adaptées au résultat visé : Fix est utile quand la valeur de la cellule peut être négative, pour des dates-heures à priori toujours positives Int est à préférer
  • toujours préciser de quelle feuille dépend une cellule : préférer Sheets("Truc").cells(l,c).value plutôt que cells(l,c).value
  • éviter autant que possible les Select et autre Copy/paste, préférer une formulation du genre :
Dim T As Variant

    T = Sheets("Truc").Range(Sheets("Truc").Cells(ligne, 3), Sheets("Truc").Cells(ligne, 14))    ' au lieu de copy
    Sheets("Machin").Cells(fin, 17).Resize(UBound(T, 1), UBound(T, 2)) = T ' au lieu de select et paste
  • Enfin au lieu de l'intérieur de la boucle Cells(j, i).Value = Cells(j, i) - Cells(j - 1, i) il est plus rapide de passer par des variables tableaux (cf les nombreux tuto dispo partout dont ceux de ce forum)

Et par la suite plus le projet sera complexe, plus ces points seront utiles et éviteront des bugs de tout genre.

Pierre

Rechercher des sujets similaires à "amelioration programme fonctionnel"