Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu]

Myth

XLDnaute Nouveau
Bonjour
Voilà, ça fais plusieurs heures que je recherche des solutions sans succès.
Le principe :
Avec une base de ce type
A B C D
200101 w x c v
200102 q s d f
200103 a z e t

et une feuille de ce type
Code de référence
101
102
105
106
1125
1126

je recherche à copier la colonne c en fonction du code de référence
résultat attendus :
Code de référence C
101 c
102 d
105 q
106 c
1125 d
1126 e
Ce que je fais actuellement
J'utilise des fonctions excel de base
si(A1<1000;droite(A1;3);droite(A1;4) pour récuperer les 3 ou 4 derniers caractères
Ensuite j'utilise une rechercheV puis je copie les valeurs.
Ma recherche
Je cherche un moyen pour automatiser cette copie.

NB : Désolé pour la présentation du tableau, sur le forum les espaces ne sont pas compter.
CI-joint un fichier d'exemple

PS( modification suites aux réponses) : Je recherche à l'automatiser à l'aide de vba et je n'arrive pas a le mettre en forme correctement.
 

Pièces jointes

  • recherche.xlsx
    9 KB · Affichages: 88
  • recherche.xlsx
    9 KB · Affichages: 99
  • recherche.xlsx
    9 KB · Affichages: 98
Dernière édition:

Tibo

XLDnaute Barbatruc
Re : Recherche une valeur d'après les 3 derniers chiffre d'une autre cellule.

Bonjour,

Un essai avec une formule matricielle en B2 :

Code:
=INDEX('Base de donnée'!$B$2:$E$9;EQUIV(A2&"";DROITE('Base de donnée'!$A$2:$A$9;NBCAR(A2));0);EQUIV($B$1;'Base de donnée'!$B$1:$E$1;0))

Formule matricielle à valider par CTRL + MAJ + ENTREE

à recopier vers le bas

@+
 

Dranreb

XLDnaute Barbatruc
Re : Recherche une valeur d'après les 3 derniers chiffre d'une autre cellule.

Bonjour
Essayer
Code:
=INDEX('Base de donnée'!$B$2:$E$9;EQUIV(("200"&$A2)+0;'Base de donnée'!$A$2:$A$9;0);EQUIV($B$1;'Base de donnée'!$B$1:$E$1;0))
Cordialement.
 

Myth

XLDnaute Nouveau
Re : Recherche une valeur d'après les 3 derniers chiffre d'une autre cellule.

Merci pour vos réponses. Mais je me suis mal exprimé. Je cherche à pouvoir automatiser la copie à l'aide d'une macro en vba. J'ai essayé avec les fonctions IF mais je n'arrive pas à la mettre en forme correctement.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Dès lors qu'on dispose d'une solution par formule on a du même coup une solution par VBA puisqu'il
suffit d'affecter cette formule aux cellules concernées puis de leur réaffecter leur valeur.

Bonne soirée, à demain.
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Bonsoir le fil :),
Dès lors qu'on dispose d'une solution par formule on a du même coup une solution par VBA puisqu'il suffit d'affecter cette formule aux cellules concernées puis de leur réaffecter leur valeur.
C'est juste sur le principe, mais dans la pratique, je ne m'y amuserais pas :rolleyes:...
A tester
Code:
Dim I As Integer
With Feuil4
For I = 2 To .Range("A65000").End(xlUp).Row
.Range("B" & I) = Feuil1.Range("A:A").Find("200" & .Range("A" & I), , , xlWhole).Offset(0, 3)
Next I
End With
Bonne soirée :cool:
 

Myth

XLDnaute Nouveau
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Bonsoir,
Alors j'ai essayé d'intégrer ton code sans succès. En faite je ne vois pas comment elle fonctionne. ( je débute en vba)
 

