[déplacé VB6 -> VBA] Recherche dans un tableau excel sous vba
ben85player
Messages postés17Date d'inscriptionjeudi 12 novembre 2009StatutMembreDernière intervention26 novembre 2009
-
12 nov. 2009 à 11:06
ben85player
Messages postés17Date d'inscriptionjeudi 12 novembre 2009StatutMembreDernière intervention26 novembre 2009
-
12 nov. 2009 à 16:49
Bonjour je dois réaliser un programme qui recherche dans un tableau une valeure précise (dans une première feuille et qui me l'affiche dans une deuxième feuille)
voilà le programme:
Option Explicit
' Déclaration des variables utilisées
Dim Cellule As Variant
Dim i As String
Dim j As String
'Efface les cellules ou va s'affiche le résultat
Sheets("Recherche").Range("C7:C65536").Select
Selection.ClearContents
'Va faire une recherche dans le tableau d'origine tant que
'la premiére colonne n'est pas nulle (Permet de travailler sur une colonne de longueur variable)
While Cellule <> 0
' Si la valeur recherchée existe dans le tableau d'origine
If Cellule = Sheets("Recherche").Range("C4").Text Then
' On affiche la valeur dans la cellule d'affichage
Sheets("Recherche").Range("C" & i).Value = Sheets("ST").Range("G" & j).Text
' Et on descend d'une ligne
i = i + 1
End If
' On cherche dans la ligne suivante du tableau d'origine
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 12 nov. 2009 à 11:25
Salut,
Première remarque : Tu es obligé de le faire en code ? Parce qu'avec les formules RECHERCHEH et RECHERCHEV d'EXCEL, tu peux faire ce que tu veux sans trop te fouler je pense.
Ensuite, pour ton code, je conseille d'utiliser la propriété .value plutôt que .text, même si celle-ci peut avoir son utilité.
Enfin, j'avoue que j'ai du mal à saisir le but de ton code :
Tu cherches une valeur dans une feuille, et si cette valeur existe, tu l'écris dans une autre feuille ? L'intérêt de chercher quelque chose que tu as rentré en paramètre pour le ré-écrire m'échappe, si tu pouvais préciser un peu plus, ça m'arrangerait :)
En l'état, je partirai sur un truc de ce genre moi :
'Valeur cherchée
Dim ValeurCellule as string
ValeurCellule = WorkSheets("ST").Range("K7").Value
'Boucle défilant la plage de recherche (A1:D100) => à adapter en fonction des besoins
Dim i as integer
Dim j as integer
for i = 1 to 100
for j = 1 to 4
if worksheets("Recherche").cells(i,j).value = ValeurCellule then
'Ton action à faire
end if
next j
next i
ben85player
Messages postés17Date d'inscriptionjeudi 12 novembre 2009StatutMembreDernière intervention26 novembre 2009 12 nov. 2009 à 11:42
J'ai déjà essayé avec les fonctions recherche, index et equiv mais la recherche est trop compliquée.
Je m'explique, dans une première feuille "ST" j'ai le nom du sous traitant, son adresse, son num de téléphone, et l'affaire sur laquelle il a répondu. Et un lien pour son devis.
Sur la droite de ce tableau je rentre manuellement sur un grand nombre de colonnes toutes les reférences du devis, par expemple bleu, rouge, jaune, vert.
Le problème c'est que bleu peut se retrouver sur plusieurs sous traitant donc index, equiv ne marche pas.
Dans la feuille recherche je lui indique la recherche à effectuer et lui m'indique tous les sous traitants qui ont bleu dans leur devis.
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 12 nov. 2009 à 14:00
OK.
Donc, pour le code, la boucle que je t'ai donné, moyennant quelques adaptations, peut suffire.
La boucle défile, quand tu rentres dans la condition (après le Then), tu sais que la ligne i contient un fournisseur avec ton critère.
Tu n'as plus qu'à recopier la ligne complète sur ton autre feuille (en utilisant une variable Compteur) pour que ta liste de sous-traitant ayant le critère "toto" soit affichée.
Une autre solution, surtout si c'est pour du ponctuel, c'est d'utiliser les filtres élaborés d'EXCEL (un ex. de tutorial : http://www.ybet.be/formation_excell/13-filtre-elabore.htm) Schématiquement, ça revient à considérer ta feuille EXCEL comme une base de données, et à faire des requêtes sous forme quasi-graphique, un peu comme avec l'assistant Requête d'ACCESS. La première utilisation est toujours un peu fastidieuse, mais une fois habitué, c'est pas trop mal.
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 12 nov. 2009 à 14:22
C'est ce que je t'ai mis dans ma boucle.
Dans Excel, tu peux faire référence à une cellule par plusieurs moyens :
- .Range que tu as utilisé, qui s'utilise de la façon suivante .Range("K1") ... mais ça t'oblige à faire ensuite .Range("L1"), etc ... Ou alors créer une variable ou un Array qui contienrait les lettres des colonnes. Pas pratique.
- .Cells qui fait référence à une celle par sa ligne puis sa colonne : .cells(2,3) revient à Range("C2").
Partant de là, comme dans le bout de code donné plus haut, tu peux faire une boucle avec la colonne en paramètre.
for j = 11 to 15
debug.print cells(2,j).value
next j
Cette boucle affichera successivement dans le débugger le contenu de tes cellules : K2, L2, M2, N2, O2
En résumé, tu imbriques deux boucles avec en paramètres le n° de ligne et le n° de colonne et tu défileras toute la plage dont tu as besoin.
ben85player
Messages postés17Date d'inscriptionjeudi 12 novembre 2009StatutMembreDernière intervention26 novembre 2009 12 nov. 2009 à 14:34
ah d'accord, merci pour tous ces conseils, je vais essayer de mettre ça en pratique maintenant, mais pas facile quand ça fait 5 ans que tu n'as pas touché du VBA
Mais il m'affiche toutes les lignes une par une car il ne vérifie pas d'abord la valeur en D4 de la feuille Recherche par rapport à la valeur K7 de la feuille ST
ben85player
Messages postés17Date d'inscriptionjeudi 12 novembre 2009StatutMembreDernière intervention26 novembre 2009 12 nov. 2009 à 15:26
non c'est bon j'ai réussi sauf qu'il me copie les valeurs comme dans le premier tableau et non l'une à la suite des autres mais c'est juste un compteur à mettre en plus je pense.
Merci en tout cas.
le petit problème en plus est que je voudrais qu'il ne cherche pas le mot exacte mais plutot une partie du mot, par exemple je lui indique rechercher bleu, et il me met tous les résultats avec le mot bleu, tel que bleu cyan, bleu vert,...
et deuxième petit problème dans la colonne I de la feuille ST il y a un texte avec un lien hypertexte, et quand il le recopie dans la feuille Recherche, le lien est perdu. Comment faire??