Problème avec macro Excel de recherche

Jason901 Messages postés 7 Date d'inscription   Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je fais appel à vous car je bute depuis 2 semaines sur une macro Excel permettant de rechercher des valeurs. Je vous explique :

J'ai 2 listes séparées par une ligne. La première contient des valeurs accolées. Je souhaite pour chaque élément de la deuxième liste parcourir la première, et récupérer la valeur accolée.

test1 10
test2 25
test3 14
test4 23
test5 12

test1
test2
test3
test4
test5

Pour le moment ma réalisation ne me permet que de renvoyer les 2 premiers champs. Mon code est lourd. Le voici :

Sub Test2()

'##Je me positionne sur la première ligne et je remplis mes variables y et z afin d'effectuer mon parcours '###avec la boucle For
Range("A1").Select
Selection.End(xlDown).Select
y = ActiveCell.Row

ActiveCell.Offset(2, 0).Select
Z = ActiveCell.Row

Selection.End(xlDown).Select
x = ActiveCell.Row
'#####

'###Je me repositionne au premier élément de ma deuxième liste
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(2, 0).Select
'####

'#Je commence mon parcours###
For i = Z To x
SearchValue = ActiveCell.Value

Range("C1", "C8").Select '(à adapter en fonction de la zone de recherche)
For Each k In Selection
If k.Value = SearchValue Then
Range("B" & i & "").Value = k.Offset(0, 1).Value
'ActiveCell.Offset(1, 0).Select

Exit For
End If
Next

ActiveCell.Offset(1, 0).Select

Next

End Sub

Donc cela ne fonctionne pas de manière optimale et pas correctement. A terme cela sera utilisé sur une liste de 2000 éléments. Quelqu'un pourrait m'aider ?

J'oubliais, pour corser un eu la chose, si dans ma première liste j'ai 2 fois par exemple test2 avec une valeur 5 puis 10, je souhaite recopier 10 dans ma 2ème liste !

test2 5
test2 10

test2 10

Merci beaucoup d'avance !!
Configuration: Windows XP
Firefox 3.0.11

