VBA - Somme d'une colonne ayant un nom spécifique

Bonjour à tous,

Tout d'abord, je vous remercie de votre disponibilité et de la solidarité mise en place sur ces forums

Je suis débutant en VBA et j'aimerai tout de même mettre en place une Macro.

J'aimerais que :
- Dans l'onglet "Mapping" : il soit possible de récupérer la somme des montants selon le libellé via l'onglet "Commande".

Exemple : Si la colonne à pour nom "Vente de produits alimentaires (hors TVA)" dans l'onglet "Commande" => faire la somme de cette colonne et la reporter en cellule D10 de l'onglet "Mapping".

Ainsi de suite pour les autres lignes.

Je présume qu'il faudrait passer par une boucle "horizontale" par colonne et y inclure une condition IF?

Merci à vous :)

7test-macro.zip (915.34 Ko)

Bonjour,

Pas besoin de macro pour faire une somme, la formule suivante fait ça très bien:

=SOMME(INDIRECT("Commande!"&$A10&"2:"&$A10&EQUIV("zzz";Commande!$A:$A;1)))

Maintenant si vous tenez à avoir une macro, voilà:

Option Explicit

Sub Totaux()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim i As Long, DerLig_f1 As Long, DerLig_f2 As Long
    Dim Col As Object
    Dim Plage As String
    Application.ScreenUpdating = False
    Set f1 = Sheets("Commande")
    Set f2 = Sheets("Mapping")
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
    DerLig_f2 = f2.Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To DerLig_f2
        If f2.Rows(i).Height <> 0 Then
            Set Col = f1.Range("A1:AZ1").Find(f2.Cells(i, "B"), lookat:=xlWhole)
            Plage = Range(f1.Cells(2, Col.Column), f1.Cells(DerLig_f1, Col.Column)).Address
            f2.Cells(i, "D") = Application.WorksheetFunction.Sum(f1.Range(Plage))
        End If
     Next i
     Set Col = Nothing
     Set f1 = Nothing
     Set f2 = Nothing
End Sub

Le fichier avec les 2 solutions

Cdlt

Bonsoir Arturo83,

Tout d'abord merci de votre retour.

Effectivement, la formule fonctionne très bien.

En revanche, petite interrogation : la formule est calquée sur la colonne A qui reprend le code alphabétique de la colonne.
En essayant de la modifier pour l'indexer sur la colonne B qui est le libellé, la formule ne fonctionne plus et je n'arrive pas à comprendre pourquoi ...

Votre retour m'a tout de même permis de trouver des alternatives par le biais d'une formule matricielle et/ou de la formule "Decaler/Equiv".

Je reste tout de même curieux de comprendre votre formule "somme(indirect)".

Merci à vous et bonne soirée.

MB

Bonjour,

"la formule est calquée sur la colonne A qui reprend le code alphabétique de la colonne. En essayant de la modifier pour l'indexer sur la colonne B qui est le libellé, la formule ne fonctionne plus et je n'arrive pas à comprendre pourquoi ..."

EQUIV("zzz";Commande!$A:$A;1) recherche la dernière ligne de la feuille "Commande", seule la colonne A est renseignée pour toutes les lignes puisqu'elle contient tous les ID.

***************************************************************************************************************************

"Je reste tout de même curieux de comprendre votre formule "somme(indirect)",

=SOMME(INDIRECT("Commande!"&$A10&"2:"&$A10&EQUIV("zzz";Commande!$A:$A;1))), Comme la colonne à rechercher est différente pour chaque libellé et que ces colonnes sont déjà affichées en colonne A de la feuille "Mapping", il faut donc aller chercher indirectement le nom de la feuille suivi de la plage de recherche.

Pour la première ligne de formule en E2, on pourrait écrire directement: =SOMME(Commande!I2!:I5000), mais si on fait cela, on ne peut plus recopier la formule sur les autres lignes puisque il ne s'agit plus de la colonne "I", d'où l'usage de INDIRECT pour reconstituer la plage de recherche, on prend indirectement la colonne spécifiée en "A10" suivi du N° de la première ligne suivi des 2 points de séparation, suivi de la colonne spécifiée en "A10" suivi du N° de la dernière ligne.

Si vous n'aviez pas indiquer la lettre de la colonne correspondant à chaque libellé, il aurait fallu intégrer la recherche de cette colonne dans la formule qui serait devenu alors:

=SOMME(INDIRECT("Commande!"&GAUCHE(ADRESSE(1;EQUIV($B10;Commande!$1:$1;0);4);TROUVE(1;ADRESSE(1;EQUIV($B10;Commande!$1:$1;0);4))-1)&"2:"&GAUCHE(ADRESSE(1;EQUIV($B10;Commande!$1:$1;0);4);TROUVE(1;ADRESSE(1;EQUIV($B10;Commande!$1:$1;0);4))-1)&EQUIV("zzz";Commande!$A:$A;1)))

Mais j'ai préféré vous épargner ça.

Cdlt

Bonjour,

C’est très clair pour moi.
Encore merci pour vos retours très complets.

Bonne journée !

MB

Rechercher des sujets similaires à "vba somme colonne ayant nom specifique"