Comment rechercher des itérations conditionnelles? [Résolu]

Ghost

XLDnaute Nouveau
Bonjour,

Je sollicite votre aide étant bloqué sur un soucis de taille: un petit tableau de plus de 4000 lignes sur une 15aines de colones, impossible à utiliser en tant que tel.

Voici mon tableau de départ :

Code:
            A               B                    C
1     Semaine            Agence 1          Agence 2…
2         25             Monsieur A
3         25
4         25             Monsieur B
5         25             Monsieur A
6         26
7         26             Monsieur B
8         26             Monsieur B
9         27             Monsieur A
10        27             Monsieur C
...

Dans ce cas, je souhaites obtenir les valeurs comme ci desous. C'est à dire le nombre de personnes qui ont travaillés pour l’Agence 1:

Agence 1
Semaine 25 : 2 (personnes)
Semaine 26 : 1 (personne)
Semaine 27 : 2 (personnes)

J’ai cherché plusieurs solutions pour obtenir ce résultat en utilisant cette formule, sans résultats :
Code:
=SOMMEPROD(1/NB.SI($B$2:$B$4000;$B$2:$B$4000))

Mais dans ce cas je n’arrive pas à intégrer la condition de semaine et obtiens toujours 3 quelque soit la formule ou les conditions que j'ajoute dans mon exemple.

Si quelqu’un aurait une idée, je suis preneur.

Merci à vous par avance
 

Pièces jointes

  • Exemple.xls
    60.5 KB · Affichages: 40
  • Exemple.xls
    60.5 KB · Affichages: 41
  • Exemple.xls
    60.5 KB · Affichages: 56
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Comment rechercher des itérations conditionnelles?

Bonjour le fil, bonjour le forum,

Je me bats aussi pour qu'on fournisse un fichier exemple. Je m'excuse donc, Papou, car quand j'ai commencé à me pencher sur le problème de Ghost je navet pas vu ta réponse et, malgré l'absence de fichier, je me suis lancé...
Une solution VBA, mais je suis sûr que nos Balèzules (balèzes en formules) vont te dépatouiller, Ghost, beaucoup simplement...
Le code :

Code:
Sub Macro1()
Dim O1 As Object 'déclare la variable O1 (Onglet 1)
Dim O2 As Object 'déclare la variable O1 (Onglet 2)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim DC As Integer 'déclare la variable DC (Dernière Colonne)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim J As Integer 'déclare la variable J (incrément)
Dim NB As Integer 'déclare la variable NB (NomBre)
Dim PLV As Range 'déclare la variable PLV (PLage Visible)

Set O1 = Sheets("Feuil1") 'définit l'onglet O1
Set O2 = Sheets("Feuil2") 'définit l'onglet O2
O2.Range("A1").CurrentRegion.ClearContents 'supprime d'éventuelles anciennes données
DL = O1.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O1
Set PL = O1.Range("A2:A" & DL) 'définit la plage PL
DC = O1.Cells(1, Application.Columns.Count).End(xlToLeft).Column 'définit la dernière colonne éditée DC de la ligne 1 de l'onglet O1
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
    D(CEL.Value) = "" 'alimente le dictionnaire D
Next CEL 'prochaine cellule de la boucle
TMP = D.keys 'récupère dans le tableau temp[oraire TMP les valeurs uniques de la palge PL (sans doublon)
For I = 2 To DC 'boucle 1 : de la colonne 2 à la dernière colonne éditée DC (=agence)
    Set DEST = O2.Cells(1, ((I - 2) * 2) + 1) 'définit la cellule de destination dans l'onglet O2
    DEST.Value = O1.Cells(1, I) 'récupère dans DEST le numéro de l'agence
    For J = 0 To UBound(TMP) 'boucle 2 : sur toutes les valeurs(uniques) du tableau TMP (=semaine)
        NB = 0 'initialise le nombre NB
        O1.Range("A1").AutoFilter Field:=1, Criteria1:=TMP(J) 'filte la colonne 1 (=A) de l'onglet O1 avec TMP(I) comme critère (=numéro de semaine)
        Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (=plage des cellules visibles, non filtrées, de la palge PL)
        NB = Application.WorksheetFunction.CountA(PLV.Offset(0, I - 1)) 'définit le nombre de valeurs (cellule non vides) contenues dans la plage PLV
        Set DEST = DEST.Offset(1, 0) 'redéfinit la cellule de destination DEST
        DEST.Value = "Semaine " & TMP(J) 'récupère dans DEST le numéro de semaines
        DEST.Offset(0, 1).Value = NB & IIf(NB > 1, " (personnes)", " (personne)") 'récupère dans la cellule adjacente à DEST le nombre NB
        O1.Range("A1").AutoFilter 'supprime le filtre automatique
    Next J 'prochaine valeur unique de la boucle 2 (=prochaine semaine)