JNP

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Re :),
Alors j'ai essayé d'intégrer ton code sans succès. En faite je ne vois pas comment elle fonctionne. ( je débute en vba)
L'as-tu testé sur ton fichier test ? Chez moi, elle fonctionne :rolleyes:...
Si tu as essayé de l'adapter à ton fichier, attention, j'ai utilisé les CodeName des pages, si tu veux utiliser le Name (nom de l'onglet), il faut remplacer Feuil4 et Feuil1 par Sheets("Feuil4") et Sheets("Feuil1") :p.
Pour le fonctionnement :
VB:
Dim I As Integer
' Va servir à faire toutes les lignes de ta feuille receveuse
' Si tu as plus de 32000 lignes, il faut mettre As Long à la place de As Integer
With Feuil4
' Avec la feuille receveuse (With Sheets("Feuille receveuse")
For I = 2 To .Range("A65000").End(xlUp).Row
' De I = 2 à la dernière ligne non vide en partant de la ligne 65000
' Si tu as plus de 65000 lignes, à modifier, mais tu ne sera plus compatible 2003
.Range("B" & I) = Feuil1.Range("A:A").Find("200" & .Range("A" & I), , , xlWhole).Offset(0, 3)
' La ligne I de la colonne B de la feuille en With est égale
' à la valeur trouvée en colonne A de la feuille BDD en ajoutant 200 devant la fin de ton code
' le tout décalé de 3 colonnes pour ramener la bonne valeur
Next I
' Ligne suivante
End With
' Fin de "Avec la feuille..."
Bon courage :cool:
 

Dranreb

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Bonjour à tous.

JNP,
C'est juste sur le principe, mais dans la pratique, je ne m'y amuserais pas.
J'ai pourtant constaté que c'est très souvent la solution la plus performante parce qu'elle minimise à la fois le nombre d'instructions VBA exécutées et le nombre de requêtes adressées à Excel. Si plus d'une colonne à traiter, mettre les calculs en manuel.

Cordialement.
 

Myth

XLDnaute Nouveau
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Bonjours,
Ca marche très bien. Mais en réalité, j'ai fais une erreur dans l'énoncé.

Avec une base de ce type
A B C D
200101 w x c v
200102 q s d f
200103 a z e t
2001123
2001125

Ici je me suis trompé.
La base se présente comme celà
Avec une base de ce type
A B C D
200101 w x c v
200102 q s d f
200103 a z e t
201123
202124
 

Dranreb

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Daccord.
Il suffit donc d'ajouter 200000.
Ma solution à la fois Excel et VBA devient :
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim F1 As Worksheet, RgBCA As Range, RgBL1 As Range, RgRéc As Range
Set F1 = ThisWorkbook.Worksheets(1)
Set RgBCA = Application.Range(F1.Cells(2, 1), F1.Cells(65536, 1).End(xlUp))
Set RgBL1 = Application.Range(F1.Cells(1, 2), F1.Cells(1, 2).End(xlToRight))
Set RgRéc = Application.Range(Me.[A2], Me.[A65000].End(xlUp)).Offset(, 1)
RgRéc.FormulaR1C1 = "=INDEX(" & Intersect(RgBL1.EntireColumn, RgBCA.EntireRow).Address(True, True, xlR1C1, True) _
   & ",MATCH(RC1+200000," & RgBCA.Address(True, True, xlR1C1, True) & ",0),MATCH(R1C," _
   & RgBL1.Address(True, True, xlR1C1, True) & ",0))"
RgRéc.Value = RgRéc.Value
End Sub
À mettre dans le module associé à la feiulle réceptrice.

Bon courage.
 

Myth

XLDnaute Nouveau
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Bonjour,
Merci beaucoup, mais je poursuis également un objectif éducatif, ainsi je voudrais le faire uniquement par vba en essayant de comprendre au mieux son fonctionnement.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Oui, ma solution est mise en oeuvre uniquement par VBA mais en exploitant au maximum la puissance de résolution de formules d'Excel. Cette procédure évènementielle une fois installée, je vous suggère de mettre derrière chaque instruction un commentaire expliquant ce qu'elle fait. Positionnez le curseur sur chaque mot que vous ne comprenez pas et faite F1. Je vais préparer de mon coté un corrigé et vous le communiquerais en retour de votre exercice si celà vous intéresse.

À+
 

Myth

XLDnaute Nouveau
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Ca marche merci bien, je vais le faire.

A part celà, je me demandais si il n'y avait pas une formule pour utiliser le code de JNP en ne détectant que les 3 ou 4 dernières valeurs
 

JNP

XLDnaute Barbatruc
Re : Recherche d'après les 3 derniers chiffres d'une autre cellule en vba.[Non résolu

Re :),
Oui, ma solution est mise en oeuvre uniquement par VBA mais en exploitant au maximum la puissance de résolution de formules d'Excel.
Ça n'exploite pas par contre la simplicité de VBA, sa souplesse ni sa rapidité :rolleyes:... Mais bon, chacun a le droit de voir midi à sa porte, et heureusement ;).

@ Myth : Vois si cela te convient en modifiant juste la ligne
Code:
.Range("B" & I) = Feuil1.Range("A:A").Find(200000 + .Range("A" & I), , , xlWhole).Offset(0, 3)
Bonne soirée :cool:
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 944
Membres
101 849
dernier inscrit
florentMIG