Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Somme plage après insertion de ligne

Lone-wolf

XLDnaute Barbatruc
Bonjour à tous

Dans le fichier joint, j'ai une macro pour inserer une ligne en dessous de chaque vendredi(tous les vendredis de cette année). Ce que je n'arrive pas à faire, c'est d'inclure dans la cellule vide, en colonne B le total de la semaine. Un ch'tit coup de main serait le bienvenu.
 

Pièces jointes

  • Classeur1.xlsm
    22.2 KB · Affichages: 58
  • Classeur1.xlsm
    22.2 KB · Affichages: 72

R@chid

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

Bonjour Lone-wolf,
je ne suis pas un spécialiste en macro, mais j'ai constaté une anomalie sur cette macro, il ne faut qu'il ne s’exécute qu'une seule fois sinon il faut qu'elle prenne en compte les vendredis car si tu continues à l’exécuter comme elle est elle va pas cesser d’insérer des lignes.
 

bibba

XLDnaute Nouveau
Re : Somme plage après insertion de ligne

j'allais dire la même chose, chaque fin de semaine, quand tu vas cliquer sur ton bouton tu vas réinsérer une nouvelle ligne à chaque fois, y compris sur les semaines passées...
 

gosselien

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

Bonjour à tous,

un petit essai

P.

Code:
Sub VendrediEtRobinson()
Dim plage As Range
Dim i As Long
Dim Last As Long
Last = [A65000].End(xlUp).Row
Application.ScreenUpdating = False
  For i = Last To 2 Step -1
    If Weekday(Cells(i, 1)) = 2 Then ' sous le vendredi
      Cells(i, 1).EntireRow.Insert shift:=xlDown
    End If
  Next i
totaux
End Sub


Sub totaux()
Dim Last As Long
Last = [A65000].End(xlUp).Row + 1
For i = Last To 2 Step -1
  If Weekday(Cells(i, 1)) = 6 Then
    Cells(i + 1, 2).FormulaR1C1 = "=SUM(R[-1]C:R[-5]C)"
  End If
Next
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

Bonjour Lone-wolf, R@chid, gosselien,

Avec des tableaux VBA c'est très rapide :

Code:
Sub SousTotaux()
Dim P As Range, t, rest(), i&, n&, a#, b#, c#, d#
With Feuil1 'CodeName
  Set P = .Range("A2:B" & .Range("A" & .Rows.Count).End(xlUp)(2).Row)
End With
On Error Resume Next
P.Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
P.Columns(1).SpecialCells(xlCellTypeConstants, 2).EntireRow.Delete
t = P 'matrice, plus rapide
On Error GoTo 0
If Not IsArray(t) Then Exit Sub
ReDim rest(1 To 1 + Int(1.2 * UBound(t)), 1 To 2)
For i = 1 To UBound(t)
  n = n + 1
  rest(n, 1) = t(i, 1)
  rest(n, 2) = t(i, 2)
  If i Mod 5 = 0 Then
    n = n + 1
    'rest(n, 1) = "S/TOTAL" 'facultatif, je vous laisse tester
    a = Val(Replace(t(i - 4, 2), ",", ".")): b = Val(Replace(t(i - 3, 2), ",", "."))
    c = Val(Replace(t(i - 2, 2), ",", ".")): d = Val(Replace(t(i - 1, 2), ",", "."))
    rest(n, 2) = a + b + c + d + Val(Replace(t(i, 2), ",", "."))
  End If
Next
P.Resize(n) = rest
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Sous-totaux(1).xlsm
    24.2 KB · Affichages: 40
  • Sous-totaux(1).xlsm
    24.2 KB · Affichages: 45

job75

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

Re,

Pour le fun j'ai testé un tableau de 100 000 lignes - ça nous emmène jusqu'en 2399

La macro s'exécute chez moi en 1,4 seconde, mais si l'on clique de nouveau sur le bouton la suppression des lignes par les SpecialCells prend un temps fou.

Il faut donc faire un tri sur la colonne A avant ces suppressions :

Code:
Sub SousTotaux()
Dim dur#, P As Range, t, rest(), i&, n&, a#, b#, c#, d#
dur = Timer
With Feuil1 'CodeName
  Set P = .Range("A2:B" & .Range("A" & .Rows.Count).End(xlUp)(2).Row)
End With
P.Sort P(1), xlAscending, Header:=xlNo 'tri pour accélérer
On Error Resume Next
P.Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
P.Columns(1).SpecialCells(xlCellTypeConstants, 2).EntireRow.Delete
t = P 'matrice, plus rapide
On Error GoTo 0
If Not IsArray(t) Then Exit Sub
ReDim rest(1 To 1 + Int(1.2 * UBound(t)), 1 To 2)
For i = 1 To UBound(t)
  n = n + 1
  rest(n, 1) = t(i, 1)
  rest(n, 2) = t(i, 2)
  If i Mod 5 = 0 Then
    n = n + 1
    'rest(n, 1) = "S/TOTAL" 'facultatif, je vous laisse tester
    a = Val(Replace(t(i - 4, 2), ",", ".")): b = Val(Replace(t(i - 3, 2), ",", "."))
    c = Val(Replace(t(i - 2, 2), ",", ".")): d = Val(Replace(t(i - 1, 2), ",", "."))
    rest(n, 2) = a + b + c + d + Val(Replace(t(i, 2), ",", "."))
  End If
Next
P.Resize(n) = rest
MsgBox "Durée " & Format(Timer - dur, "0.00 \s") 'mesure facultative
End Sub
Fichier zippé joint.

A+
 

Pièces jointes

  • Sous-totaux 100 000 lignes(1).zip
    700 KB · Affichages: 34
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

Bonsoir à tous
R@chid, bibba, gosselien, job
moi-même

@R@chid et bibba: c'est vrai que je n'ai pas testé la macro à plusieures reprises, merci de m'avoir avverti.

@gosselien et job: je testerais sur mon ordi, là je suis sur l'ordi de ma fille; mon gamin à encore fait des siennes
 

Lone-wolf

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

Bonsoir job, gosselien

avec mon portable pour le tableau de 100000 lignes, j'arrive à environ 5 sec. Mais bon, comme il n'a pas un moteur de 500 chevaux, c'est compréhensible. Et pour ma part, faut déjà espérer que j'arrive à la retraite.

@gosselien: même problème que le mien, en recliquant sur le bouton, elle insère une ligne.

Merci à tous les deux en tout cas
 

Pièces jointes

  • top.gif
    9 KB · Affichages: 43
  • prier.gif
    10.6 KB · Affichages: 46

Bebere

XLDnaute Barbatruc
Re : Somme plage après insertion de ligne

bonjour lonewolf,Job,Rachid,Gosselien
une autre solution
 

Discussions similaires

Réponses
7
Affichages
577
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…