Next I 'prohaine colonne de la boucle 1 (=prochaine agence)
End Sub
 

Paritec

XLDnaute Barbatruc
Re : Comment rechercher des itérations conditionnelles?

Bonjour Robert:eek: ghost le forum
Robert:eek: pas de problème avec toi Robert:eek: je sais comment tu es et avec quelle gentillesse tu fais les choses
et en plus il aura un code commenté, ce que je n'aurais pas fait!!!
a+
Papou:eek:

EDIT: Bonjour Jean Marcel:eek: bah oui toujours les mêmes demandes!!! de tous!!!
 

Ghost

XLDnaute Nouveau
Re : Comment rechercher des itérations conditionnelles?

Bonjour, et déjà merci à vous pour votre aide.
Je vous ai mis dans le post initial une pièce jointe très allégée du tableau pour vous donner une idée de comment cela se présente.
 

Paritec

XLDnaute Barbatruc
Re : Comment rechercher des itérations conditionnelles?

Bonjour Ghost Jean Marcel:eek:, Robert:eek: le forum
ton fichier en retour
tu ouvres tu cliques et tu regardes, entre parenthèse ton compte était faut !!!!
a+
Papou:eek:
 

Pièces jointes

  • Ghost V1.xls
    91.5 KB · Affichages: 52

Ghost

XLDnaute Nouveau
Re : Comment rechercher des itérations conditionnelles?

Waou! C'est super. J'ai regardé vite fait, cela donne parfaitement le resultat recherché, c'est super.
Merci beaucoup Paritec et merci aussi à tous les autres bien entendu. :D
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Comment rechercher des itérations conditionnelles?

Bonsoir Ghost, à tous,

Un essai sans VBA avec des formules.

Deux noms dynamiques ont été créés:

Semaines qui correspond à la colonne des semaines de la feuille Extraction:
Code:
=DECALER(Extraction!$B$1;1;0;NBVAL(Extraction!$B$1:$B$65000)-1;1)
Agence qui correspond à la colonne Agence_nn de la feuille Extraction quand on est placé dans une colonne Agence_nn de la feuille NB Presents:
Code:
=DECALER(Semaines;0;COLONNES('NB Presents'!$B$2:B$2))


Ensuite quatre formules on été définies:

Cellule A2 : semaine minimum des semaines présentes dans la colonne B de la feuille Extraction:
Code:
=MIN(Semaines)
Cellule A3 : semaine suivante jusqu'au max des semaines présentes sur la feuille Extraction.
(formule à tirer vers le bas jusqu'à obtenir une cellule vide):
Code:
=SI(ESTNUM(A2);SI(A2+1<=MAX(Semaines);A2+1;"");"")
Cellule B1 : recopie des agences présentes sur la feuille Extraction.
(formule à tirer vers la droite jusqu'à obtenir une cellule vide):
Code:
=Extraction!C1
cellule B2 : formule matricielle de comptage sans doublons
(formule à tirer vers la droite et vers le bas jusqu'à la dernière agence et jusqu'à la dernière semaine ):
Code:
=SOMME(N(FREQUENCE(SI((Semaines=$A2)*(Agence<>"-")>0;EQUIV(Agence;Agence;0);"");SI((Semaines=$A2)*(Agence<>"-")>0;EQUIV(Agence;Agence;0);""))>0))

Une MFC vient compléter le tableau pour mettre la police en blanc pour les valeurs nulles.

Formule matricielle: Elle doit être validée par la combinaison des touches Ctrl+Maj+Entrée au lieu de la seule touche Entrée comme une formule classique.
Si la validation matricielle est correcte, alors Excel entoure la formule d'accolades {=.......}.
Chaque fois que cette formule sera modifiée, la validation devra se faire par Ctrl+Maj+Entrée. Les accolades apparaissent à la validation et ne doivent pas être saisies au clavier.
 

Pièces jointes

  • Ghost-Exemple v1.xls
    180.5 KB · Affichages: 42

Ghost

XLDnaute Nouveau
Re : Comment rechercher des itérations conditionnelles?

Bonjour,
Je viens de tester tout cela et tout cela cela fonctionnne parfaitement.
Le plus dur sera de savoir quelle solution je vais garder en utilisation ;)
Encore merci à tous pour votre aide précieuse, j'ai encore découvert des méthodes grace à vous c'est cool.
Merci et bonne journée
 

Discussions similaires

Réponses
46
Affichages
843
Réponses
2
Affichages
513
  • Question
Microsoft 365 Planning
Réponses
2
Affichages
1 K

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16