Insertion ligne - sous-totaux - Total

thespeedy20

XLDnaute Occasionnel
Bonjour,

Une petite aide serait la bien bien venue....
Dans mon fichier ci-Joint, une macro insère une ligne à 50 et 100... j'ai un sous-total à 50(ligne de 1 à 49) mais je n'arrive à avoir le sous-total à 100 (ligne 51 à 99).... +sous-total des 101 à 104... et pour finir en ligne 110 le total des colonnes B - C - D - E.

Puis-je avoir une aide de la part des experts de ce forum

Merci d'avance

Oli
 

Pièces jointes

  • Sous-totaux.xlsm
    21.6 KB · Affichages: 51
  • Sous-totaux.xlsm
    21.6 KB · Affichages: 48

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Re,

Dans la macro du post #13 le test avec Mod pasplus = 0 n'allait pas bien.

Je l'ai remplacé par un comptage des lignes avec la variable num.

Pour vos nouvelles demandes je verrai demain, si j'ai le temps.

A+
 

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Re,

Déjà pour ceci :

Est il possible de remettre la ligne 2 et 3 après chaque sous-total ?

je réponds NON car la solution par tableaux VBA ne peut pas formater les cellules.

Edit : je viens d'ouvrir votre dernier fichier.

Il n'a plus rien à voir avec le fichier précédent, alors je laisse tomber, j'en ai assez fait sur ce fil.

Je vous conseille d'ouvrir une autre discussion.

Bonne fin de soirée.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Bonjour Olivier, le forum,

J'avais mal regardé le fichier du post #15 :rolleyes:

Il s'agit juste de retraiter le tableau obtenu au post #13, ça ne pose pas de problème, j'étudie ça.

Bonne journée
 

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Re,

Voici la macro qui permet de créer le tableau de la feuille "Répartition" :

Code:
Sub Repartition(ncol%, nvide&, affiche As Boolean, rest(), n&)
Dim domaine, restrep(), i&, v$, j%, x$, y$, subvention&
domaine = [A2].Resize(, ncol) 'à adapter éventuellement
ReDim restrep(1 To UBound(rest), 1 To 6)
ReDim total(1 To 5)
For i = 1 To IIf(affiche, n - nvide - 1, n)
  v = rest(i, 2)
  If v <> "Sous-total" Then
    If v <> "" Then
      v = v & " " 's'il n'y a pas de prénom
      For j = 1 To Len(v) 'recherche du prénom
        x = Mid(v, j, 1): y = Mid(v, j + 1, 1)
        If x = UCase(x) And y = LCase(y) And y <> " " _
          And y <> "-" And y <> "'" Then Exit For
      Next j
      restrep(i, 1) = Trim(Left(v, j - 1)) 'nom
      restrep(i, 2) = Trim(Mid(v, j)) 'prénom
    ElseIf i > 1 Then
      restrep(i, 1) = restrep(i - 1, 1) 'copie le nom
      restrep(i, 2) = restrep(i - 1, 2) 'copie le prénom
    End If
    For j = 3 To ncol Step 2
      If rest(i, j) <> "" Then
        restrep(i, 3) = rest(i, j) 'cours
        restrep(i, 6) = domaine(1, j) 'domaine
        v = rest(i, j + 1)
        j = InStr(v & "(", "(")
        restrep(i, 4) = Left(v, j - 1) 'deg
        restrep(i, 5) = Val(Mid(v, j + 1)) 'subvention
        subvention = subvention + restrep(i, 5)
        Exit For
      End If
    Next j
  Else
    restrep(i, 1) = v 'Sous-total
    For j = 3 To ncol Step 2
      restrep(i, 3) = restrep(i, 3) + rest(i, j)
      restrep(i, 4) = restrep(i, 4) + rest(i, j + 1)
    Next j
    restrep(i, 5) = subvention: subvention = 0
    For j = 3 To 5
      total(j) = total(j) + restrep(i, j)
    Next j
  End If
Next i
'---dernière ligne---
If affiche Then
  restrep(n, 1) = "Total": restrep(n, 3) = total(3)
  restrep(n, 4) = total(4): restrep(n, 5) = total(5)
End If
'---restitution---
With Feuil2.[A2] 'CodeName
  If n Then .Resize(n, 6) = restrep
  .Offset(n).Resize(Rows.Count - n - .Row + 1, 6).ClearContents
  .EntireColumn.Resize(, 6).AutoFit 'ajustement largeur
  With .Parent.UsedRange: End With 'actualise la barre de défilement
