Extraire Data 3 Conditions plusieurs feuilles
Bonjour,
Malgré quelques recherches sur votre forum, je n'arrive pas à trouver mon bonheur.
Je vous explique la situation, j'ai actuellement un classeur avec différents onglets.
Je cherche simplement à extraire la data d'une feuille pour l'implémente sur une autre feuille en fonction de 3 conditions.
D'après mes recherches il existes différentes fonctions pour arriver à mes fin mais je n'arrive pas à les utilisés:
=RechercheV
=INDEX(Tableau,EQUIV))
{=SOMME(SI((crit1=plage1)*(crit2=plage2);plage3;0))} = Doc Microsoft
=BDLIRE peut répondre aussi à mes besoins ?
Je vous met en PJ le jeu de donnée correspondant à ma demande, avec une nouvelle explication de ma demande.
Merci d'avance pour votre aide en espérant que ma logique revienne car je n'arrive plus à donner de la tête
Bonjour,
Il n' y a pas de pièce jointe
Cordialement,
Vbabeginner
Bonjour,
Merci pour votre réactivité, tous simplement un oublie au moment d'envoyer la demande.
La modification a été apporté.
Je me permet de modifier ce post pour rajouter une image correspondant à ma demande qui est peut être plus parlant.
A titre d'indication le deuxième tableau est normalement sur un autre onglet du classeur, mais pour plus de simplicité je l'ai mis sur la même page pour l'exemple.
Rappel : Compléter la dernière colonne du premier tableau avec la valeur de la dernière colonne du deuxième tableau en fonction que les conditions soient respectés "Mois Année CodePatient" sur les deux tableaux !
Merci pour votre aide
Bonjour les "exceliens"
Une âme charitable pour m'aider à ce problème simplissime car je sèche totalement.
Bonjour
Le tableau de ton image ne correspond pas à celui du fichier.
avec le fichier:
Formule matricielle à valider avec les 3 touches ctrl+Maj+Entrée, en M2, incrémentée vers le bas
=SIERREUR(INDEX(Alertes_IAH!$D$2:$D$10;EQUIV(1;(Alertes_IAH!$A$2:$A$10=IAH_Final!B2)*(Alertes_IAH!$B$2:$B$10=IAH_Final!D2)*(Alertes_IAH!$C$2:$C$10=IAH_Final!E2);0));"")
Cordialement
Bonjour,
Merci merci merci Amadeus, ceci est une une grande aide pour moi
J'ai compris l'ensemble de la formule hormis la fin de la formule ";"")" qui correspond à quoi ?
Dernières petite question, si nous souhaitons automatisé la tâche à l'ouverture du fichier, il est préférable de partir sur un module VBA, ou un outil excel permet celà ?
N'ayant aucune connaissance en VBA, j'ai vue sur la documentation Microsoft qu'il est possible d'execute une formule en VBA grâce à ceci :
Sub InsertFormula()
Worksheets("Alertes_IAH").Range("M2:M65536").Formula = "=SIERREUR(INDEX(Alertes_IAH!$D$2:$D$65536;EQUIV(1;(Alertes_IAH!$A$2:$A$65536=IAH_Final!B2)*(Alertes_IAH!$B$2:$B$65536=IAH_Final!D2)*(Alertes_IAH!$C$2:$C$65536=IAH_Final!E2);0));"")"
End Sub
Après cette réponse je vais clôturé le dossier comme il se doit.
Encore merci vous êtes au top
Bonjour
Dans la Formule, l'instruction SIERREUR(La formule;"") permet de ne rien afficher si la formule renvoie une erreur.
Pour automatiser, le Code dans le Module1
Sub Insertion_Formules()
'Déclaration des variables
Dim DerLig As Long, f As Range, g As Range
'Recherche du numéro de la dernière ligne
DerLig = Cells.Find("*", , , , xlByRows, xlPrevious).Row
'L'instruction Set permet d'attribuer une référence d'objet à la variable.
Set f = Range("M2")
Set g = Range("M" & DerLig)
f.Select
Range("M2").FormulaArray = _
"=IFERROR(INDEX(Alertes_IAH!R2C4:R10C4,MATCH(1,(Alertes_IAH!R2C1:R10C1=IAH_Final!RC[-11])*(Alertes_IAH!R2C2:R10C2=IAH_Final!RC[-9])*(Alertes_IAH!R2C3:R10C3=IAH_Final!RC[-8]),0)),"""")"
'Incrémentation de la formule
Selection.AutoFill Destination:=Range(f, g)
'Copie de la plage de cellules avec formules
Range(f, g).Copy
' Collage des valeurs en remplacement des formules
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("M2").Select
End Sub
est activé à l'ouverture du fichier par le Code dans ThisworkBook
Private Sub Workbook_Open()
Call Insertion_Formules
End Sub
Les formules matricielles sont gourmandes en mèmoire et peuvent ralentir les calculs si leur nombre est trop important.
Le Code remplace en fin de procédure, les formules par les valeurs.
Cordialement
Merci Amadéus Au top avec les commentaires pour plus de clarté c'est parfait.
Néanmoins la formule à été modifié que signifie ces éléments commun qu'on retrouve dans la formule :
R2C1:R10C1 => Plage du fichier ?
=IAH_Final!RC[-11] => Dernière ligne du fichier IAH_FINAL ?
tous simplement car j'aimerais l'adapté à mon fichier final qui comporte un nombre de ligne aléatoire, pour palier ce problème avec l'ancienne formule matriciel avec exécution " A la main " :
=SIERREUR(INDEX(Alertes_IAH!$D$2:$D$65536;EQUIV(1;(Alertes_IAH!$A$2:$A$65536=IAH_Final!B2)*(Alertes_IAH!$B$2:$B$65536=IAH_Final!D2)*(Alertes_IAH!$C$2:$C$65536=IAH_Final!E2);0));"")
J'ai remplacé les différentes plages pour contenir l'ensemble des lignes d'un fichier excel.
Est il possible d'effectuer la même chose avec la "nouvelle formule" ?
Mon fichier ne devrait jamais être rempli mais c'est pour être sur qu'il prenne l'ensemble des valeurs des deux fichiers, une fois ce dernier problème résolu je pourrais close cette demande.
Encore merci
Bonjour
Dans R2C3, on retrouve le numéro des lignes (Rows) et le numéro de colonne (Column)
Faire calculer une Matricielle sur 65000 lignes n'est ni raisonnable, ni rationnel. Il faut Nommer des plages variables qui représentent juste les lignes de données.
Sur ce Code, j'ai ajouté en tout début du code précédent les définitions des Champs concernés qui sont Nommés et utilisé ces Noms dans la Formule finale.
Il n'y a donc plus aucune modification à apporter, quel que soit le nombre de lignes de la Feuille "Alertes_IAH".
Sub Insertion_Formules()
'Définition et attribution de Noms pour les Plages concernées par la Formule
Sheets("Alertes_IAH").Activate
ActiveWorkbook.Names.Add Name:="CodePatient", RefersToR1C1:=Range("A2:A" & [A65000].End(xlUp).Row)
ActiveWorkbook.Names.Add Name:="Mois", RefersToR1C1:=Range("CodePatient").Offset(0, 1)
ActiveWorkbook.Names.Add Name:="Année", RefersToR1C1:=Range("CodePatient").Offset(0, 2)
ActiveWorkbook.Names.Add Name:="Nb_Alertes", RefersToR1C1:=Range("CodePatient").Offset(0, 3)
'On active la feuille de travail
Sheets("IAH_Final").Activate
'Déclaration des variables
Dim DerLig As Long, f As Range, g As Range
'Recherche du numéro de la dernière ligne
DerLig = Cells.Find("*", , , , xlByRows, xlPrevious).Row
'L'instruction Set permet d'attribuer une référence d'objet à la variable.
Set f = Range("M2")
Set g = Range("M" & DerLig)
f.Select
Range("M2").FormulaArray = _
"=IFERROR(INDEX(Alertes_IAH!NB_Alertes,MATCH(1,(Alertes_IAH!CodePatient=IAH_Final!RC[-11])*(Alertes_IAH!Mois=IAH_Final!RC[-9])*(Alertes_IAH!Année=IAH_Final!RC[-8]),0)),"""")"
'Incrémentation de la formule
Selection.AutoFill Destination:=Range(f, g)
'Copie de la plage de cellules avec formules
Range(f, g).Copy
' Collage des valeurs en remplacement des formules
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("M2").Select
End Sub
Cordialement
C'est tous simplement parfait.
Je comprend que ce n'est pas rationnel et n'y raisonnable mais c'est pour que le excel prenne en compte l'ensemble de mes données. il n'y aura jamais autant de donnée sur ce fichier.
Merci pour les explications je clos ce sujet.