[déplacé VB6 -> VBA] Recherche dans un tableau excel sous vba

Signaler
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009
-
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009
-
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




' Début du code de travail
Sub Macro1()

'Initialisation des variables de recherche

i = 7
j = 7
Cellule = Sheets("ST").Range("K" & j).Text

'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

j = j + 1
Cellule = Sheets("ST").Range("K" & j).Text


' Fin de la boucle while

Wend

'Fin de la macro
End Sub


Le problème c'est qu'il bug et me surligne la ligne "Cellule = Sheets("ST").Range("K" & j).Text" juste après j=j+1

Mon deuxième soucis est que je voudrais chercher la valeure dans plusieurs colonnes, pas que la K mais plutot dans la K à Z.

Mefci pour toute aide

9 réponses

Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
5
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

Molenn
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009

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.

Est ce que tu comprends mieux ou pas??
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
5
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és
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009

ok je vais essayer, mais dis moi comment je peux lui dire de regarder un tableau à plusieurs colonnes, et non que la "K"?
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
5
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.


Molenn
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009

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
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009

Option Explicit

' Déclaration des variables utilisées
Dim Cellule As Variant
Dim i As String
Dim j As String



' Début du code de travail
Sub Macro1()

'Initialisation des variables de recherche
Cellule = Sheets("ST").Range("K7").Text

'Efface les cellules ou va s'affiche le résultat
Sheets("Recherche").Range("A7:I200").Select
Selection.ClearContents

'Demarage de la boucle
For i = 7 To 500
For j = 10 To 100


' Si la valeur recherchée existe dans le tableau d'origine
If Sheets("Recherche").Cells(i, j).Text = Cellule Then


' On affiche la valeur dans la cellule d'affichage
Sheets("Recherche").Range("A" & i).Value = Sheets("ST").Range("A" & i).Text
Sheets("Recherche").Range("B" & i).Value = Sheets("ST").Range("B" & i).Text
Sheets("Recherche").Range("C" & i).Value = Sheets("ST").Range("C" & i).Text
Sheets("Recherche").Range("D" & i).Value = Sheets("ST").Range("D" & i).Text
Sheets("Recherche").Range("E" & i).Value = Sheets("ST").Range("E" & i).Text
Sheets("Recherche").Range("F" & i).Value = Sheets("ST").Range("F" & i).Text
Sheets("Recherche").Range("G" & i).Value = Sheets("ST").Range("G" & i).Text
Sheets("Recherche").Range("H" & i).Value = Sheets("ST").Range("H" & i).Text
Sheets("Recherche").Range("I" & i).Value = Sheets("ST").Range("I" & i).Text


End If

Sheets("Recherche").Range("A7").Select

' Fin de la boucle
Next m
Next l


'Fin de la macro
End Sub

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
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009

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.
Messages postés
17
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
26 novembre 2009

mon programme marche très bien comme ça :

Option Explicit

' Déclaration des variables utilisées
Dim Cellule As Variant
Dim i As Integer
Dim j As Integer
Dim l As Integer
Dim Expression As String




' Début du code de travail
Sub Macro1()

l = 7

'Efface les cellules ou va s'affiche le résultat
Sheets("Recherche").Range("A7:I200").Select
Selection.ClearContents

'Demarage de la boucle

For i = 7 To 800

For j = 10 To 100

' Si la valeur recherchée existe dans le tableau d'origine
If Sheets("Recherche").Cells(2, 4).Value = Sheets("ST").Cells(i, j).Value Then


' On affiche la valeur dans la cellule d'affichage
Sheets("Recherche").Range("A" & l).Value = Sheets("ST").Range("A" & i).Text
Sheets("Recherche").Range("B" & l).Value = Sheets("ST").Range("B" & i).Text
Sheets("Recherche").Range("C" & l).Value = Sheets("ST").Range("C" & i).Text
Sheets("Recherche").Range("D" & l).Value = Sheets("ST").Range("D" & i).Text
Sheets("Recherche").Range("E" & l).Value = Sheets("ST").Range("E" & i).Text
Sheets("Recherche").Range("F" & l).Value = Sheets("ST").Range("F" & i).Text
Sheets("Recherche").Range("G" & l).Value = Sheets("ST").Range("G" & i).Text
Sheets("Recherche").Range("H" & l).Value = Sheets("ST").Range("H" & i).Text
Sheets("Recherche").Range("I" & l).Value = Sheets("ST").Range("I" & i).Value




l = l + 1
End If


Sheets("Recherche").Range("A7").Select

' Fin de la boucle
Next j
Next i


'Fin de la macro
End Sub

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??

car là je bloque