Problème recherchev sous vba

cs_encgt Messages postés 26 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 19 avril 2007 - 11 avril 2007 à 22:16
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 12 avril 2007 à 11:17
Bonjour,


je veux ajouter des colonnes à un fichier excel via une recherchevenvba,
mais je me suis heurtée à une petite difficulté: la valeur recherchée
dans ma recherchev ne saute pas de ligne!!!!! comment je peut écrire la
valeur recherché???


voici le code et merci pour votre aide

Sub ajoutcolonnes()

For i = Range("k65536").End(xlUp).Row To 2 Step -1

If Cells(i, 11).Value <> "" Then

Cells(i, 24).FormulaLocal = "=RECHERCHEV(valeur recherchée;matrice;nb;faux)"

End If

Next

End Sub

10 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
11 avril 2007 à 23:40
Je ne suis pas certain de bien comprendre, mais essaie ceci
Sub AjoutColonnes()
Dim nbLignes as long

nbLignes = Range("K65536").End(xlUp).Row
Range("X2:X" & nbLignes).FormulaLocal = "copier la formule que tu mettrais en X2"

End sub

MPi
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
11 avril 2007 à 23:41
Par contre, je ne vois pas le rapport avec un ajout de colonnes...(?)

MPi
0
cs_encgt Messages postés 26 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 19 avril 2007
12 avril 2007 à 00:07
Merci pour ta réponse

en fait je veut ajouter 3 colonnes et ce via la recherchev qui va chercher les données dans un tableau dans une autre feuille

je veut k les colonnes ajoutés correspondent chacune à un numero que je l´ai déja dans mon tableau , c´est pouquoi j utilise la recherchev mais en procédant de la sorte j ´ai tjrs le valeur recherché =á une celleule figé elle ne varie pas avec les lignes

suis je claire?

le code que tu m´as proposé ne marche pas
0
cs_encgt Messages postés 26 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 19 avril 2007
12 avril 2007 à 00:18
Bonsoir
avant je mettait ca

Range("x2").FormulaLocal = "=RECHERCHEV(k2;matrice;2;faux)"
Range("x2").AutoFill Range("x2:x5700")

le probleme c´est que je sais pas si c´est toujours j´airais 5700 lignes dans mon fichier , c´est vrmt variable , c´est pourquoi j´ai pensé à un compeur  mais le prblm c´est que la valeur recherché dans le code (voir ds autre msg haut) est figée c´est toujours k2 alors qu´elle doit être k3, k4,k256..... en fonction de la ligne

Un grd merci par avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
12 avril 2007 à 03:56
Bonsoir,
1°) dans Excel ont n'ajoute pas de colonne, ce n'est pas comme dans un grid de VB
ont écrit dessus point.
2°) Se serrait aimable d'écrire en clair (je ne comprend pas bien le language SMS)
3°) tu garde la variable i pour la lecture ou l'écriture, mais vu que tu fait une sélection, l'écriture se ferra sur la même ligne que la lecture

dim i as integer, Dest as int


Worksheets("Sheet2").Activate 'rem le nom de la feuille où tu doit copier
Dest=1
'rem :avec rows.count tu va jusqu'au bout des données mais pas plus loin
   for i=1 to Worksheets("Sheet1").rows.count 'rem sheet1=nom feuille des données
      if Worksheets("Sheet1").cells(i,11)="le tri que tu compare" then
         activesheet.cells(Dest,24).value=Worksheets("Sheet1").cells(i,11).value
         Dest=Dest+1
      end if
   next i
essaie avec ca

NB: la fonction Formulalocal ne sert que si tu compte exporter ta source en Angleterre ou au EU et que tu emploie la fonction Range("A1") au lieu de Cells sinon...ca sert à rien, à moins que je me trompe.

cordialement
louis
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
12 avril 2007 à 04:06
Ajout..
Le code que je t'ai communiquer ne fonctionnerra que pour une seule colonne,
y a t'il 3 colonne sur chaque feuille? si oui il faut indexer également 11 et 24 à mettre dans des variables et repasser le code 3 fois.
Sinon explique mieux ce que tu veux faire exactement.
A++
0
cs_encgt Messages postés 26 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 19 avril 2007
12 avril 2007 à 09:58
Bonjour
Merci pour ton aide

je me réexplique: j'ai deux fichiers excel :

le premier : contient 4 colonnes : numero de projet , nom projet, nom client,type de projet

le deuxième: j'ai plusieurs colonnes dont le numero de projet , je cherche alors à ajouter dans ce fichier le nom de projet , nom du client et type de projet en fonction du numero de projet c'est pourquoi je met la recherhev , il ne s'agit pas alos d'un copiage c'est bien une recherche de données ...

j'ai réussi à écrire un code le voilà
Range("x1").FormulaLocal = "type"
Range("x2").FormulaLocal = "=RECHERCHEV(k2;type_app_aff!tableaffairetype;2;faux)"
Range("x2").AutoFill Range("x2:x5700")




Range("y1").FormulaLocal = "nom client"
Range("y2").FormulaLocal = "=RECHERCHEV(k2;type_app_aff!ffairetype;3;faux)"
Range("y2").AutoFill Range("y2:y5700")





