XL 2016 Addition avec condition

ZAKAO

XLDnaute Junior
Bonjour tout le monde,

J'ai besoin d'aide pour une formule que je n'arrive pas à créer, vous êtes ma dernière chance ehehe... Je vous explique mon problème : j'ai deux colonnes, une pour les codes et l'autre colonne qui contient des heures prévues du type :

Code Heures
1. = Titre 6h
1.1 = Sous-titre 2h
1.2 = Sous-titre 3h
1.2.1 = Sous-sous-titre 2h
1.2.2 = Sous-sous-titre 1h
1.3 = Sous-titre ... 1h

A la main je ne veux remplir que celles en dernières lignes (dans l'exemple: 1.1, 1.2.1, 1.2.2, et 1.3) puis la formule mettrait à jour le reste (1. et 1.2). Je ne sais pas si c'est claire mais est-ce que quelqu'un a ne serait-ce qu'une idée?

En attente de vos retours, je vous remercie d'avance ! Je vous souhaite une belle journée.
 
Solution
Voyez le fichier joint et les formules utilisant SOMME.SI dans les cellules non colorées de la colonne C.

Elles ne sont valables que si le nombre de niveaux ne dépasse pas 9 (un seul chiffre).

A delà le plus simple est d'utiliser une fonction VBA.

ZAKAO

XLDnaute Junior
Bon en doublant les formules on peut aller jusqu'à 99 niveaux (2 chiffres), fichier joint.
D'accord, c'est bon à savoir. Ce n'est pas réellement utile dans mon contexte mais peut-être pour d'autres personnes ça le sera.

Si je peux me permettre cette formule sous cette forme le rend un peu plus facile à utiliser :
VB:
=SOMME.SI(DECALER(B3;1;;10000);B3 & ".?";DECALER(C3;1;;10000))

Encore merci.
 

job75

XLDnaute Barbatruc
Si je peux me permettre cette formule sous cette forme le rend un peu plus facile à utiliser :
VB:
=SOMME.SI(DECALER(B3;1;;10000);B3 & ".?";DECALER(C3;1;;10000))
Tout à fait, il suffit alors de la copier et de la coller sur toutes les cellules concernées.

Maintenant puisque j'ai parlé de VBA voyez le fichier .xlsm joint et cette fonction :
VB:
Function SOMSI(plage As Range)
Dim x$, L%, i&
Set plage = plage.EntireColumn.Cells
x = Application.Caller.Offset(, -1) & ".*"
L = Len(x)
i = Application.Caller.Row + 1
While plage(i, 1) <> ""
    If plage(i, 1) Like x And InStr(Mid(plage(i, 1), L), ".") = 0 Then SOMSI = SOMSI + plage(i, 2)
    i = i + 1
Wend
End Function
Le code doit être placé impérativement dans un module standard.

Formule unique en C3 C4 C5 etc... =SOMSI(B:C)
 

Pièces jointes

  • Test - VBA(1).xlsm
    17.6 KB · Affichages: 4

ZAKAO

XLDnaute Junior
Tout à fait, il suffit alors de la copier et de la coller sur toutes les cellules concernées.

Maintenant puisque j'ai parlé de VBA voyez le fichier .xlsm joint et cette fonction :
VB:
Function SOMSI(plage As Range)
Dim x$, L%, i&
Set plage = plage.EntireColumn.Cells
x = Application.Caller.Offset(, -1) & ".*"
L = Len(x)
i = Application.Caller.Row + 1
While plage(i, 1) <> ""
    If plage(i, 1) Like x And InStr(Mid(plage(i, 1), L), ".") = 0 Then SOMSI = SOMSI + plage(i, 2)
    i = i + 1
Wend
End Function
Le code doit être placé impérativement dans un module standard.

Formule unique en C3 C4 C5 etc... =SOMSI(B:C)
D'accord, cela fonctionne parfaitement, jusqu'à ce qu'on insert des colonnes entre la colonne code et la colonne heure. La plage se retrouve alors faussé avec des cellules vides.

Est-ce qu'une version un peu plus souple est possible ?
 

job75

XLDnaute Barbatruc
Bonjour ZAKAO,
D'accord, cela fonctionne parfaitement, jusqu'à ce qu'on insert des colonnes entre la colonne code et la colonne heure. La plage se retrouve alors faussé avec des cellules vides.

Est-ce qu'une version un peu plus souple est possible ?
Il suffit de mettre 2 arguments à la fonction, fichier (2) :
VB:
Function SOMSI(plage1 As Range, plage2 As Range)
'plage1 et plage2 doivent avoir une seule colonne
Dim i&, x$, L%
Set plage1 = plage1.EntireColumn.Cells
Set plage2 = plage2.EntireColumn.Cells
i = Application.Caller.Row + 1
x = plage1(i - 1) & ".*"
L = Len(x)
While plage1(i, 1) <> ""
    If plage1(i) Like x And InStr(Mid(plage1(i), L), ".") = 0 Then SOMSI = SOMSI + plage2(i)
    i = i + 1
Wend
End Function
A+
 

Pièces jointes

  • Test - VBA(2).xlsm
    24 KB · Affichages: 2

ZAKAO

XLDnaute Junior
Bonjour ZAKAO,

Il suffit de mettre 2 arguments à la fonction, fichier (2) :
VB:
Function SOMSI(plage1 As Range, plage2 As Range)
'plage1 et plage2 doivent avoir une seule colonne
Dim i&, x$, L%
Set plage1 = plage1.EntireColumn.Cells
Set plage2 = plage2.EntireColumn.Cells
i = Application.Caller.Row + 1
x = plage1(i - 1) & ".*"
L = Len(x)
While plage1(i, 1) <> ""
    If plage1(i) Like x And InStr(Mid(plage1(i), L), ".") = 0 Then SOMSI = SOMSI + plage2(i)
    i = i + 1
Wend
End Function
A+
Merci beaucoup !

Bonne journée :)
 

Statistiques des forums

Discussions
312 199
Messages
2 086 159
Membres
103 147
dernier inscrit
tubaman