Bonjour,
Grand débutant, j'ai besoin d'aide pour une formule, je vais essayer d'être précis. Je cherche à réaliser la somme de données récupéré sur plusieurs onglets (plus de 10 au final) d'un classeur. J'ai tenté d'utiliser la fonction sommeprod et rechercheV mais je coince.
Le plus est que regardiez le fichier exemple que je viens de préparer.
>Pourquoi utilise-t-on un dLig.RemoveAll ou un dCol.Remove all sur le code de la fonction SD3D triée ?
-Création de l'index lignes non trié
-Tri des clés
-Raz dictionnaire
-Création dictionnaire à nouveau mais avec les clés triées
VB:
Set dLig = CreateObject("Scripting.Dictionary") ' Index lignes
n = 0
For s = début To fin ' Parcours de toutes les feuilles
a = Sheets(s).Range(critLigne).Value ' Lecture dans un Array a()
For Each c In a
If c <> "" Then
tmp = CStr(c)
If Not dLig.exists(tmp) Then dLig(tmp) = ""
End If
Next c
Next s
crit1 = dLig.keys: Tri crit1, LBound(crit1), UBound(crit1) ' Tri des critères
dLig.RemoveAll ' Raz dictionnaire
For i = 0 To UBound(crit1): dLig(crit1(i)) = i + 1: Next ' Création index lignes trié
@job75, @BOISGONTIER
Une petite utilité potentielle complémentaire par rapport à 2 de vos exemples de propositions en introduisant un coefficient "-" devant chaque feuille pour laquelle on ne souhaite pas additionner les informations mais les retrancher.
Cela évite de modifier inutilement les tableaux.
Et avec l'utilisation de w.index plutôt que de w.name, d'avoir directement les différences entre deux journées pour contrôle de différence.
Les codes sont vraiment modifiées à la marge.
Sauf erreur, j'avais déjà vu une fonction faite par JOB75 qui permettait de traiter une différence avec la feuille précédente en se référant sur l'adresse. Là, on a plusieurs feuilles possibles et un travail sur une référence.
Puisqu'il faut un fichier .xlsm autant utiliser une fonction VBA :
VB:
Function SommeFeuilles(cible$, col%)
Application.Volatile
Dim w As Worksheet, tablo, i&
For Each w In Worksheets
If w.Name <> Application.Caller.Parent.Name Then
tablo = w.UsedRange.Resize(, col + 1) 'matrice, plus rapide
For i = 1 To UBound(tablo)
If tablo(i, col) = cible Then _
If IsNumeric(tablo(i, col + 1)) Then SommeFeuilles = SommeFeuilles + tablo(i, col + 1)
Next
End If
Next
End Function
Le code doit être placé impérativement dans un module standard.
Formule en C4 de la feuille "DONNEES", à tirer vers le bas :
Code:
=SommeFeuilles(B4;1)
Le 2ème argument indique le numéro de colonne de la recherche dans les feuilles.
La fonction est volatile : elle se recalcule quand on modifie des données dans une feuille quelconque.
Bonjour,
Je reviens vers vous car je souhaite créer la même fonction qui prendrai la colonne d'origine +3, J'ai donc repris le code VBA en cherchant à le modifier et en créant un module 2. Je renomme la fonction et modifie col +1 en col +3 mais, j'ai certainement manqué quelque chose. Pouvez vous m'aider à comprendre.
Merci par avance et bonne fin de journée
Voici le code
Function SommeFeuillesEtud(cible$, col%)
Application.Volatile
Dim w As Worksheet, tablo, i&
For Each w In Worksheets
If w.Name <> Application.Caller.Parent.Name Then
tablo = w.UsedRange.Resize(, col + 3) 'matrice, plus rapide
For i = 1 To UBound(tablo)
If CStr(tablo(i, col)) = cible Then _
If IsNumeric(tablo(i, col + 3)) Then SommeFeuillesEtud = SommeFeuillesEtud + tablo(i, col + 3)