VBA: progammer une somme jusqu'à une cel vide

Résolu
PTK1210 -  
 devily -
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. Utilisateur anonyme
     
    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. devily
       
      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. Utilisateur anonyme
     
    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
  3. PTK1210 Messages postés 3 Statut Membre
     
    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
  4. Utilisateur anonyme
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. PTK1210 Messages postés 3 Statut Membre
     
    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
  7. Utilisateur anonyme
     
    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
  8. PTK1210 Messages postés 3 Statut Membre
     
    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