Je débute avec Excel et comme de juste je me fais les crocs avec une gestion de budget perso pour commencer.
J'ai un tableau avec les champs Date, Montant, Solde, Catégorie, Ordre, Libellé, Pointage.
J'ai mis en place sur la colonne Montant une MFC (mise en forme conditionnelle) qui change en fonction de Pointage (Oui/Non).
J'ai mis en place des segments pour les filtres des enregistrements des champs.
Dans ma feuille où se trouve le tableau, j'ai une cellule où j'ai stocké le montant Initialisation.
Je veux avoir le Solde Banque (qui est la dernière ligne du solde Pointé)
Je veux avoir le Solde Réel (qui est la dernière ligne du solde cumulé Pointé plus Non Pointé)
La colonne C contient le Solde (avec une MFC verte pour Pointé et Rouge pour Non Pointé)
Malheureusement pour avoir le montant Pointé correspondant à celui de la Banque, quand je met dans une cellule la formule "recherche(9^9;"C:C"), je tombe systématiquement sur le solde non pointé qui est la dernière ligne réelle de mon tableau, alors que je l'ai filtré avec Pointage OUI et que sur cette dernière ligne filtrée j'ai mon solde correspondant à la Banque. Cette formule "recherche(9^9;"C:C") ne tient pas compte du filtrage.
Dois-je passer par VBA ? Est-ce possible sans ? Quelqu'un peut me donner un exemple ?
Comment enlever le filtre et resélectionner le tout ?
J'ai essayé avec ça :
VB:
Sub macOui()
' macOui Macro
' Filtrage pour Pointage
'
Dim pointe As Single
Dim DerniereLigneUtilisee As Single
ActiveSheet.ListObjects("tblSaisieOp").Range.AutoFilter Field:=10, Criteria1:="Oui"
Range(Selection, Selection.End(xlDown)).Select
DerniereLigneUtilisee = Range("C" & Rows.Count - 2).End(xlUp).Row
MsgBox (DerniereLigneUtilisee)
Range("C" & DerniereLigneUtilisee - 1).Select
pointe = ActiveCell.Value
Range("B3").Value = pointe
MsgBox (pointe)
End Sub
Sub macNon()
' macNon Macro
' Filtrage pour Solde Pointé
'
ActiveSheet.ListObjects("tblSaisieOp").Range.AutoFilter Field:=10, Criteria1:="Non"
Range(Selection, Selection.End(xlDown)).Select
Range("C383").Select
End Sub
Tu as modifié la formule que j'avais mise
=INDEX(tblSaisieOp[Solde];SOMMEPROD(MAX((tblSaisieOp[Pointage]="oui")*(LIGNE(tblSaisieOp[Solde])-14))))
Ce n'est pas un hasard si j'avais utilisé les noms des tableaux !
cette formule est dynamique et tient compte des changements (modifs ou ajouts)
Quelle formule as tu utilisée pour le nom pointe ? Une formule décaler() ?
Pointe est il une plage dynamique ??
sans ton fichier, ou un bout de fichier exemple, difficile de se prononcer, même si on entrevoit une solution !
Par exemple, la ligne du dernier oui, c'est
=sommeprod(max((pointage="oui")*(ligne(pointage)))
Si ça peut te donner des idées !
Oui c'est bien ca. La cellule C de la dernière ligne des opérations filtrées Pointées = Oui 1364.14€
Mais si je pointe une autre le lendemain, ça doit changer OK ?
Je pensais que la solution serait plus évidente pour les utilisateurs du forum.
Trouver la valeur de la dernière cellule d'une colonne filtrée (# de la dernière cellule de colonne), c'est pas fréquent ? Sans VBA c'est impossible ? Par Power BI ?
Excuse-moi, mais si la solution c'est ta formule "=sommeprod(max((pointage="oui")*(ligne(pointage)))", il faudrait que je puisse la comprendre et savoir où la mettre.
Peux-tu me développer ton idée ?
Là, je n'ai même pas essayer car je ne sais pas où la mettre
et si éventuellement je dois l'adapter car je ne la comprends pas comme déjà mentionné plus haut.
VB:
"" Je ne comprends pas ta formule. Pourquoi multiplier par la ligne de pointage qui va changer au fur et à mesure ?""
Aors, pourquoi tu demandes une formule ?
en B3, la ou tu avais 1364,14 écrit a la main !
on peut pour "expliquer" dire
qu'elle est index(solde; equiv(dernier oui; pointage;0)
equiv(dernier oui ......
dans la colonne pointage, la ligne du dernier oui , c'est le max de la matrice : (ligne(pointage)*(pointage="oui")).
c'est une matrice ou tous les non sont remplacés par des zéros.
15;16;0;0;0;20;;0;0 par exemple le max de ma matrice, c'est 20
et ta valeur, ce serait (index(solde;20)
et dans ton cas c'est ligne385 -14 =371
=INDEX(tblSaisieOp[[#Données];[#Totaux];[Solde]];371)
Je vais essayer de comprendre ça. Là tu m'as fourni plus d'informations.
Tu as regardé ma gestion des noms, il n' y aurait pas un problème avec la formule.
Quand je la met en B3, j'ai une erreur et on me demande de mettre une apostrophe devant.
Tu l'as essayée sur mon fichier TST ?
Les matrices, j'en avais entendu parler mais jamais touché.
Donc en B3 pour avoir le solde Banque (ou Solde Pointé) , j'ai mis
=INDEX(tblSaisieOp[[#Données];[#Totaux];[Solde]];371)
J'ai bien récupérer la donnée de la ligne 371
La formule, pour la rendre dynamique, je l'ai modifiée comme ceci:
=INDEX(tblSaisieOp[[#Données];[#Totaux];[Solde]];SOMMEPROD(MAX((lstPointage="oui")*(LIGNE(lstPointage)))))
(J'ai nommé lstPointage la colonne des oui/non) de J15 jusqu'à J395
Et ce n'est pas bon. J'obtiens un #REF (je pense que ma matrice est foireuse)
Tu vois une erreur ?
Finalement avec en B3 cette formule :
=@INDEX(tblSaisieOp[[#Données];[#Totaux];[Solde]];SOMMEPROD(MAX((Pointe="oui")*(LIGNE(Pointe))-1)))
je trouve le résultat attendu.
Il a fallu mettre -1 car je tombais une ligne trop bas (1ère ligne des pontages à Non.
Faut que je vérifie la longévité de la formule.
Mais je te dis encore un gros merci. Tu m'as permis de découvrir encore des choses merveilleuses dans cet excel magique
Mais quand je pointe une autre opération, le solde de la cellule B3 ne se modifie pas et je ne vois pas pourquoi ?
Je sens que le résultat n'est pas loin