[Déplacé .NET -> VBA]Excel, somme de cellule à x endroits. [Résolu]

Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
- - Dernière réponse : ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 9 oct. 2011 à 13:26
Salut a tous.

Voilà, je ne vois pas comment m'y prendre pour ce truc.

Je voudrais faire un prog capable de de réalisé ceci:

Je souhaite en cellule Ax (x variable en fonction du nombre de ligne la précédent et d'un autre petit programme) faire la somme de y cellules positionnées avant.
Ces y cellules ne se touche pas, elle sont sur la même colonne mais séparé de 13 lignes à chaque fois.

y est variable

Comment en VBA entrer la bonne formule en Ax?

Merci.
Afficher la suite 

19 réponses

Meilleure réponse
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
3
Merci
Oui, Union est une bonne solution.
Exemple de concaténation de deux ranges :
    Dim oRange  As Range
    Set oRange = Range("B2:B5")
    Set oRange = Union(oRange, Range("D2:D4"))
    Range("A2").Formula = "= SUM(" & oRange.Address & ")"
mais Union peut être répété avec encore bien d'autres ranges

Ton problème est que l'enregistreur de macro fournit des références R1C1 et qu'il est plus facile de travailler avec des appellations comme "B2". Il va s'en dire que dans ce cas, la fonction n'est pas exactement la même (.Formula et pas .FormulaR1C1)

Voir aussi dans l'aide la propriété .Offset d'un Range qui permet de désigner une cellule relativement à une autre.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonjour,

- Tu ne développes donc pas sous VB.Net, mais sous VBA (le VBA de Excel). Prends dorénavant le plus grand soin, s'il te plait, au choix de la section dans laquelle du "postes".

- A défaut de précisions plus claires et exactes sur les tenants de ton problème, je ne peux que t'inviter à utiliser dans une formule la fonction Excel SOMME

Si pas ce que tu attendais ===>> sois beaucoup plus précises sur les tenants et aboutissants.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
0
Merci
Merci d'avoir déplacé le post mais je me suis perdu dans le forum.... Milles excuses.

je veux bien utiliser la formule "somme" pas de souci. Mais voila, la formule que je dois mettre est à un moment:

si y = 7(cellules) et cellules éloigné de 2 lignes

ActiveCell.FormulaR1C1 = _
"=SUM(R[-2]C,R[-4]C,R[-6]C,R[-8]C,R[-10]C,R[-12]C,R[-14]C)"
ou (identique)
ActiveCell.FormulaR1C1 = "=R[-2]C+R[-4]C+R[-6]C+R[-8]C+R[-10]C+R[-12]C+R[-14]C"

ou si y = 3

ActiveCell.FormulaR1C1 = _
"=SUM(R[-2]C,R[-4]C,R[-6]C)"
ou (identique)
ActiveCell.FormulaR1C1 = "=R[-2]C+R[-4]C+R[-6]C"

En faite, le nombre de cellule a additioner et fonction de y et y peut être 0 comme 200,3000....

Mais je ne sais pas comment m'y prendre pour que la fonction de calcul soit écrite automatiquement en Ax.

Je sais définir y et x sans problème mais pas la fonction mathématique....

Help....
Commenter la réponse de blackphenix45
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
Salut

Enregistre une macro pendant que tu fais la manip à la main :
- Tu cliques dans une cellule vide
- tu tapes =SOMME
- tu vas cliquer sur la première cellule
- En maintenant la touche Ctrl appuyée, tu vas cliquer sur les X autres cellules
- tu tapes la parenthèses de fermeture de SOMME si besoin et tu valides.
L'enregistreur de macro te fournira le code nécessaire (dans Module).
A toi ensuite de regarder la syntaxe particulière de la sélection de zone (Range) non contigües et de l'adapter à tes besoins.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
0
Merci
Je l'ai déjà fait et c'est comme ça que j'ai eu les formules déjà cité.

Mais le truc important pour moi c'est le nombre de cellule à ajouter. Ce nombre y n'est pas toujours le même et le programme de création de formule doit en tenir compte.

Je voudrais donc être aidé pour créer ce programme vba.
Commenter la réponse de blackphenix45
Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
0
Merci
Je viens de tester ceci:

Dim cel
Dim i As Integer
Dim n As Integer

Sub test()

i = 1
n = InputBox("combien de cellule à ajouter ?")
Set cel = Range("a" & i)

Do
Set cel = Union(cel, Range("a" & i))
i = i + 2
Loop Until i - 2 = 2 * n - 1

Range("A32").Select
ActiveCell.FormulaR1C1 = "=SUM(" & cel & ")"

End Sub

Je ne doit pas bien utilisé "union" ou j'chai pas quoi.
Commenter la réponse de blackphenix45
Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
0
Merci
Bon j'ai réussi à faire le programme mais celui-ci s'arrete à la 32eme cellule ajouté par union alors que je souhaite min 125. Y a til une limite de cellule qu'une variable range puisse stocker?
Commenter la réponse de blackphenix45
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
Seule l'aide pourra te répondre
Tu dois pouvoir crées une pyramide de Union :
Un Union avec les 20 premières cellules
Un autre avec les 20 suivantes
...
et un Union final avec les x Unions précédents, ça doit pouvoir marcher.
Au pire, tu parcelles tes données en paquets de 20 et tu exécutes ta fonction X fois.
Commenter la réponse de cs_Jack
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonsoir,

Je ne connais pas de limite en ce qui concerne le nombre de "areas" d'une plage constituée à l'aide de Union.
Je n'en ai pas trouvé, pour être précis, alors que je m'intéressais de très près à la chose dans le cadre d'un source que j'ai très récemment déposé.
La seule véritable limite que j'ai trouvée dans ce domaine (et que j'ai d'ailleurs "contrecarré" en utilisant la méthode Union traditionnelle) concernait le nombre d' "areas" d'une plage obtenue par recensement des "specialcells" de Excel.
Le problème me parait donc venu d'ailleurs. Mais d'où ? le seul code montré n'est pas suffisant pour le déterminer. Il nous faudrait voir dans son ensemble la totalité de la partie du code concerné, tel qu'il a été écrit et tel qu'il aboutit à cette constatation.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Il n'est par contre pas impossible (mais ce serait là un aspect différent) que l'utilisation de SUM rencontre, elle, quelques difficultés en cas de "zones" (areas) d'un nombre trop élevé.
Mais là encore, seul l'exposé complet du code nous permettrait d'en faire un constat et, le cas échant, de trouver la parade la meilleure (la moins pénalisante)



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
Avec quel code arrives-tu à cette limite ?
Perso, je viens de tester 42 Union à la suite sans aucun problème.
Commenter la réponse de cs_Jack
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Perso, je viens de tester 42 Union à la suite sans aucun problème.

Salut, Jack

C'est certain ! je suis arrivé à plus de 65000 sans aucun problème.
Ce n'est donc pas à la constitution de la plage, qu'il y a problème, mais peut-être à son utilisation avec SUM

Son code est devenu essentiel, en effet


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Et voilà qui semble (je dis bien semble) corroborer ce que je soupçonne :

expression.Sum(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)

expression Variable représentant un objet WorksheetFunction.

Paramètres

Nom Obligatoire/Facultatif Type de données Description
Arg1 - Arg30 Obligatoire Variante Number1, number2, ... - 1 à 30 arguments pour lesquels vous voulez connaître la valeur totale ou le total.

Valeur renvoyée
Double

Remarques


Nombres, valeurs logiques et représentations textuelles des nombres que vous saisissez directement dans la liste des arguments pris en compte. Reportez-vous au premier et au deuxième exemples ci-dessous.
Si un argument est un tableau de référence, seuls les nombres dans ce tableau ou cette référence sont pris en compte. Les cellules vides, les valeurs logiques ou le texte dans le tableau ou la référence sont ignorés. Reportez-vous au troisième exemple ci-dessous.
Les arguments qui comportent des valeurs d'erreur ou du texte qui ne peuvent pas être convertis en nombres génèrent des erreurs.

Son code m'intéresse vraiment. Et je compte bien m'obstiner à trouver la meilleure parade.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Son code nous permettra par ailleurs de vérifier (sait-on jamais) qu'il ne génère pas de références circulaires.
Vraiment ! Assurément : son code (voire son fichier, carrément) est devenu indispensable à ce niveau.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Et une autre chose m'(inquiète également.
Bien que la "limite de 32" "dénoncée" ne soit pas concernée par cette "chose" :

Citation :
En faite, le nombre de cellule a additioner et fonction de y et y peut être 0 comme 200,3000..


Il se trouve que la fonction SUM utilisée dans une formule (essai manuel le prouvant) ne peut additionner plus de 255 nombres distinctement définis où par référence à des cellules distinctement désignées.

Voilà qui fait beaucoup de points d'interrogation, me paraît-il.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bon,

J"'ai déjà une parade efficace et très rapide (dans tous les cas de figure) pour faire cette somme (sans la faire en boucle) en utilisant la fonction SUM, mais pas dans une formule.
Nous n'attendons plus que le demandeur et ... son code.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
0
Merci
Voici mon code:

Dim r1 As Range
Dim l1 As Long
Dim oLigne As Long
Dim c1 As Integer
Dim multiplerange As Range
Dim n As Integer
Dim nligne As Long
Dim compteur_boucle_colonne As Integer
Dim oLigneCalcul As Long
Dim compteur_calcul_cellule As Integer
Dim colonne As String
Dim compteur_position_sur_ligne As Integer
Sub boucle_remplissage_ligne_tableau()

compteur_position_sur_ligne = 1

'On Error GoTo 1
nligne = InputBox("Combien de ligne du tableau à comptabiliser ?")
'If nligne = 0 Then GoTo 1
'On Error GoTo 1
n = InputBox("Combien de cellules à ajouter?")
'If n = 0 Then GoTo 1

Do

If compteur_position_sur_ligne 1 Then colonne "d"
If compteur_position_sur_ligne 2 Then colonne "e"
If compteur_position_sur_ligne 3 Then colonne "f"
If compteur_position_sur_ligne 4 Then colonne "g"
If compteur_position_sur_ligne 5 Then colonne "h"
If compteur_position_sur_ligne 6 Then colonne "i"
If compteur_position_sur_ligne 7 Then colonne "j"
If compteur_position_sur_ligne 8 Then colonne "k"
'If compteur_position_sur_ligne 9 Then colonne "I"
'If compteur_position_sur_ligne 10 Then colonne "J"

Call boucle_remplissage_colonne_tableau
compteur_position_sur_ligne = compteur_position_sur_ligne + 1

Loop Until compteur_position_sur_ligne = 9

1 End Sub
Sub boucle_remplissage_colonne_tableau()

compteur_boucle_colonne = 0
oLigne = 2290 'Attention ici, 41 est la ligne de départ du décompte!!

l1 = oLigne

Do
compteur_boucle_colonne = compteur_boucle_colonne + 1

Call Creation_Formule

l1 = l1 + 1

Loop Until compteur_boucle_colonne = nligne

End Sub
Sub Creation_Formule()

'creation de la formule additionnant x cellules de la même colonne dans une cellule précise. Attention, formule bloqué
'sur l'originale en cas de copie sur autre cellule.

oLigneCalcul = l1 - 18
compteur_calcul_cellule = 0

Set r1 = Range(colonne & oLigneCalcul)

Set multiplerange = r1

Do

compteur_calcul_cellule = compteur_calcul_cellule + 1
'If oLigneCalcul < 0 Then GoTo 2
Set r1 = Range(colonne & oLigneCalcul)
Set multiplerange = Union(multiplerange, r1)

oLigneCalcul = oLigneCalcul - 18

Loop Until n = compteur_calcul_cellule

2 Range(colonne & l1).Formula = "=Sum(" & multiplerange.Address & ")"

End Sub

Bon, je débute, il y avait certainement mieux et plus simple ou plus rapide mais bon. merci de votre aide.
Commenter la réponse de blackphenix45
Messages postés
7
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
9 octobre 2011
0
Merci
Alors une idée?
Commenter la réponse de blackphenix45
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonjoiur,

1) apprends à présenter ici un code mis en forme (balises code) et indenté ('sinon : je ne le regarde en principe même pas).
2) nettoie ton code de tout dce qui ne doit pas être exécute (inutile de nous montrer ce que tu as mis en commentaires, donc )
3) essaye (au moins) d'en "extirper" la logique
Reviens ensuite.
Merci.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu