IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

[XL-2010] Correspondance entre deux colonnes et remplacement


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 7
    Points
    7
    Par défaut [XL-2010] Correspondance entre deux colonnes et remplacement
    Bonjour à tous !

    Je suis loin d'être un expert en EXCEL et c'est pour cela que je fais appel à vous. Je suis confronté à un problème que je vais essayer de vous expliquer le plus clairement possible.

    J'ai deux listes :

    Liste n° 1 - Une contenant des chemins d'images (Exemple : /visuels/assemblage/0166-8000386.jpg)
    Liste n° 2 - Et une autre contenant toutes les images de ma base (Exemple : 0166-8000386.eps)

    Ce que je souhaite réaliser :

    je travail à partir d'une base où sont stockées ces images, cette base les réenregistre en JPG (économie de place). Mais désormais il faudrait que je puisse retrouver à partir de la liste numéro 2 la bonne extension d'image pour la liste n°1. (.eps, .psd, .tif...).
    Le but serait de pouvoir concorder les deux numéros de fichiers sans le chemin n'y l'extension et à partir de la liste 2 remplacer l'extension de la liste 1 (de nouveau sans toucher au chemin..)

    Exemple :

    Liste n° 1 = /visuels/assemblage/0166-8000386.jpg
    Liste n° 2 = 0166-8000386.eps

    ALORS

    Liste n° 1 devient : /visuels/assemblage/0166-8000386.eps


    J'espère m'être bien exprimé..

    Merci d'avance pour le temps que vous m'accorder.

    Leam

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 665
    Points : 5 803
    Points
    5 803
    Par défaut
    L'utilisation des fonctions DROITE et GAUCHE devraient te permettre de récuperer uniquement le numero de l'image, sur ton exemple DROITE(/visuels/assemblage/0166-8000386.jpg;16) permet de récuperer 0166-8000386.jpg puis GAUCHE(-;12) te donne 0166-8000386 (soit la formule GAUCHE(DROITE(/visuels/assemblage/0166-8000386.jpg;16);12) )
    Cependant cette technique suppose que le format du nom de l'image fixe.

    Pour le reste ça dépasse mes compétences.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Effectivement ça aurait pu être une solution et j'y avais déjà pensé en surfant sur les forums.. mais en effet, les noms d'images ne sont pas forcément fixe. C'est pourquoi il faudrait un moyen de comparer la première cellule de la liste n°1 avec toute la liste n°2 lorsqu'il a trouvé une correspondance il change l'extension de la liste n°1 et on passe à la deuxième cellule de la liste n°1 etc etc.. Serait-ce plus simple en VBA ? Me suis-je trompé finalement de forum ?

    Merci,

    Leam

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Est-ce que dans les désignations de ta liste 1 il y a quelque chose qui soit fixe ? le nombre de "/" ? la désignation du chemin ?

  5. #5
    Membre habitué Avatar de LG-69
    Homme Profil pro
    Analyste statisticien
    Inscrit en
    Juillet 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste statisticien

    Informations forums :
    Inscription : Juillet 2014
    Messages : 162
    Points : 189
    Points
    189
    Par défaut
    Si on considère que
    - ton chemin est en A1 (/visuels/assemblage/0166-8000386.jpg)
    - ton nom d'image est en A2 (0166-8000386.png)

    La formule ci-dessous fonctionne :

    =REMPLACER($A$1;CHERCHE(GAUCHE($A$2;CHERCHE(".";$A$2)-1);$A$1)+NBCAR(GAUCHE($A$2;CHERCHE(".";$A$2)-1))+1;NBCAR(DROITE($A$2;NBCAR($A$2)-CHERCHE(".";$A$2)));DROITE($A$2;NBCAR($A$2)-CHERCHE(".";$A$2)))

    et donne :

    /visuels/assemblage/0166-8000386.png

    Que fait la formule ?
    Elle travaille déjà sur A2 pour repérer
    - le nom de l'image en prenant les caractères à gauche du point : GAUCHE($A$2;CHERCHE(".";$A$2)-1) => extrait le nom de l'image
    - l'extension de l'image en prenant les caractères à droite du point : DROITE($A$2;NBCAR($A$2)-CHERCHE(".";$A$2))) => extrait l'extension de l'image
    Elle travaille ensuite sur A1 pour
    - trouver le nom de l'image trouvé en A2 : CHERCHE(GAUCHE($A$2;CHERCHE(".";$A$2)-1);$A$1) => trouve la position de début du nom de l'image
    - ajoute la longueur (nombre de caractère) du nom de l'image (pour se décaler en fin du nom) +1 (pour se placer après le point) : +NBCAR(GAUCHE($A$2;CHERCHE(".";$A$2)-1))+1
    Puis
    - remplace l'ancienne extension avec la nouvelle

    Il faut par contre que les 2 extensions aient la même longueur.

    Maintenant, si tes deux listes ont plein de valeurs et que tu souhaites dans ta liste 1 rechercher dans la liste 2 si le nom d'image est trouvé pour remplacer l'extension.... ça devient un peu plus compliqué...
    Dans ce cas j'opterai pour :
    - une recherche du nom de l'image dans la chaîne de caractère de la liste 1 (comprise entre le "." et le "/"), puis un recherchev dans la liste 2
    - pour faire cette recherchev le mieux serait d'avoir dans ta liste 2 une colonne avec uniquement le nom de l'image (en utilisant la formule GAUCHE($A$2;CHERCHE(".";$A$2)-1))
    - tu pourras alors remplacer l'xtension de la liste 1 par celle de la lisste 2
    => c'est un peu chaud à mettre au point (je ne vais pas avoir le temps de le faire) mais ça devrait marcher.

  6. #6
    Membre habitué Avatar de LG-69
    Homme Profil pro
    Analyste statisticien
    Inscrit en
    Juillet 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste statisticien

    Informations forums :
    Inscription : Juillet 2014
    Messages : 162
    Points : 189
    Points
    189
    Par défaut
    Bon finalement j'ai continué à chercher...

    - Si tu as ta liste d'images avec leurs chemin en colonne A
    - Tu as par ailleurs la liste des nouveaux noms d'images (avec la bonne extension) et tu as pris soin d'avoir une colonne avant ne contenant que le nom de l'image (sans extension) obtenue avec la formule simple : =GAUCHE(E3;CHERCHE(".";E3)-1) (voir image jointe). Tu nommes cette plage de données "images" (c'est pour simplifier la formule qui va suivre).
    - Il ne te reste plus que pour chacune des lignes de ta liste d'image de mettre la formule suivante :

    =REMPLACER($A2;CHERCHE("#";SUBSTITUE($A2;"/";"#";NBCAR($A2)-NBCAR(SUBSTITUE($A2;"/";""))))+1;NBCAR(DROITE($A2;NBCAR($A2)-CHERCHE("#";SUBSTITUE($A2;"/";"#";NBCAR($A2)-NBCAR(SUBSTITUE($A2;"/";""))))));RECHERCHEV(GAUCHE(DROITE($A2;NBCAR($A2)-CHERCHE("#";SUBSTITUE($A2;"/";"#";NBCAR($A2)-NBCAR(SUBSTITUE($A2;"/";"")))));CHERCHE(".";DROITE($A2;NBCAR($A2)-CHERCHE("#";SUBSTITUE($A2;"/";"#";NBCAR($A2)-NBCAR(SUBSTITUE($A2;"/";""))))))-1);images;2;FAUX))

    Par contre là j'ai vraiment pas le temps de l'expliquer.
    Ca marche quelque soit la longueur du nom de l'image, quelque soit la longueur de l'extension, quelque soit le nombre de nivvaux dans le chemin d'accès à l'image.

    Si l'image n'est pas trouvée par le RECHERCHEV tu auras N/A, là soit tu te débrouilles pour que tous les noms d'images existent dans la liste "images", soit tu fais une gestion d'erreur avec un ESTNA (si la recherchev est NA je garde la valeur de la colonne A, sinon je garde la formule complète), ça complexifie encore un peu...

    Nom : images.JPG
Affichages : 187
Taille : 88,6 Ko

    images.xlsx

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    A ce niveau de complexité pour une fonction, autant passer par du VBA (éventuellement, créer une fonction en VBA).
    Avec du VBA, il n'est pas très compliqué de repérer où se trouve le dernier / et de récupérer ce qui se trouve après.

    Mets cette fonction dans un module VBA de ton classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function NOMFICHIER(Complet As String) As String
       Dim xx As Integer
     
       For xx = Len(Complet) To 1 Step -1
          If Mid(Complet, xx, 1) = "/" Then Exit For
       Next xx
       Debug.Print xx
       NOMFICHIER = Right(Complet, Len(Complet) - xx - 1)
     
    End Function
    Ensuite, tu pourras utiliser la fonction NOMFICHIER(A1) pour avoir tout ce qui se trouve à droite du dernier / de ce qui se trouve en A1.
    Bien sûr, tu peux remplacer A1 par n'importe quelle référence de cellule.
    Tu pourras l'utiliser en corrélation avec une fonction de recherche pour avoir le nom de ton image.
    Et avec la fonction REMPLACER() pour changer le mauvais nom (avec la mauvaise extension) en le nom correct.

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Salut Loïc !

    Au lieu d'une boucle, tu peux utiliser la fonction InStrRev comme dans cette discussion les posts #2 & #4 (Demo2);
    ne pas oublier non plus la fonction Split

Discussions similaires

  1. centrer les pages entre deux colonnes
    Par speedylol dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 05/10/2006, 10h35
  2. [EXCEL] Recuperer un match entre deux colonnes
    Par biggir dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/09/2006, 20h43
  3. Swap entre deux colonnes pour 2 enregistrements
    Par Erakis dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 15/12/2005, 19h09
  4. Correspondance entre deux colonnes
    Par AlfiQue dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 09/12/2005, 14h03
  5. Minimum entre deux colonnes
    Par keikun dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/08/2005, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo