VBA recherche v à deux conditions

Bonjour,

Je débute sur vba et j'aimerai créer une sorte de recherche v.

Je m'explique, j'ai 3 feuilles --> les deux premières feuilles sont des extractions qui permettent de remplir la feuille 3.

Les colonnes en vert de la feuille 3 sont remplis par la feuille 1 (pas présente dans l'exemple) avec de simple copier-coller. Mais pour remplir les colonnes en jaune de la feuille 3 je dois aller chercher des données dans la feuille 2 avec deux conditions :

- le n° d'OF

- le n° de centre de charge

Je me doute que ce message est pas forcément clair donc je vais partager un exemple.

(il est possible même sur que certaines ligne ne seront pas remplis dans se cas c'est possible de mettre les cases non remplis en rouge par exemple)

Merci de votre temps,

Cordialement,

image

Bonjour à tous,

Une proposition, sans VBA, mais avec Power Query (nativement intégré à votre version Excel) :

Vous pourriez, utiliser Power Query pour intégrer directement vos autres sources de données sans "encombrer" vos feuilles de données intermédiaires.

Bonjour, salut JFL !

Une proposition alternative en formule (ici pour G2, à étendre au reste du tableau ensuite) :

=SIERREUR(MOYENNE.SI.ENS(Feuil2!F:F;Feuil2!$A:$A;$A2;Feuil2!$I:$I;$F2);"")

Attention : il faut au préalable supprimer les espaces indésirables autour de CdC sec. en Feuil2.

Merci, votre proposition fait ce que je souhaite. Mais pour plus d'explication je suis alternat et mon tuteur souhaite absolument une macro.

Je vais quand même lui proposer cette solution en attendant d'autres propositions.

Merci,

Cordialement,

...mon tuteur souhaite absolument une macro.

Question idiote, pourquoi ?

Bonjour de nouveau,

Attention : il faut au préalable supprimer les espaces indésirables autour de CdC sec. en Feuil2.

@Pedro22 : Hello !
Même remarque concernant les espaces. J'ai traité ce souci dans la requête.

En fait là ce que je partage c'est un exemple du fichier que je réalise, c'est-à-dire que je supprime des choses afin de simplifier ma demande.

Mais moi de mon niveau de débutant sur excel j’extrais des données d'un erp, puis avec Excel et une macro j'ouvre ces deux fichiers d'extraction que je copie colle puis ferme. Ensuite je prend que les données qui m’intéresse afin de remplir une partie de la feuille 3 dans l'exemple. La où je bloque c'est pour cette partie que j'appelle "recherche v à deux conditions".

Donc le but de la macro est de simplifier le travaille d'un opérateur qui va simplement déclencher celle-ci et avoir la feuille 3 dans l'exemple remplie + si c'est possible une mise en forme en cas de manque d'informations.

Dans ce cas, si l'objectif est de compléter une macro existante, peux-tu joindre le fichier avec le code VBA ?

Concernant l'espace dans la colonne "CdC sec." il est présent car comme ce sont des extractions d'un ERP je suis obligé d'effectuer un convertissage de la page et directement ça me met cet espace.

Cela est-il contraignant si j'arrive à trouver une macro qui exécute ce que je souhaite faire ?

Concernant l'espace dans la colonne "CdC sec." il est présent car comme ce sont des extractions d'un ERP je suis obligé d'effectuer un convertissage de la page et directement ça me met cet espace.

Cela est-il contraignant si j'arrive à trouver une macro qui exécute ce que je souhaite faire ?

Non la suppression des espaces indésirables est également automatisable.

Bonjour de nouveau,

Pouvez-vous mettre à notre disposition un fichier exemple de vos extractions ?

l'exemple de l'extraction est en feuille 2 dans le fichier que je partage.

Une tentative de simplification de la macro envoyée (que je n'ai pu tester faute de fichier) :

Sub extraction()

On Error GoTo OuvertureFichierBaan

'On ouvre le premier fichier extraction baan n°1
Workbooks.Open "C:\B.Delpeyroux\baanextra.xlsx"
With ThisWorkbook.Sheets("ordo")
    Sheets("baanextra").Columns("A:A").Copy .Range("A1")
    .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Tab:=True, Other:=True, OtherChar:="|", TrailingMinusNumbers:=True
End With
Workbooks("baanextra.xlsx").Close False 'remplacer par True si on veut que ça enregistre avant de fermer

'On ouvre le premier fichier extraction baan n°2
Workbooks.Open "C:\B.Delpeyroux\baanextraHDHAP.xlsx"
With ThisWorkbook.Sheets("ordo2")
    Sheets("baanextraHDHAP").Columns("A:A").Copy .Range("A1")
    .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Tab:=True, Other:=True, OtherChar:="|", TrailingMinusNumbers:=True
End With
Workbooks("baanextraHDHAP.xlsx").Close False 'remplacer par True si on veut que ça enregistre avant de fermer
i = 1

OuvertureFichierBaan:
If i = 0 Then MsgBox "Erreur lors de l'ouverture de fichier...": Exit Sub

'Creation tableau
With Sheets("ordo")
    .Columns("C:C").Copy Sheets("tableau").Range("A:A") 'Je copie les données de la feuille ordo N°OP (C) dans le tableau
    .Columns("E:E").Copy Sheets("tableau").Range("B:B") 'Je copie les données de la feuille ordo Description (E) --> (B) dans le tableau
    .Columns("L:L").Copy Sheets("tableau").Range("C:C") 'Je copie les données de la feuille ordo Description (L)--> (C) dans le tableau
    .Columns("J:J").Copy Sheets("tableau").Range("D:D") 'Je copie les données de la feuille ordo Opération (J)--> (D) dans le tableau
    .Columns("M:M").Copy Sheets("tableau").Range("E:E") 'Je copie les données de la feuille ordo Statut op (M) --> (E) dans le tableau
    .Columns("N:N").Copy Sheets("tableau").Range("F:F") 'Je copie les données de la feuille ordo CdCs (N)--> (F) dans le tableau
End With
Sheets("tableau").Range("F:F").Replace What:=" ", Replacement:="", LookAt:=xlPart 'Suppression des espaces indésirables en colonne F

End Sub

La formule proposée initialement n'y figure pas, car je ne sais pas dans quelle feuille elle devra être ajoutée.

Quelques remarques :
- C'est bien de vouloir déclarer des variables Workbook ou Worksheet, encore faut-il les utiliser ensuite...
- .Select et .Activate sont inutiles si les objets manipulés sont explicitement précisés (classeur et feuille)

Bonjour de nouveau,

l'exemple de l'extraction est en feuille 2 dans le fichier que je partage.

Donc au format xlsx ?

Et les éléments de votre feuille1 ?

@Pedro22, merci donc ça marche bien cela supprime bien les espaces. En ce qui concerne t'es remarques j'en tiens compte & merci pour les explications. Ma macro est pas parfaite car c'est une 1ère pour moi.

@JFL l’extraction en feuille 1 est pas mise car en fait cette feuille je viens juste copié collé les colonnes sur ma feuille 3 (comme on peut le voir sur la macro améliorer de @Pedro22) et c'est à la suite de ça que je souhaiterai extraire des donnés de la feuille 2 sur la feuille 3 mais en faisant correspondre les lignes au bon n°OF et n° de centre de charge (ou CdCs).

Bonjour de nouveau,

Visiblement VBA semble être un horizon indépassable !

Je laisse donc le soin à Pedro22 de poursuivre. Vous êtes entre de bonnes mains.

@pedro22, pour vous répondre la formule devra faire effet sur la feuille "tableau" aux colonnes G; H; I .Et prend les données dans la feuille "ordo2" aux colonnes J; K; L.

Ce que j'appelle les contraintes c'est-à-dire le n° OF & n° CdC sec sont en colonnes A & M respectivement dans la feuille "ordo2".

Dans la feuille à remplir "tableau" les contraintes sont en colonnes A & F

Ok, je reviens vers vous quand j'ai un moment avec un code actualisé. Si j'ai bien compris, le code proposé précédemment fonctionne déjà, mis à part ces formules manquantes ?

Pas de soucis.

Alors oui le code fonctionne et la suppression de l'espace aussi, il manque juste à rajouter les colonnes G;H;I qui sont à extraire de la feuille "ordo2".

Bonjour,

A tester :

Sub extraction()

Dim Lig As Long
On Error GoTo OuvertureFichierBaan

'On ouvre le premier fichier extraction baan n°1
Workbooks.Open "C:\B.Delpeyroux\baanextra.xlsx"
With ThisWorkbook.Sheets("ordo")
    Sheets("baanextra").Columns("A:A").Copy .Range("A1")
    .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Tab:=True, Other:=True, OtherChar:="|", TrailingMinusNumbers:=True
End With
Workbooks("baanextra.xlsx").Close False 'remplacer par True si on veut que ça enregistre avant de fermer

'On ouvre le premier fichier extraction baan n°2
Workbooks.Open "C:\B.Delpeyroux\baanextraHDHAP.xlsx"
With ThisWorkbook.Sheets("ordo2")
    Sheets("baanextraHDHAP").Columns("A:A").Copy .Range("A1")
    .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Tab:=True, Other:=True, OtherChar:="|", TrailingMinusNumbers:=True
End With
Workbooks("baanextraHDHAP.xlsx").Close False 'remplacer par True si on veut que ça enregistre avant de fermer
i = 1

OuvertureFichierBaan:
If i = 0 Then MsgBox "Erreur lors de l'ouverture de fichier...": Exit Sub

'Creation tableau
With Sheets("ordo")
    .Columns("C:C").Copy Sheets("tableau").Range("A:A") 'Je copie les données de la feuille ordo N°OP (C) dans le tableau
    .Columns("E:E").Copy Sheets("tableau").Range("B:B") 'Je copie les données de la feuille ordo Description (E) --> (B) dans le tableau
    .Columns("L:L").Copy Sheets("tableau").Range("C:C") 'Je copie les données de la feuille ordo Description (L)--> (C) dans le tableau
    .Columns("J:J").Copy Sheets("tableau").Range("D:D") 'Je copie les données de la feuille ordo Opération (J)--> (D) dans le tableau
    .Columns("M:M").Copy Sheets("tableau").Range("E:E") 'Je copie les données de la feuille ordo Statut op (M) --> (E) dans le tableau
    .Columns("N:N").Copy Sheets("tableau").Range("F:F") 'Je copie les données de la feuille ordo CdCs (N)--> (F) dans le tableau
End With
With Sheets("tableau")
    .Range("F:F").Replace What:=" ", Replacement:="", LookAt:=xlPart 'Suppression des espaces indésirables en colonne F
    For Lig = 2 To .Range("A" & Rows.Count).End(xlUp).Row
        .Range("G" & Lig) = Application.IfError(Application.AverageIfs(Sheets("ordo2").Range("J:J"), Sheets("ordo2").Range("A:A"), .Range("A" & Lig), Sheets("ordo2").Range("M:M"), .Range("F" & Lig)), "")
        .Range("H" & Lig) = Application.IfError(Application.AverageIfs(Sheets("ordo2").Range("K:K"), Sheets("ordo2").Range("A:A"), .Range("A" & Lig), Sheets("ordo2").Range("M:M"), .Range("F" & Lig)), "")
        .Range("I" & Lig) = Application.IfError(Application.AverageIfs(Sheets("ordo2").Range("L:L"), Sheets("ordo2").Range("A:A"), .Range("A" & Lig), Sheets("ordo2").Range("M:M"), .Range("F" & Lig)), "")
    Next Lig
End With

End Sub
Rechercher des sujets similaires à "vba recherche deux conditions"