Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J'ai un souci J'ai un tableau dont les données ont éte triées par date, dates se trouvant dans la colonne B. Chaque journée et leur données sont séparée d'une ligne vide inserée par code Ce que je souhaiterais c'est un code me permettant de faire la somme des données des colonnes C D et E dans la ligne vide Pourriez vous m'aider ?
ex
B C
18/09 14
18/09 13
ligne vide 27
17/09 15
17/09 18
17/09 7
ligne vide 40
etc
Comme je le disais cette nuit, j'ai travaillé sur les procédures proposées, et je suis arrivé à ceci à partir de vos propositions :
Code:
[COLOR="DarkSlateGray"][B]Sub job75_2()
Dim n As Byte, a As Range, lc As Long
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With
On Error Resume Next 'si tableau vide...
n = 2 'n° colonne de départ
For Each a In Columns(n).SpecialCells(xlCellTypeFormulas, xlNumbers).Areas
lc = a.Rows.Count
Cells(a.Row + lc, n + 1).Resize(1, 3).FormulaR1C1 = "=SUM(R[" & -lc & "]C:R[-1]C)"
Next
With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With
End Sub
Sub pierrejean_2()
Dim haut_somme&, n&
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With
haut_somme = 4
For n = 4 To Cells(Rows.Count, 1).End(xlUp).Row + 1
If Range("A" & n) = "" Then
Range(Cells(n, 3), Cells(n, 5)).FormulaR1C1 = "=SUM(R[" & haut_somme - n & "]C:R[-1]C)"
haut_somme = n + 1
End If
Next
With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With
End Sub[/B][/COLOR]
La procédure job75_2 me donne du souci : elle fonctionne s'il n'y a pas trop de lignes vides, par exemple avec +/- 4000 lignes vides parmi +/- 28000 lignes. Mais elle échoue lorsque je double la taille de l'échantillon de données. Le problème semble être dans l'expression
Vous avez bien vu les posts #12 à 15 n'est-ce pas ?
En tout cas j'ai testé les 2 macros présentées par Roger :
Code:
Sub sommes() 'Job75_2
Dim t#, n As Byte, a As Range, lc As Long
t = Timer
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With
On Error Resume Next 'si tableau vide...
n = 2 'n° colonne de départ
For Each a In Columns(n).SpecialCells(xlCellTypeConstants, xlNumbers).Areas
lc = a.Rows.Count
Cells(a.Row + lc, n + 1).Resize(1, 3).FormulaR1C1 = "=SUM(R[" & -lc & "]C:R[-1]C)"
Next
With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With
MsgBox Timer - t
End Sub
Durée 17 s, toujours pas terrible !
Code:
Sub sommes() 'pierrejean_2
Dim t#, haut_somme&, n&
t = Timer
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With
haut_somme = 4
For n = 4 To Cells(Rows.Count, 1).End(xlUp).Row + 1
If Range("A" & n) = "" Then
Range(Cells(n, 3), Cells(n, 5)).FormulaR1C1 = "=SUM(R[" & haut_somme - n & "]C:R[-1]C)"
haut_somme = n + 1
End If
Next
With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With
MsgBox Timer - t
End Sub
en cherchant sur le net j'ai trouve cela si ca peut aider
Lorsque vous créez un Microsoft macro Visual Basic pour Applications (VBA) qui sélectionne plusieurs plages non contiguës dans un classeur qui utilise une expression VBA qui est similaire aux actions suivantes, qui étaient censés uniquement pour se produire avec les cellules non contiguës viennent à chaque cellule de la sélection d'origine de la feuille de calcul Microsoft Excel :
Ce problème se produit si vous sélectionnez plusieurs 8,192 cellules non contiguës avec votre macro. Excel prend en charge uniquement un maximum de 8,192 cellules non contiguës par des macros VBA.
En règle générale, si vous essayez de sélectionner manuellement 8,192 plus de cellules non contiguës, vous recevez le message d'erreur suivantes :
La sélection est trop grande.
Toutefois, lorsque vous utilisez une macro VBA pour la même ou une sélection semblable, sans message d'erreur est déclenché et aucun code d'erreur n'est généré qui peuvent être capturées par un gestionnaire d'erreurs.
Curieux !!!
chez moi la macro la plus veloce est la pierrejean2 qui devrait se nommer Rogerxxxx du nom de son veritable auteur
Jusqu'a present ta machine me paraissait plus puissante que la mienne , mais la elle semble se fatiguer !!!
Comment expliquer ?
Merci laetitia90, pour ce message comme pour le suivant. Je subodorais une explication de ce genre, mais je ne l'avais pas trouvée. C'est le genre de limitations qu'on aurait aimé voir éliminé avant de passer la taille des feuilles de 65000 lignes à un million...
ROGER2327 #4189
Vendredi 20 Absolu 138 (Sainte Mélusine, souillarde de cuisine, SQ) 6 Vendémiaire An CCXIX 2010-W39-1T13:04:39Z
Curieux !!!
chez moi la macro la plus veloce est la pierrejean2 qui devrait se nommer Rogerxxxx du nom de son veritable auteur
Jusqu'a present ta machine me paraissait plus puissante que la mienne , mais la elle semble se fatiguer !!!
Comment expliquer ?
Fort intéressant ! Côté rapidité, j'arrive à la même constatation que vous. Mais ces procédures sont étonnantes car en répétant l'essai sur le même échantillon, les durées d'exécution varient beaucoup.
Quant à la dénomination pierrejean_2, elle est logique car je reprends votre structure. J'ai seulement essayé d'utiliser une formule type LC pour éviter la boucle sur les trois cellules.
Si notre ami s'inquiète un jour des suites de sa demande, il me semble que votre solution devrait retenir son attention. Le principe de celle donnée par job75 m'intéresse beaucoup, mais les précisions données par laetitia90 indiquent que son utilisation doit se faire avec précaution.
ROGER2327 #4190
Vendredi 20 Absolu 138 (Sainte Mélusine, souillarde de cuisine, SQ) 6 Vendémiaire An CCXIX 2010-W39-1T13:19:13Z
Reprenant mon idée de départ (i.e. pas d'ajout de formule), mais sans écraser les formules existantes :
Code:
[COLOR="DarkSlateGray"][B]Sub ROGER2327_3b()
Dim i&, j&, oDat, sDat(1 To 1, 3 To 5)
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With
oDat = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp).Offset(1, 4)).Value
For i = 4 To UBound(oDat, 1)
If Not IsEmpty(oDat(i, 1)) Then
For j = 3 To 5: sDat(1, j) = sDat(1, j) + oDat(i, j): Next
Else
Cells(i, 3).Resize(1, 3) = sDat
Erase sDat
End If
Next
Erase oDat
With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With
End Sub[/B][/COLOR]
Pour ajouter les formules de sommation (sans, bien sûr, écraser les formules existantes) :
Code:
[COLOR="DarkSlateGray"][B]Sub ROGER2327_2c()
Dim i&, n&
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With
n = 4
For i = n To Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
If IsEmpty(Cells(i, 3)) Then
Cells(i, 3).Resize(1, 3).FormulaR1C1 = "=SUM(R[" & n - i & "]C:R[-1]C)"
n = i + 1
End If
Next i
With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With
End Sub[/B][/COLOR]
qui est, à quelques détails d'écriture près, identique à la version pierrejean_2.
Sur ce, je laisse la question de côté pour l'instant, faute de trouver des choses plus rapides.
Remarque : Chez moi, ROGER2327_3b est (à la louche) deux fois plus rapide que ROGER2327_2c (sur les mêmes données truffées de formules, bien sûr...) Autrement dit, l'adjonction de formules coûte cher_!
ROGER2327 #4191
Vendredi 20 Absolu 138 (Sainte Mélusine, souillarde de cuisine, SQ) 6 Vendémiaire An CCXIX 2010-W39-1T16:17:03Z
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD