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 SubQu'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é :
Fixest utile quand la valeur de la cellule peut être négative, pour des dates-heures à priori toujours positivesIntest à préférer - toujours préciser de quelle feuille dépend une cellule : préférer
Sheets("Truc").cells(l,c).valueplutôt quecells(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