VBA: progammer une somme jusqu'à une cel vide

Résolu
Bonjour,

Je suis novice sous VBA, ayant toujours programmé sous java (pas très utile pour Excel...) et je cherche à faire une somme sur une certaine plage de cellules avec des conditions. Cette plage comporte toutes les cellules au dessus de la cellule de travail, jusqu'à une cellule vide.

Les conditions pour cette somme: il ne faut prendre en compte que les cellules dont l'élément est différent de "à suivre" dans une cellule de la même ligne que la cellule active.

Ainsi pour l'instant j'utilise la fonction suivante: =SOMME.SI(M20:M23;"<>à suivre";H20:H23)

Mais ce n'est pas très pratique car je suis ogligé d'étendre à chaque fois mes plages à la bonne sélection. Sachant que la colonnes "M" est toujours la même, mais que la plage est différente à chaque fois.

J'espère avoir expliquer au mieux mon problème,

Merci d'avance
Configuration: Windows XP
Internet Explorer 6.0

7 réponses

  1. Bonjour,

    Heureux de voir qui mon aide ait pu te servir, c'est toujours gratifiant de savoir que ça sert.

    Pour ce qui est de site, je te recommande sans hésitation celui-ci :

    http://excelabo.net/

    Tu y trouveras de tout, des exemples tout fait, des astuces, et bien d'autres.

    Il y a aussi celui-ci :
    https://www.excel-downloads.com/

    et tu pourra trouver sur celui-ci un classeur que j'ai publié [ repère VizioXLA ].

    http://www.excel-downloads.com/telechargements/utilitaires/5-4.htm

    bien sur, il n'est pas parfait, car j'apprends tous les jours et je n'ai jamais fait de mise à jour
    depuis sa publication. Toutefois, celui-ci démontre comment jouer avec les objets Excel.

    Cordialement

    Lupin
    1
    1. bonjour,

      Dans le cadre d'une programmation pour mon cours de VBA je dois utiliser la fonction LinEst(<y>,<x>,[true/false],[true/false]).

      Je dispose de deux onglets sur mon fichier.
      le premier "indices"
      le second "actions"

      1 colonne de valeurs sur chaque onglet (colonne A) qui correspond à des rentabilités boursières hebdomadaires.

      Je cherche à utiliser cette fonction régression et à en afficher les résultats sur un onglet "régression) mais je ne parviens pas à définir les plages nécessaires...

      voici où j'en suis:

      Sub regressions()

      ligne_depart = fin_annee(1)
      ligne_fin = fin_annee(2)
      Worksheets("Actions").Activate
      Set plage_rentas = Range(Cells(ligne_depart, 1), Cells(ligne_fin, 1))
      Worksheets("Indices").Activate
      Set plage_indices = Range(Cells(ligne_depart, 1), Cells(ligne_fin, 5))

      ActiveWorkbook.Worksheets.Add
      ActiveSheet.Name = "Régression"

      Worksheets("Régression").Activate
      regress() = WorksheetFunction.LinEst(plage_rentas, plage_indices, True, True)

      End Sub

      Devant le grand nombre d'échanges que j'ai pu lire entre les membres je vois que beaucoup de pros font tourner le site, pourrais-je en bénéficier aussi? (sachant que mon niveau est u niveau scolaire : environ 30h de cours et exos d'application très basique...)

      Merci d'avance
      0
  2. Bonjour,

    Exemple :

    Sub CreerSomme()
    
        Dim Formule As String, Adresse As Long
        
        ' Somme de la colonne de [ C2 à Cx ] ou x est inconnu
        '
        Adresse = Range("C2:C65536").End(xlDown).Row
        Formule = "=SUM(C2:C" & (Adresse - 1) & ")"
        Range("C" & Adresse).Value = Formule
        
    End Sub
    '
    

    Lupin
    0
    1. Déjà merci pour ta réponse, mais cela ne marche pas trop :(

      En fait cela ne fait rien... Est ce qu'il faut que je remplace formule par la formule que je veux, à savoir sumsi ?

      D'ailleurs, je voudrais faire une somme en fonction de ce qui est écrit dans des cellules d'une autre colonne, et je ne retrouve pas cela dans ton code ???

      J'ai essayé de travailler dessus de mon côté, mais je galère pas mal, notament parce que je n'arrive pas à sélecitonner la bonne plage de cellule. Voilà le début de mon code:

      Sub AAA()
      Dim Formule As String
      Dim Ad1 As Long, Ad2 As Long

      ' Sélection des plages de cellules voulues
      Ad1 = Range(ActiveCell, ActiveCell.End(xlUp)).Select
      End Sub

      Cela sélectionne les cellules jusqu'en haut de mon tableau ce qui est bon mais j'aimerais que cela ne prenne pas la cellule active mais à partir de celle du dessus...

      Ensuite mon autre problème: je n'arrive pas à sélectionner la même plage sur la colonne en M. Je n'arrive pas à déplacer mes cellules vers cette colonne. Aucun code ne marche...

      Voilà après je pourrais faire le Sumsi, mais c'est pas gagné :)

      MErci beaucoup
      0
      1. re :

        Bonne idée d'avancer pas à pas :-)

        Sub AAA()
        
            Dim Formule As String
            Dim Ad1 As Long, Ad2 As Long
            Dim Plage As Range
            
            ' Sélection des plages de cellules voulues
            Ad1 = Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp)).Select
            
            ' ou encore
            
            'Set Plage = Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp))
            'Plage.Select
            
        End Sub
        '
        

        Lupin
        0
        1. Merci encore pour la réponse, grâce à elle,j'ai pu progresser, et je pense être pas loin de la fin :)

          Voilà la suite de mon programme:
          Sub Somme_Tx_Obso()

          Dim Formule As String
          Dim Ad1 As Long, Ad2 As Long
          Dim Cc1 As Range, Cc2 As Range
          Dim Nbr As String

          'Pour savoir où se trouve la colonne comportant les conditions
          Nbr = InputBox("A combien de colonne est M?")

          ' Sélection des plages de cellules voulues
          Set Cc1 = ActiveCell
          Set Cc2 = ActiveCell.Offset(-1, Nbr)

          Ad1 = Range(Cc1.Offset(-1, 0), Cc1.End(xlUp)).Select
          Ad2 = Range(Cc2, Cc2.End(xlUp)).Select

          'Application de la somme sur les cellules
          Formule = "=SUMIF(Ad2,<>à suivre,Ad1)"
          'Cc1.Select.Value = Formule

          End Sub

          Maintenant il me reste à résoudre le problème de la formule. Tout d'abord je ne sais pas si j'ai bien appliquer le SUMIF, et je n'arrive pas à ce que le programme écrive ma formule dans le cellule Cc1 que j'ai mémorisé ...

          Merci encore une fois pour ta préciseuse aide :)

          Sinon j'ai une autre question annexe, si ce n'est pas trop long, comment marche Range ?
          De formation Java, je me dis qu'il sagit d'une classe avec ces méthodes, mais je ne comprends pas son fonctionnement... je pense d'ailleurs que je ne comprends pas tout à fait le fonctionnement global de VBA, mais j'essaie de m'y filer :)

          Si c'est trop long, ne te prends pas la tête.

          A plus :)

          PTK1210
          0
          1. Bonjour,

            Alors voici la suite, je ne vois pas encore toute la structure de la feuille, mais enfin je te fournit
            du code pour cheminer dans cette approche.

            Sub Somme_Tx_Obso()
            
                Dim Formule As String
                Dim Ad1 As String, Ad2 As String
                Dim Cc1 As Range, Cc2 As Range
                Dim Nbr As Long
                
                'Pour savoir où se trouve la colonne comportant les conditions
                'Nbr = InputBox("A combien de colonne est M?")
                ' Si tu possède des entête de colonne,
                ' tu peux trouver la colonne recherché avec le mot de l'entête
                'Nbr = [A1:M1].Find("Mot_Clé").Column
                Nbr = [A1:X1].Find("Critères").Column
                
                'Range("A1").Column
                Range("A2").Select
                
                ' Sélection des plages de cellules voulues
                Set Cc1 = ActiveCell.Offset(0, 0)
                ' .Offset(0, 0) est implicite, mais plus détaillé pour la compréhension
                Set Cc2 = ActiveCell.Offset(-1, Nbr)
                
                Ad1 = Range(Cc1.Offset(-1, 0), Cc1.End(xlUp)).Address
                Ad2 = Range(Cc2, Cc2.End(xlUp)).Address
                
                DoEvents ' Faire évènement -> Utiliser pour point d'arrêt en mode debug
                'Application de la somme sur les cellules
                Formule = "=SUMIF(" & Ad2 & "," & Ad1 & ")"
                Cc1.Value = Formule
            
                
            End Sub
            '
            


            Pour ce qui est du mot clé [ Range ].

            Bien entendu, dans mes propres mots :

            L'objet Range permet de cibler un plage de cellules de une cellules à plusieurs cellules,
            que celle-ci soit contigu ou pas.

            Pour balayer un plage de cellule, on utilise souvent l'objet range, surtout si celles-ci
            ne sont pas contigu. Exemple, supposons qu'a l'aide de la souris tu sélectionne plusieurs
            cellule non contigu, on procède ainsi :
            Dim Plage as Range, Cellule as Range
            
            Set Plage = Selection
            
            For each Cellule in Plage
                Msgbox Cellule.Value & vbLf & Cellule.FormulaR1C1
            Next Cellule
            


            donc, quand tu rencontre le mot Range, il faut penser " Plage de cellule(s)"

            Cordialement

            Michel
            0
            1. Grâce à tes conseils, j'ai pu finir ma macro. Enfin, pour l'instant, elle satisfait mes besoins, ce qui représente un bon gain de temps :)

              Voilà mon code final. J'ai pris en compte pas mal de tes conseils :)

              Sub Somme_Tx_Obso()
                  
                  Dim Formule As String
                  Dim Ad1 As String, Ad2 As String
                  Dim Cc1 As Range, Cc2 As Range
                  Dim Nbr As Long
                 
                  'Pour savoir où se trouve la colonne comportant les conditions
                  'Nbr = InputBox("A combien de colonne est M?")
                  Nbr = ([A9:Z9].Find("Rmq").Column)
                  
                  ' Sélection des plages de cellules voulues
                  Set Cc1 = ActiveCell
                  Set Cc2 = ActiveCell.Offset(-1, (Nbr - Cc1.Column))
              
                  Ad1 = Range(Cc1.Offset(-1, 0), Cc1.End(xlUp)).Address
                  Ad2 = Range(Cc2, Cc2.End(xlUp)).Address
              
                  'Application de la somme sur les cellules
                  Formule = "=SUMIF(" & Ad2 & ",""<>à suivre""," & Ad1 & ")"
                  Cc1.Value = Formule
                  
                  Cc1.Font.Bold = True
                  Cc1.Font.Italic = True
              
                      
              End Sub


              En plus grâce à ta formule de recherche de colonne, presque tout est automatique, c'est génial !!

              Merci beaucoup pour ton aide :)

              Juste une dernière chose pour abuser jusqu'au bout :)
              Est ce que tu connaîtrais un bon site qui recense une bonne part des méthodes sous VBA, je compléterai ma formation :)

              Cordialement

              Patrick

              0