[Totalement Résolu]: INDEX EQUIV sous VBA

Gen Rose

XLDnaute Impliqué
Supporter XLD
Bon vendredi à tous (soir pour certains) :eek:

J'ai visité plusieurs fils mais VBA reste chinois; même si j'ai souvent tenté de comprendre, j'ai une compréhension très sommaire et honnêtement, je ne sais pas si jamais je vais y arriver (en tout sincérité, le pli logique, je l'ai pas).

J'aimerais dire en code:

Code:
Pour chaque ligne de 'Maliste';
Prends la référence en K;
Trouve cette référence en Feuil2 dans la colonne nommée 'Code'
Rapporte-moi les résultats correspondants de 'Description' et 'Description_2'
Et mets ces résultat en L et M de 'Maliste'

Ma tête n'arrive pas à traduire cela langage codé, probablement car ma formulation ne suit pas la même logique.

Si un code pouvait dire des phrase, comment seraient-elles construites pour cet exemple?

Bref, j'aimerais comprendre mais je ne le demande pas; ça allourdirait votre tâche!

Voir p.j pour un visuel et explications.
Merci beaucoup,
Bon week-end à tous et toutes xox

p.s.: conçu en 2003, modifié en 2010 et enregistré compatible 97-2003...oui, nous sommes entre 2 versions!
 

Pièces jointes

  • New_Exp_ Pa.xls
    316.5 KB · Affichages: 90
Dernière modification par un modérateur:

Eric 45

XLDnaute Occasionnel
Re : INDEX EQUIV sous VBA

Bonsoir ou Bonjour à tous
Bonjour genevieve78

Si j'ai compris ton pb, essaie ceci, à mettre dans le code de la feuille "Data sheet"
Code:
Dim non As Boolean
Dim test As Integer

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sh1 As Worksheet
Dim sh2 As Worksheet

Dim c As Range
Dim ligne As Integer   'juste pour ta verif, cette ligne peut être effacée
Dim mavar As String


Set sh1 = Worksheets("Data sheet")
Set sh2 = Worksheets("Reference table")
If non = False And ActiveCell <> "" And ActiveCell.Column = 11 Then
        With sh2.Range("b2:g31")
        mavar = ActiveCell
            Set c = .Find(mavar, LookIn:=xlValues, Lookat:=xlWhole)
            If Not c Is Nothing Then
                    ligne = c.Row   'juste pour ta verif, cette ligne peut être effacée
                    If test = 0 Then test = 1: sh1.Range("L" & ActiveCell.Row) = sh2.Range("C" & c.Row)
                    non = True
                    If test = 1 Then non = True: sh1.Range("M" & ActiveCell.Row) = sh2.Range("D" & c.Row)
            End If
        End With
End If
non = False
test = 0
End Sub
Bon WE

Eric
 

job75

XLDnaute Barbatruc
Re : INDEX EQUIV sous VBA

Bonjour Geneviève, Eric,

Cette macro doit faire l'affaire :

Code:
Sub Copie()
Dim r As Range, i As Variant
For Each r In [MaListe].Rows
  If r.Row > 1 Then 'à cause des en-têtes
    i = Application.Match(r.Cells(1, "K"), Evaluate("Code"), 0)
    If IsError(i) Then
      r.Cells(1, "L").Resize(, 2).ClearContents
    Else
      r.Cells(1, "L") = [Description].Cells(i)
      r.Cells(1, "M") = [Description_2].Cells(i)
    End If
  End If
Next
End Sub
Edit : amusant, il y a un problème avec les balises de code si l'on utilise
Code:
[/COLOR]...

J'utilise donc [COLOR="#FF0000"]Evaluate("Code")[/COLOR] !!!

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : INDEX EQUIV sous VBA

Re,

Si le tableau MaListe contient un grand nombre de lignes utiliser plutôt :

Code:
Sub Copie()
Dim h As Long, T, R(), i As Long, j As Variant
h = [MaListe].Cells([MaListe].Rows.Count + 1, "K").End(xlUp).Row
T = [MaListe].Cells(2, "K").Resize(h, 2) 'matrice, plus rapide
ReDim R(1 To h, 1 To 2) 'tableau à remplir
For i = 1 To h
  j = Application.Match(T(i, 1), Evaluate("Code"), 0)
  If IsNumeric(j) Then
    R(i, 1) = [Description].Cells(j)
    R(i, 2) = [Description_2].Cells(j)
  End If
Next
[MaListe].Cells(2, "L").Resize(h, 2) = R
End Sub
La macro est beaucoup plus rapide avec les tableaux VBA T et R.

A+
 

Si...

XLDnaute Barbatruc
Re : INDEX EQUIV sous VBA

salut

j'avais écrit 2 macros (à placer dans la page de code de la feuille "Data sheet"),

- la première pour une complémentation à chaque saisie de donnée (tout comme l'a pensé Eric ;))
Code:
Private Sub Worksheet_Change(ByVal R As Range)
  If Intersect(R, Range("K2", Range("K2").End(xlDown))) Is Nothing Then Exit Sub
  Dim C As Range
  Set C = Feuil2.[B:B].Find(R)
  If Not C Is Nothing Then R(1, 2).Resize(1, 2) = C(1, 2).Resize(1, 2).Value
End Sub

- la seconde pour un traitement global (avec tableaux, mais pas ceux de la feuille, comme l'a pensé Job ;))
Code:
Private Sub Init()
  Dim Td, Ta, i As Long, C As Range
  Td = Range("K2", Range("K2").End(xlDown)) 'Td colonne de départ
  Ta = Range("L2:M" & Range("K2").End(xlDown).Row) ' Ta colonnes d'arrivée
  For i = 1 To UBound(Td)
    Set C = Feuil2.[B:B].Find(Td(i, 1))
    If Not C Is Nothing Then
      Ta(i, 1) = C(1, 2): Ta(i, 2) = C(1, 3)
    End If
  Next
  Range("L2:M" & UBound(Ta) + 1) = Ta
End Sub
 

Si...

XLDnaute Barbatruc
Re : INDEX EQUIV sous VBA

re

merci Job :D pour cette information que j'avais déjà vue mais pas testée (chez moi, les grands tableaux dépassent rarement 1000 lignes).
Si... cela l'intéresse, ce sera un bon exercice pour Geneviève que de transformer ces quelques lignes de code ;).
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : INDEX EQUIV sous VBA

Bon lundi :eek:

Oui, oui et oui. Elles fonctionnent toutes et je vais distribuer pleins de Likes tellement je suis heureuse! En fait, c'est tout mérité :rolleyes:

J'ai conservé les 2 codes(Si et Eric) pour la saisie automatique. Les macros de Job75 fonctionnent bien mais nécessitent d'êtres lancées. La proposition de Si... est celle que j'ai adoptée car plus courte mais les 2 semblent êtres aussi rapides une que l'autre.

La différence de lignes entre les 2 macros m'impressionne. Curieusement, je comprends davantage celle d'Eric (j'arrive à lire) mais pas celle de Si...


EDIT.: Allez savoir pourquoi, dans mes test lorsque j'effacais en K, L et M consevraient leur valeurs. J'avais relancé mon post croyant qu'il fallait imbriquer un bout de code mais en ouvrant à nouveau mon classeur test ce matin, L et M s'effacent lorsque j'efface l'info en K. Je retire donc ma dernière demande car visiblement, tout fonctionne parfaitement.

Cdt,
Le Forum,
 
Dernière modification par un modérateur:

Statistiques des forums

Discussions
312 282
Messages
2 086 772
Membres
103 391
dernier inscrit
lrol