Recheche Matricielle
Bonjour a tous,
Je suis entrain de me creuser la tete sur une formule/fonction afin de permettre d'effectuer une recherhce matricielle dans un tableau dont les entrées se font par colonne et par ligne.
J'ai donc un tableau en Feuil1, qui reprend les elements cles.
J'ai un deuxieme tableau en Feuil2 pour lequel je souhaiterai automatiser le remplissage des quantités selon les deux criteres.
J'avais commence a reflechir a utiliser la formule INDEX en application avec deux methodes Match imbriquees.
Pas sur que ce soit la meilleure des manieres, surtout que je seche.
Auriez-vous des idees pour m'aider?
D'avance merci a toutes et tous !
Gilles
Ps: desole pour les fautes, je suis sur clavier qwerty pour le moment!
Bonjour,
En utilisant les zones nommées que tu as déjà définies :
Formule à insérer dans la cellule C2 de la Feuil2, et à recopier vers le bas
=INDEX(Feuil1!$C$7:$G$11;EQUIV($B2;Produit;0);EQUIV($A2;Point;0))Bon Dimanche
Bonjourm
Merci de ta reponse.
Via la formule, pas de soucis.
Mon besoin et d'automatiser cela via VBA car mon tableau en Feuil1 sera rempli au fur et a mesure, et pourra allegrement depasser les 60000 lignes.
L'idee est que l'utilisateur final n'ai pas a se pre occuper de quoi que ce soit.
Je viens donc rqjouter un critere que je n'avais pas pris en compte, celui de verifier si la Cellul Quantite est vide ou non..
En passant par un boucle For Each Isempty() In Range("Feuil2") eventuellement?
Bon dimanche a vous, ici c'est la nuit - donc je reprendrais demain !
Gilles
Re-,
Euh, 60 000 lignes?
Et le menu déroulant, dans la cellule B2 (Feuil1), tu y as pensé? Car tu ne pourras pas mettre tes 60 000 produits dans cette validation de données....
Sinon, avec la méthode Find (sur la colonne B, afin d'obtenir la ligne, et sur la ligne 6, afin d'obtenir la colonne) devrait te donner le résultat.
Maintenant, je ne vois pas trop ce que tu veux (surtout avec un nombre de lignes si conséquent...)
Bonne nuit
Bonsoir le forum,
Restitution à côté du tableau initial.
Sub Transpose()
Dim a, b(), i As Long, j As Long, n As Long
With Sheets("Feuil1").Range("b6").CurrentRegion
a = .Value
ReDim b(1 To .Cells.Count, 1 To 3)
For i = 2 To UBound(a, 2)
For j = 2 To UBound(a, 1)
If a(j, i) <> "" Then
n = n + 1
b(n, 1) = a(1, i)
b(n, 2) = a(j, 1)
b(n, 3) = a(j, i)
End If
Next
Next
With .Offset(, .Columns.Count + 1)
.CurrentRegion.Clear
.Resize(1, 3).Value = [{"Type de point","Produit","Quantité"}]
.Offset(1).Resize(n, 3).Value = b
End With
End With
End Subklin89
Bonjour a tous, je me suis donc mal exprime dans mon besoin, et vais essayer d'apporter des precisions.
cousinhub a écrit :Re-,
Euh, 60 000 lignes?
Et le menu déroulant, dans la cellule B2 (Feuil1), tu y as pensé? Car tu ne pourras pas mettre tes 60 000 produits dans cette validation de données....
En effet, le nombre de produit sera d'environ 30 part Point, et le nombre de Points sera de 15, soit environ 450 lignes a remplir.
Ces 450 lignes seront repetees environ 20 fois (une fois par evenement).
L'idee est de pouvoir en tirer un TCD pour des analyses.
Cet exemple n'est donc qu'a mnima pour pouvoir etendre le calcul a des tableaux plus importants.
cousinhub a écrit :Sinon, avec la méthode Find (sur la colonne B, afin d'obtenir la ligne, et sur la ligne 6, afin d'obtenir la colonne) devrait te donner le résultat.
C'est la deuxieme solution a laquelle je pensais.. Etant donne qu'il y a 450 lignes a remplir, et un tableau de 30 lignes * 15 colonnes a scanner pour trouver la bonne information, je me suis dit que compiler deux Find pourrait rendre l'execution de la macro longue.
D'ou ma premier idee de passer par la fonction INDEX + EquiV/ Match, formule que je maitrise plus ou moins, mais pas du tout en code VBA!
[quote="Klin89"]Bonsoir le forum,
Restitution à côté du tableau initial.
[klin89[/quote]
Merci pour cette proposition. Je vais etudier le code de plus pres pour le comprendre.
En revanche, le fait de venir copier de la Feuil2 a la Feuil1 n'est pas possible dans la construction du fichier..
Je vais donc chercher du cote des ;ethodes Find et si d'ici la d'autres propositions plus rapides sont proposees, je les etudierai avec plaisir !
Merci et bonne journee
Re-
Donc Effectivement, jla methode des deux Find marche bien qund on specifie manuellement ce qu'on recherche et ou la donne doit etre collee.
Sub Trouver()
Dim Ligne As Integer
Dim Colonne As Integer
Ligne = Feuil1.[Produit].Find("Souris")).Row
Colonne = Feuil1.[Point].Find("Point 1").Column
Feuil2.Range("C2") = Feuil1.Cells(Ligne, Colonne).Value
End SubOk - premiere etape !
Maintenant je souhaiterai ajouter le fait que la macro doit verifier si la cellule de la colonne C est vide ou non :
- Si non Vide = Alors passer a la suivante
- Si Vide = Alors recuperer l'information de la colonne A (Type de Point) pour en faire la variable de recherche pour la methode Find, et meme chose pour la colonne B (Produit. Puis coller dans la cellule vide l'information recuperee.
Sub Trouver()
Dim Ligne As Integer
Dim Colonne As Integer
Dim LI As String
Dim J As Integer
Dim Cell As Variant
LI = 1
Do Until IsEmpty(Feuil2.Cells(LI, 3))
LI = LI + 1
Loop
For Each Cell In Feuil2.Range("A:A")
If IsEmpty(Cells(LI + J, 3)) Then
Ligne = Feuil1.[Produit].Find(Feuil2.Cells(LI + J, 2)).Row
Colonne = Feuil1.[Point].Find(Feuil2.Cells(LI + J, 1)).Column
Feuil2.Cells(LI + J, 3) = Feuil1.Cells(Ligne, Colonne).Value
J = J + 1
End If
Next
End SubLorsque je la lance Pas a Pas - tout se passe bien, sauf un message d'erreur "Run Time Erro9" a la fin.
Lorsque je la lance normanelement, le tableau se rempli correctement, mais avec ce message d'erreur a la fin "object variable or with block variable not set"
Pour le moment la methode est rapide, mais qu'en serait-il sur un tableau de plus grande envergure?
Quelqu'un pour m'aider?
Merci, Gilles
Bonjour,
Une proposition avec recherche du texte "Produit" pour situer le tableau dans la feuille.
A+
Bonjour,
Alors en testant, cela repond a mon besoin !
Je vais donc eplucher le code pour le comprendre et l'adapter !
Merci de l'aide !
Jay_Stu a écrit :Bonjour,
Alors en testant, cela repond a mon besoin !
Je vais donc eplucher le code pour le comprendre et l'adapter !
Merci de l'aide !
Alors j'essaie de comprendre le code et j'aurais aime que si les cellules de la colonne C sont deja remplies, elles ne soient pas modifiee.
Une modification a apporter?
Merci!
J'ai supprimé la ligne de code qui effaçait systématiquement les données de la colonne C et j'ai ajouté la condition "Cellule C non renseignée".
Sub Trouver()
Dim Cel As Range, C As Range, Col As Range, Lig As Range
Dim WsS As Worksheet, WsC As Worksheet
Set WsS = Worksheets("Feuil1")
Set WsC = Worksheets("Feuil2")
Set C = WsS.Cells.Find("Produit", , xlValues, xlWhole)
If Not C Is Nothing Then
For Each Cel In WsC.Range("A2:A" & WsC.Range("A" & Rows.Count).End(xlUp).Row)
Set Col = C.EntireRow.Find(Cel, , xlValues, xlWhole)
Set Lig = C.EntireColumn.Find(Cel.Offset(0, 1), , xlValues, xlWhole)
If Not Col Is Nothing And Not Lig Is Nothing Then
If Cel.Offset(0, 2) = "" Then
Cel.Offset(0, 2) = WsS.Cells(Lig.Row, Col.Column)
End If
Else
MsgBox "La cellule de la ligne " & Cel.Row & " correspondant à " & Cel & " et " & Cel.Offset(0, 1) & " n'a pas été trouvée"
End If
Set Col = Nothing: Set Lig = Nothing
Next Cel
Else
MsgBox "La cellule ""Produit"" n'a pas été trouvée"
Exit Sub
End If
WsC.Activate
Set C = Nothing: Set WsC = Nothing: Set WsS = Nothing
End SubA+
C'est top !
Merci beaucoup !