17 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,
    petite question:
    ta liste 2 est elle la m^me que la liste 1= nombre de "test", valeurs, ordre
    dans l'attente,
    0
  2. Jason901 Messages postés 7 Date d'inscription   Statut Membre
     
    Bonjour, merci de votre intérêt ;)

    Alors pas forcément, dans la première liste on peut avoir 5 fois test1 et que une ou 2 fois retrouver test1 dans la deuxième série

    Salutations
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    OK,mais

    1/Si j'ai 5 ou N fois Test1 dans liste1 et 1 fois dans liste2: qu'est ce que lon fait? la somme? la valeur la + forte?....
    2/Si j'ai 5 ou N fois Test1 dans liste1 et plusieurs fois dans liste2 sur quoi se base t'on et qu'est ce que l'on fait?
    0
  4. Jason901 Messages postés 7 Date d'inscription   Statut Membre
     
    reBonjour, voici les réponses :

    En fait dans la première liste s'il y a plusieurs test1 ce serait toujours avec une valeur +1 associée, exemple :

    test1 1
    test1 2
    test1 3

    Il faut que le premier test1 de la deuxième liste soit incrémenter de 1, donc la liste 2 devra ici contenir :

    test1 4

    Et s'il y a 2 test1 dans la première liste, alors il faudra dans la deuxème avoir :

    test1 4
    test1 5

    Désolé de ne pas avoir pensé à donner ses informations au départ et merci de ton aide ! ;)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Jason901 Messages postés 7 Date d'inscription   Statut Membre
     
    Bonjour, avez vous trouvé un semblant de solution à mon problème ?

    Je suis sûr qu'il ne manque pas grand chose :(
    0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    ta demande m'est incompréhensible...
    donc, j'ai laissé tomber
    0
  8. Jason901 Messages postés 7 Date d'inscription   Statut Membre
     
    Hello michel_m.
    Désolé pour les explications. Je vais essayer de faire mieux :

    Ma première liste contient des positions de commandes, c'est à dire que pour chaque article rattachés à une commande il y a une numérotation. S'il y a 3 articles sur la première commande A et 4 sur la deuxième B alors j'aurai :

    commandeA 1
    commandeA 2
    commandeA 3
    commandeB 1
    commandeB 2
    commandeB 3
    commandeB 4

    Je pense que cela est plus clair désormais ;o)

    Passons à la deuxième liste maintenant :
    Il s'agit également de positions de commandes mais celles-ci représentent des frais de ports et parfois un rabais. Le rabais est présent selon le montant total de la commande (juste pour info, ce travail de récupération du rabais se fait en amont).
    Donc, à la base j'ai ma liste 2 qui se présente ainsi :

    commandeA typ_fdp
    commandeB typ_fdp
    commandeB typ_rabais

    Par exemple on voit ici que la commande B contient un rabais.
    Le but de la macro est de rechercher dans la première liste la commandeA, trouver sa position la plus élevée, et reporter cette position dans la 2ème liste en faisant +1 afin d'obtenir :

    commandeA 4 typ_fdp
    commandeB 5 typ_fdp
    commandeB 6 typ_rabais

    J'espère que tu as saisi ma problématique et ça serait vraiment cool de m'aider, car je m'arrache les cheveux.

    D'avance,merci beaucoup !

    Jason
    0
  9. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Voici une proposition. Pour simplifier j'ai mis tes données sur 2 feuilles (et j'ai fait à mon idée sans reprendre ton code).
    J'ai considéré qu'il n'y avait qu'un seul espace dans 'commandeA 1' comme dans ton exemple, et j'ai concaténé le résultat. Sinon tu adapteras, la structure est là...

    jason901.xls

    eric
    0
  10. Jason901 Messages postés 7 Date d'inscription   Statut Membre
     
    Merci pour ton aide

    Enfait les données sont dans des cellules différentes :

    CommandeA 5 typ_fdp sont dans 3 cellules accollées !

    Mais je vais essayer d'adapter ton code ;)

    Merci je te tiens au jus !
    0
  11. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Re,

    Désolé, La première contient des valeurs accolées : pour moi ça veut dire que ça ne forme plus qu'une seule valeur...
    Du coup c'est plus simple :
    jason901_2.xls
    eric
    0
  12. Jason901 Messages postés 7 Date d'inscription   Statut Membre
     
    Bonjour Eric,

    Merci beaucoup, "on" est en bonne voie :)

    Je bute cependant sur un problème que j'ai depuis le départ :
    J'ai toutes mes données, donc mes 2 listes sur la même feuille. Par exemple les 1000 premiers articles constituant la première liste sont séparées de la deuxième liste par une simple ligne vide, je ne peux recevoir les données autrement dans Excel.
    Il faudrait donc réussir à intégrer cela, et là je bute totalement, c'est pour moi la plus grosse difficulté.

    Merci de ton aide !
    0
  13. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Je pensais que tu allais faire un copier-coller mais voici la modif :
    jason901_03.xls

    eric

    PS : si tu peux ajouter juste avant le end sub :
    set sh1 = nothing
    set sh2 = nothing

    merci
    0
  14. Jason901
     
    Salut eriiic,

    Juste pour information je n'ai pas eu l'occsion d'avancer sur le sujet j'ai été placé sur un autre projet cet après-midi je vais cependnat m'y remettre :)

    Je te tiens au courant ¨!

    Merci a+
    0
  15. Jason901
     
    Cool, j'y suis presque, j'ai un tout petit peu modifié ton code, notamment au début
    cdes(100, 1) As Variant que j'ai transofrmé en cdes(65536, 1) As Variant

    J'ai juste une difficulté et c'est réglé :

    Les commandes sont listées en B et les positions en C (et non pas respectivement en A et B)

    J'ai modifié les lignes

    For Each c In sh1.[A2].Resize(sh1.[A1].End(xlDown).Row - 1)

    et

    For Each c In sh1.[A2].Offset(sh1.[A1].End(xlDown).Row, 0).Resize(sh2.[A65536].End(xlUp).Row - 1)


    en

    For Each c In sh1.[B2].Resize(sh1.[B1].End(xlDown).Row - 1)

    For Each c In sh1.[B2].Offset(sh1.[B1].End(xlDown).Row, 0).Resize(sh2.[A65536].End(xlUp).Row - 1)


    Mais ça ne va pas, je vois pas ce qui cloche.
    Si je peux encore te solliciter pour ça..

    Merci beaucoup !

    Jason
    0
  16. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    A vue de nez j'aurais fait pareil... Apparement tu as bien différencié sh1 et sh2.
    Pour ne pas multiplier les hypothèses il faudrait que tu déposes ton fichier débarrassé des données confidentielles sur cijoint.fr et que tu colles ici le lien fourni.

    eric
    0
  17. Jason901
     
    Hello eriiic,

    Merci BEAUCOUP, cela marche enfin, je ne sais pas ce qui n'allait pas...
    J'ai voulu t'envoyer un fichier de demo et pouf ça a fonctionné :D

    Merci mille fois pour ton suivi et ton investissement !

    Salutations

    Jason
    0
  18. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    ok, merci pour le retour et bonne continuation :-)
    eric
    0