Range("z1").FormulaLocal = "nom projet"
Range("z2").FormulaLocal = "=RECHERCHEV(k2;type_app_aff!tableaffairetype;4;faux)"
Range("z2").AutoFill Range("z2:z5700")




le problème de ce code c'est que je doit à chaque utilisation de la macro rentrer manuellment dans visual basic editor le nombre de ligne (5700 varie), c'est pourquoi j'ai pensé à un compteur ...
voilà , j'éspère que c'est plus clairr mnt
Merci pour votre aide
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
12 avril 2007 à 10:54
Salut,

Le code que je t'ai donné fonctionne. S'il y a quelque chose qui ne fonctionne pas, c'est la formule, je pense. Il doit y avoir des signes de $ en trop ou mal placés dans ta plage qui sert à la recherche.

Comme tu sembles avoir donner des noms à tes plages, il faudrait voir quel est la valeur de ces noms...

Essaie sans utiliser de noms de plage.
Place-toi en X2 et écris une formule de RechercheV manuellement et copie-la sur plusieurs lignes. Est-ce que la formule semble correcte sur toutes ces lignes ? Si oui, inscris celle qui est en X2 (telle quelle) dans le code que je t'ai fourni.

Si tu veux que ce programme puisse être utilisé sur des PC avec configuration anglaise ou autre, tu devras changer FormulaLocal par Formula et utiliser les termes et séparateurs anglais.
exemple en français:
Sub AjoutColonnes()
Dim nbLignes as long
nbLignes = Range("K65536").End(xlUp).Row
Range("X2:X" & nbLignes). FormulaLocal = "= RechercheV(A2; C:E; 3; FAUX)"

exemple international:

Sub AjoutColonnes()

Dim nbLignes as long

nbLignes = Range("K65536").End(xlUp).Row

Range("X2:X" & nbLignes).Formula = "=VLOOKUP(A2, C:E, 3,FALSE)"

(donc, des termes anglais et des virgules comme séparateur)

MPi
0
cs_encgt Messages postés 26 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 19 avril 2007
12 avril 2007 à 11:04
Bonjour , oui ca marche , je t'en remercie
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
12 avril 2007 à 11:17
Reprenons simplement; voici personnellement comment je fais :
Ton nb de lignes égal à 5700, c'est en fait le nombre de numéro de projet de ta 4ème colonne je suppose (vu que c'est la seule qui n'est pas concernée par la copie des lignes, et vu ton code, je déduis que c'est la colonne K).

La première chose à faire comme te l'a dit MPi, c'est de récupérer le nb de lignes que tu as automatiquement, soit en partant de ta première ligne et en descendant vers le bas si tu n'as aucune ligne vide dans ta colonne, soit en partant du bas (ligne 65536) et en remontant.

Vers le bas :
Dim NumLigne as Integer
NumLigne = Right(Worksheets("Feuille1").Range("K1").End(xlDown).Address, (Len(Worksheets("Feuille1").Range("K1").End(xlDown).Address) - InStrRev(Worksheets("Feuille1").Range("K1").End(xlDown).Address, "$", , vbTextCompare)))

Vers le haut :
Dim NumLigne as Integer
NumLigne = Right(Worksheets("Feuille1").Range("K1").End(xlUp).Address, (Len(Worksheets("Feuille1").Range("K1").End(xlUp).Address) - InStrRev(Worksheets("Feuille1").Range("K1").End(xlUp).Address, "$", , vbTextCompare)))

Ensuite, tu n'as plus qu'à recopier les formules que tu as écrites dans les cellules X2, Y2 et Z2 (en une seule opération, tant qu'à faire, les colonnes sont voisines) :
Worksheets("Feuille1").Range("x1").FormulaLocal = "type"
Worksheets("Feuille1").Range("x2").FormulaLocal = "=RECHERCHEV(k2;type_app_aff!tableaffairetype;2;faux)"
Worksheets("Feuille1").Range("y1").FormulaLocal = "nom client"
Worksheets("Feuille1").Range("y2").FormulaLocal = "=RECHERCHEV(k2;type_app_aff!ffairetype;3;faux)"
Worksheets("Feuille1").Range("z1").FormulaLocal = "nom projet"
Worksheets("Feuille1").Range("z2").FormulaLocal = "=RECHERCHEV(k2;type_app_aff!tableaffairetype;4;faux)"

'Copie des formules
Worksheets("Feuille1").Range("X2:Z" & NumLigne).FillDown

Normalement, ça doit suffire. Les noms de plage ne doivent poser aucun problème, mais quand tu utilises des objets Range, si ton bouton est attaché à une autre feuille du classeur Excel, pense à définir l'objet Range en fonction de l'objet Worksheets (nom de la feuille).
Autre chose, personnellement, j'ai une version française d'EXCEL, et j'utilise plutôt le Range. FormulaR1C1 ... Et bien, je suis obligé d'utiliser l'écriture internationale avec VLOOKUP.

Molenn
0
Rejoignez-nous