End With
End Sub
Comme on le voit elle est paramétrée et appelée à la fin de la macro du bouton.

Fichier joint.

Il est souhaitable que dans la feuille "Cours" les noms/prénoms soient toujours triés alphabétiquement.

C'est l'objet de mon post suivant.

A+
 

Pièces jointes

  • Sous-Totaux_cours_répartition(1).xlsm
    77.3 KB · Affichages: 29
Dernière édition:

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Re,

Dans la feuille "Cours", sur l'exemple donné, les noms/prénoms sont dans l'ordre alphabétique et il n'y a pas de doublon.

Pour le cas où ce ne serait pas toujours ainsi j'ai mis dans le fichier joint un 2ème bouton avec cette macro :

Code:
Private Sub CommandButton2_Click() 'Trier et vérifier les doublons
Dim ntitres&, masque As Boolean, ncol%, t, d As Object, i&, x$, n&, mes$
ntitres = 3 'nombre de lignes de titres, modifiez aussi sur CommandButton1_Click
masque = CommandButton1.Caption Like "Masque*"
Application.ScreenUpdating = False
If masque Then CommandButton1_Click 'lance la macro pour masquer les sous-totaux
With [A1].CurrentRegion
  ncol = .Columns.Count + 1
  If .Rows.Count > ntitres And ncol > 2 Then
    With .Offset(ntitres).Resize(.Rows.Count - ntitres, ncol)
      '---tri sur les noms/prénoms---
      .Columns(ncol) = "=IF(RC2="""",T(R[-1]C),RC2)"
      .Cells(1, ncol) = .Cells(1, 2)
      .Columns(ncol) = .Columns(ncol).Value 'supprime les formules
      .Sort .Columns(ncol), xlAscending, Header:=xlNo
      .Columns(ncol) = "" 'RAZ
      '---vérification des doublons---
      t = .Columns(1).Resize(, 2) 'au moins 2 élements
      Set d = CreateObject("Scripting.Dictionary")
      d.CompareMode = vbTextCompare 'la casse est ignorée
      For i = 1 To UBound(t)
        x = t(i, 2)
        If x <> "" Then
          If d.exists(x) Then
            If n < 50 Then mes = mes & vbLf & ntitres + d(x) & " et " & ntitres + i & vbTab & x
            n = n + 1
          Else
            d(x) = i 'mémorisation de la ligne
          End If
        End If
      Next
    End With
  End If
End With
If masque Then CommandButton1_Click 'relance la macro pour afficher les sous-totaux
Application.ScreenUpdating = True
MsgBox IIf(n, "Doublons lignes :" & mes, "Aucun doublon"), , n & " doublon(s)"
End Sub
A+
 

Pièces jointes

  • Sous-Totaux_cours_répartition_ tri(1).xlsm
    80.7 KB · Affichages: 42
Dernière édition:

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Re,

Dans les 2 fichiers précédents j'ai revu la manière de séparer le nom et le prénom dans la macro Repartition.

Au lieu de m'appuyer sur le 1er espace, je m'appuie sur la 1ère lettre en minuscule.

A+
 

thespeedy20

XLDnaute Occasionnel
Re : Insertion ligne - sous-totaux - Total

Bonjour Job75,

Merci pour cet excellent projet...il fonctionne impeccablement bien...
J'ai une dernière demande... C'est de partir de la feuille répartition ( en fait qui est la feuille de départ) et d'arriver à la feuille cours avec les sous-totaux...(qui est en fait la feuille finale)...
Je te souhaite une bonne journée et un excellent we de Pâques.

Encore merci pour cet aide si précieuse...

Olivier
 

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Bonsoir thespeedy20, le forum,

Voyez ce fichier (2) avec ce code dans la feuille "Répartition" :

Code:
Option Explicit
Option Compare Text 'la casse est ignorée
Const ncol = 8 'aussi en Feuil1, à adapter

Private Sub CommandButton1_Click()
Dim domaine, affiche As Boolean, nlig As Variant, t, rest(), d As Object, i&, x$, y$, n&
domaine = Feuil1.[A2].Resize(, ncol) 'à adapter
affiche = CommandButton1.Caption Like "Affiche*"
CommandButton1.Caption = IIf(affiche, "Masquer", "Afficher") & " les sous-totaux"
Feuil1.CommandButton1.Caption = CommandButton1.Caption
Application.ScreenUpdating = False
'---tri et suppression des sous-totaux---
With Range("A1", Me.UsedRange).Resize(, 6).Offset(2)
  .Columns(1).Replace "*total*", "zzz", xlWhole
  .Sort [A3], xlAscending, [B3], , xlAscending, Header:=xlNo
End With
nlig = Application.Match("zzz", Columns(1), 0)
If IsError(nlig) Then nlig = Cells(Rows.Count, 1).End(xlUp)(2).Row
Rows(nlig & ":" & Rows.Count).ClearContents
nlig = IIf(nlig < 3, 0, nlig - 3)
If nlig Then
  t = [A1].CurrentRegion.Offset(2).Resize(nlig, 6)
  ReDim rest(1 To nlig, 1 To ncol)
  '---mémorisation des colonnes du domaine (pour accélérer)---
  Set d = CreateObject("Scripting.Dictionary")
  d.CompareMode = vbTextCompare 'sécurité, la casse est ignorée
  For i = 3 To ncol Step 2
    d(domaine(1, i)) = i
  Next i
  '---remplissage du tableau rest()---
  For i = 1 To UBound(t)
    x = UCase(Trim(t(i, 1))) & " " & Trim(t(i, 2))
    y = x
    If i > 1 Then If x = UCase(Trim(t(i - 1, 1))) & " " & Trim(t(i - 1, 2)) Then y = ""
    If y <> "" Then n = n + 1: rest(i, 1) = n 'N°ordre
    rest(i, 2) = y 'nom + prénom
    x = t(i, 6)
    If d.exists(x) Then
      rest(i, d(x)) = t(i, 3)
      rest(i, d(x) + 1) = t(i, 4) & "(" & t(i, 5) & ")"
    Else
      MsgBox "Domaine incorrect en ligne " & i + 2: End
    End If
  Next i
  '---restitution---
  Feuil1.[A4].Resize(nlig, ncol) = rest
End If
Feuil1.Rows(nlig + 4 & ":" & Feuil1.Rows.Count).ClearContents
Feuil1.SousTotauxCours affiche 'appelle la macro
End Sub
On peut donc maintenant partir de l'une ou l'autre des 2 feuilles.

Quand on clique sur le bouton le tableau de l'autre feuille est recréé.

Bonne nuit.

Edit : j'ai ajouté un message si le domaine est incorrect en colonne F car alors la ligne restituée dans la feuille "Cours" pourrait être vide, et les lignes en dessous seraient de ce fait supprimées.
 

Pièces jointes

  • Sous-Totaux_cours_répartition(2).xlsm
    82.2 KB · Affichages: 15
Dernière édition:

job75

XLDnaute Barbatruc
Re : Insertion ligne - sous-totaux - Total

Re,

Perso je préfère me passer des boutons et utiliser les touches de raccourci Ctrl+A.

Toutes les macros sont maintenant dans Module1, le début du code :

Code:
Option Explicit
Const pas = 30: Const nvide = 3 'à adapter
Const ncol = 8: Const ntitre1 = 2: Const ntitre2 = 1 'à adapter
Dim F1 As Worksheet, F2 As Worksheet

Sub Affiche_Masque()
'se lance par Ctrl+A
Dim affiche As Boolean
Set F1 = Feuil1: Set F2 = Feuil2 'CodeNames à adapter
With ActiveSheet
  If .Name <> F1.Name And .Name <> F2.Name Then Exit Sub
  If Not Application.IsLogical([AF]) Then ThisWorkbook.Names.Add "AF", False 'nom défini
  ThisWorkbook.Names.Add "AF", Not [AF]
  affiche = [AF]
  If .Name = F1.Name Then SousTotauxCours affiche Else SousTotauxRepartition affiche
End With
MsgBox "Sous-totaux et Total " & IIf(affiche, "affichés", "masqués") 'facultatif
End Sub
J'ai bien sûr revu les 3 autres macros.

Edit : j'ai remis le paramétrage du nombre de lignes de titres, pour les 2 feuilles (ntitre1 et ntitre2).

Fichier (3).

A+
 

Pièces jointes

  • Sous-Totaux_cours_répartition(3).xlsm
    76.4 KB · Affichages: 19
Dernière édition:

thespeedy20

XLDnaute Occasionnel
Re : Insertion ligne - sous-totaux - Total

Bonjour Job75,

Je tiens à te remercier chaleureusement pour le temps consacré au projet. Il convient impeccablement bien à mon usage.
Merci pour ta disponibilité.
Je pense que nous pouvons clôturer Ce sujet.
 

Discussions similaires

Réponses
12
Affichages
631
Réponses
5
Affichages
188

Statistiques des forums

Discussions
312 728
Messages
2 091 409
Membres
104 918
dernier inscrit
Laresse