Faire des calculs avec vba

sevy1

XLDnaute Occasionnel
lBonjour à tous
J'ai un fichier qui a plus de 35000 lignes et 30 colonnes reprenant les dates et les textes. Dans ce fichier je fais des calculs (exemple la fonction SOMMEPROD# pour calculer certains indicateurs par mois et année. Puis que les données sont saisies chaque jour le fichier devient lourd alors j'ai pensé à une solution VBA qui me permettrait de ne calculer qu'après avoir cliquer sur un bouton.
Voici un exemple de code que j'ai essayé #Je suis zero en VBA# mais je me rend compte qu'il est lent
Code:
Sub calculer##
    Dim Ws As Worksheet
    Set Ws = Worksheets#"Feuil1"#
    n = Ws.Range#"A50000"#.End#xlUp# - 1
    For i = 2 To n
        debut = Ws.Cells#i, 1#
        fin = Ws.Cells#i, 2#
        If IsDate#debut# And IsDate#fin# Then
            Cells#i, 4#.Value = Application.Max#debut, fin#
            Cells#i, 5#.Value = Cells#i, 4# - Cells#i, 3)
        End If
    Next i
End Sub
Ce que j'ai voulu faire : Prendre la valeur maximale entre la date de la colonne 1 et celle de la colonne deux dans le cas ou les deux existent puis la mettre dans la colonne 4 et ensuite faire la soustraction entre la colonne 4 et 3 et mettre le résultat dans la collone 5.
Alors les Pro je vous remercie pour vos corrections et des suggestions d'optimisation pour que ce soit plus rapide
 

Odesta

XLDnaute Impliqué
Re : Faire des calculs avec vba

Bonjour
De manière générale, il est bien plus rapide de "charger" un tableau dans le VBA puis de le manipuler, plutôt que de faire appel aux cellules les unes après les autres.

'Par exemple :
dim mon_tableau
mon_tableau = range("A1:C1000").value

'puis
for i = 1 tu ubound(mon_tableau)
'traitements
next

'Enfin
range("A1:C1000").value = mon_tableau
'(ce qui permet de remettre le tableau lorsque l'on a changer les valeurs d'une colonne par exemple)

Bonne continuation
Cdt
 

Dranreb

XLDnaute Barbatruc
Re : Faire des calculs avec vba

Bonjour.

Pour illustrer la proposition de Odesta, par exemple comme ça :
VB:
Sub calculer()
Dim Ws As Worksheet, Te(), Ts(), L&
Set Ws = Worksheets("Feuil1")
Te = Ws.[A2].Resize(Ws.[A50000].End(xlUp) - 1, 3).Value
ReDim Ts(1 To UBound(Te, 1), 1 To 2)
For L = 1 To UBound(Te, 1)
   If IsDate(Te(L, 1)) And IsDate(Te(L, 2)) Then
      Ts(L, 1) = WorksheetFunction.Max(Te(L, 1), Te(L, 2))
      Ts(L, 2) = Ts(L, 1) - Te(L, 3): End If: Next L
Ws.[D2].Resize(UBound(Ts, 1), UBound(Ts, 2)).Value2 = Ts
End Sub
À tester.
 

sevy1

XLDnaute Occasionnel
Re : Faire des calculs avec vba

Bonjour
Merci pour votre contribution comme je vous l'ai dit c'est grace à la lecture de ce forum que j'ai bricolé ce code ceci dit j'aimerais que vous m'expliquiez certaines instructions.
1- L&
2- Te = Ws.[A2].Resize(Ws.[A50000].End(xlUp) - 1, 3).Value
3- ReDim Ts(1 To UBound(Te, 1), 1 To 2)
4-Ws.[D2].Resize(UBound(Ts, 1), UBound(Ts, 2)).Value2 = Ts
 

Dranreb

XLDnaute Barbatruc
Re : Faire des calculs avec vba

"&" derrière un nom de variable dans un Dim est un raccourci pour " As Long" (J'ai mis longtemps à céder à la flemme en finissant par l'utiliser)
La propriété Value d'un Range de plusieurs cellules contigües consiste en un tableau de Variant qui peut s'affecter à une variable aussi déclarée comme tel. Resize est une méthode de l'objet Range qui en renvoie un autre commençant par la même cellule mais avec un nombre de lignes et de colonnes différentes. Les crochet droits sont quant à eu un raccourci, utilisable seulement avec une expression fixe, de la méthode Evaluate, laquelle renvoie justement un Range quand il s’agit d'une référence de plage ou de cellule.
Redim sert à fixer les dimensions d'un tableau dynamique. Ubound donne la limite supérieur d'une des dimensions d'un tableau dont elles sont déjà fixées.
 

Discussions similaires

Réponses
0
Affichages
153
Réponses
1
Affichages
168
Réponses
2
Affichages
238

Statistiques des forums

Discussions
312 215
Messages
2 086 322
Membres
103 178
dernier inscrit
BERSEB50