IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Créer une ligne en fin de plage dynamique faisant la somme des cellules de la colonne [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 123
    Points : 9 951
    Points
    9 951
    Billets dans le blog
    5
    Par défaut Créer une ligne en fin de plage dynamique faisant la somme des cellules de la colonne
    Bonjour à tous,

    je développe actuellement une application excel pour saisir des données dans une base, et ensuite les extraire au moyen d'outils statistiques pré configurés en VBA (l'utilisateur n'a qu'à cliquer sur le type d'extraction qu'il souhaite).

    Tout fonctionne parfaitement :

    - identification de la plage dans la BDD
    - extraction de la plage vers une autre feuille
    - projection dans un listview mis en forme

    Je voulais ajouter à la fin de la plage selectionnée une ligne contenant la somme (ou la moyenne... mais j'en ferai mon affaire dès que j'aurai une solution pour l'addition).

    Ce qui me bloque : je ne sais pas comment transformer mon code pour dire que je veux la somme des cellules au dessus.

    Voici mon code, j'arrive déjà à insérer le mot "test" dans cette fameuse dernière ligne, et je remercie par avance toute personne qui puisse m'indiquer comment changer cette chaine de caractère en "additionne l'ensemble des cellules du dessus" ==> les lignes du code qui me bloquent sont en rouge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Sub CommandButton11_Click()
    
    Dim i As Integer
    Dim j As Integer
    Dim MyCell As Range
    
    Sheets("feuil1").Cells.Clear
    Sheets(ComboBox3.Value).Activate                               ' on active la feuille portant le nom du gestionnaire qui a été sélectionné
        For i = 3 To 360                                           ' définition des paramètres de la boucle i (on commence en A3 et on prévoit jusqu'à 357 dates rentrées)
            If Range("A" & i).Value = CDate(ComboBox1.Value) Then  ' cherche la cellule en A qui contient la date de début de l'extraction
               Range("A" & i).Select                               ' selectionne la cellule
            Set MyCell = Range("A" & i)                            ' cette cellule est maintenant appelée "MyCell"
                For j = 3 To 360                                   ' définition des paramètres de la boucle j (on commence en A3 et on prévoit jusqu'à 357 dates rentrées)
                    If Range("A" & j).Value = CDate(ComboBox2.Value) Then ' si la cellule en colonne A portant le numéro j contient la date de fin de l'extraction
                       Range("A" & j).Select                       ' alors on sélectionne la cellule (possibilité de l'appeler MyCell2 comme pour MyCell)
                       Sheets("feuil1").Range("A3", "H" & (j - i) + 3).Value = Range(MyCell, ActiveCell.Offset(0, 7)).Value  ' on transfère les données de la plage dynamique dans la feuil1 en "réservant" les deux premières lignes
                       Sheets("feuil1").Range("A1", "H2").Value = Sheets(ComboBox3.Value).Range("A1", "H2").Value ' on rempli les deux premières lignes avec les titres du tableau de données
                       Sheets("feuil1").Range("A65536").End(xlUp)(2) = "Total/Moyenne"  ' on ajoute une dernière ligne avec ces valeurs
                       Sheets("feuil1").Range("B65536").End(xlUp)(2) = "test"
                       Sheets("feuil1").Range("C65536").End(xlUp)(2) = "test"
                       Sheets("feuil1").Range("D65536").End(xlUp)(2) = "test"
                       Sheets("feuil1").Range("E65536").End(xlUp)(2) = "test"
                       Sheets("feuil1").Range("F65536").End(xlUp)(2) = "test"
                       Sheets("feuil1").Range("G65536").End(xlUp)(2) = "test"
                       Sheets("feuil1").Range("H65536").End(xlUp)(2) = "test"
                    End If
                Next j
            End If
        Next i
    End Sub
    Cordialement,

    joe.levrai

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Je n'ai pas testé mais ça devrait resembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Private Sub CommandButton11_Click()
     
        Dim i As Integer
        Dim j As Integer
        Dim MyCell As Range
     
        Sheets("feuil1").Cells.Clear
     
        Sheets(ComboBox3.Value).Activate ' on active la feuille portant le nom du gestionnaire qui a été sélectionné
     
        For i = 3 To 360 ' définition des paramètres de la boucle i (on commence en A3 et on prévoit jusqu'à 357 dates rentrées)
     
            If Range("A" & i).Value = CDate(ComboBox1.Value) Then ' cherche la cellule en A qui contient la date de début de l'extraction
     
                Set MyCell = Range("A" & i) ' cette cellule est maintenant appelée "MyCell"
     
                For j = 3 To 360 ' définition des paramètres de la boucle j (on commence en A3 et on prévoit jusqu'à 357 dates rentrées)
     
                    If Range("A" & j).Value = CDate(ComboBox2.Value) Then ' si la cellule en colonne A portant le numéro j contient la date de fin de l'extraction
     
                        With Sheets("feuil1")
     
                            .Range("A3", "H" & (j - i) + 3).Value = Range(MyCell, Range("A" & j).Offset(0, 7)).Value ' on transfère les données de la plage dynamique dans la feuil1 en "réservant" les deux premières lignes
                            .Range("A1", "H2").Value = Sheets(ComboBox3.Value).Range("A1", "H2").Value ' on rempli les deux premières lignes avec les titres du tableau de données
     
                            .Range("A65536").End(xlUp)(2) = "Total/Moyenne" ' on ajoute une dernière ligne avec ces valeurs
                            'AVERAGE pour la moyenne à la place de SUM
                            .Range("B65536").End(xlUp)(2).Formula = "=SUM(B3:" & Fe.Range("B65536").End(xlUp).Address(0, 0) & ")"
                            .Range("C65536").End(xlUp)(2).Formula = "=SUM(C3:" & Fe.Range("C65536").End(xlUp).Address(0, 0) & ")"
                            .Range("D65536").End(xlUp)(2).Formula = "=SUM(D3:" & Fe.Range("D65536").End(xlUp).Address(0, 0) & ")"
                            .Range("E65536").End(xlUp)(2).Formula = "=SUM(E3:" & Fe.Range("E65536").End(xlUp).Address(0, 0) & ")"
                            .Range("F65536").End(xlUp)(2).Formula = "=SUM(F3:" & Fe.Range("F65536").End(xlUp).Address(0, 0) & ")"
                            .Range("G65536").End(xlUp)(2).Formula = "=SUM(G3:" & Fe.Range("G65536").End(xlUp).Address(0, 0) & ")"
                            .Range("H65536").End(xlUp)(2).Formula = "=SUM(H3:" & Fe.Range("H65536").End(xlUp).Address(0, 0) & ")"
     
                        End With
     
                    End If
     
                Next j
     
            End If
     
        Next i
     
    End Sub
    Hervé.

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 123
    Points : 9 951
    Points
    9 951
    Billets dans le blog
    5
    Par défaut
    Bonjour Theze,

    merci de t'être penché sur la question !

    hélas, je rencontre un message d'erreur à partir de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("B65536").End(xlUp)(2).Formula = "=SUM(B3:" & Fe.Range("B65536").End(xlUp).Address(0, 0) & ")"
    Apparement il aime pas ton Fe.Range, le message d'erreur est :
    erreur de compilation, projet ou bibliothèque introuvable.

    Je ne sais pas si ce "Fe" est une variable, une instruction ou une propriété (je suis en train de chercher sur internet)... ce qui m'empêche de comprendre comment résoudre ceci.

    Question supplémentaire : si d'aventure je souhaite faire la somme des cellules au dessus SAUF les deux premières lignes, j'ai juste à modifier les paramètres de l'instruction "Address(0, 0) ? (comme pour le moment j'ai un message d'erreur, je ne peux pas le vérifier )

  4. #4
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 123
    Points : 9 951
    Points
    9 951
    Billets dans le blog
    5
    Par défaut
    J'ai remplacé "FE" par le nom de la feuille et ça semble régler la situation.

    En revenche :

    - il me fait la somme de d'une plage fixe (en incluant dans la plage la cellule qui contient le résultat) ==> je vais faire des tests à ce sujet.

    En fait il fait la somme de la cellule B3 à B18 , de C3 à C18 etc... quelle que soit le nombre réel de lignes contenu dans ma plage dynamique.


    Si vraiment je bloque je reviens sur le fil pour continuer l'aide
    Si j'arrive à trifouiller et que ça marche, je reviens aussi mais confirmer que c'est résolu.

    Edit : après test, je m'apperçois qu'il fait la somme des cellules allant de B3 à "B" & k ==> k étant le nombre de lignes que contient la base de donnée.

    Donc si j'ai 18 lignes dans ma base de donnée, il fera la somme de B3 à B18
    si j'ai 19 lignes, il fera de B3 à B19 etc....

    Si ça peut aiguiller les personnes détenant une clé de résolution...

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 123
    Points : 9 951
    Points
    9 951
    Billets dans le blog
    5
    Par défaut
    J'ai identifié le problème.

    en exemple sur ta première ligne faisant la somme des "B" non vides en excluant les 2 premières lignes, celle là ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("B65536").End(xlUp)(2).Formula = "=SUM(B3:" & Fe.Range("B65536").End(xlUp).Address(0, 0) & ")"
    Etant donné qu'à cet instant, la feuille active est la BDD, il faut préciser dans la deuxième partie de l'égalité sur quelle feuille on travaille. Sans ça, il va compter la plage totale de la BDD, au lieu de compter la plage qu'on a exporté vers "feuil1" !

    j'ai donc viré le "with" (y'a que 8 fois la même ligne à mettre après tout....) et j'ai indiqué où je voulais faire les comptes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("feuil1").Range("B65536").End(xlUp)(2).Formula = "=SUM(B3:" & Range("feuil1!B65536").End(xlUp).Address(0, 0) & ")"
    Je ne sais pas si mon explication est bonne (me reprendre si c'est le cas), mais en tout cas mon problème semble résolu.

    Merci du coup de main

    Ps : Je n'ai pas testé s'il fallait impérativement indiquer la feuil pour la cellule "B3" (puisque ça n'a pas d'incidence sur mon application si tel est le cas), mais je préviens au cas où cette discussion puisse servir à d'autres.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Créer une ligne dynamiquement
    Par Lenaick dans le forum Langage
    Réponses: 11
    Dernier message: 24/01/2007, 10h58
  2. [Tkinter] Créer une ligne en pointillée
    Par frky dans le forum Tkinter
    Réponses: 5
    Dernier message: 05/01/2006, 19h04
  3. Créer une ligne dans une table (en 1ere position)
    Par lipao17 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/12/2005, 11h09
  4. Ajouter une ligne à la fin d'un classeur excel
    Par maketossss dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/11/2005, 09h38
  5. MFC - créer une ligne de séparation
    Par Amphitryon dans le forum MFC
    Réponses: 4
    Dernier message: 25/11/2004, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo