VBA: progammer une somme jusqu'à une cel vide

Résolu/Fermé
PTK1210 - 13 août 2007 à 18:00
 devily - 30 mars 2008 à 19:16
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

7 réponses

Utilisateur anonyme
17 août 2007 à 15:58
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
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
Utilisateur anonyme
13 août 2007 à 19:25
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
PTK1210 Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 17 août 2007
15 août 2007 à 18:54
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
Utilisateur anonyme
15 août 2007 à 19:22
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PTK1210 Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 17 août 2007
16 août 2007 à 10:45
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
Utilisateur anonyme
16 août 2007 à 16:31
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
PTK1210 Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 17 août 2007
17 août 2007 à 15:16
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