Rechercher une valeur sur plusieurs lignes

Résolu
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   -  
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

j'ai fais un code qui me permet de rechercher une valeur entré dans une inputbox.
Si ce qui est entré dans l'inputbox correspond à une valeur de ma cellule B alors je
sélectionne la valeur en cellule A qui est le nom d'un fichier. J'ouvre ensuite ce fichier
et je recherche une valeur ($cahier) en colonne B. Si la valeur est présente alors je copie certaines
valeurs de cette ligne dans ma première feuille de mon classeur sinon j'affiche un message
d'erreur.

Le problème est que la valeur que je recherche dans la feuille ouverte est parfois présente sur
plusieurs lignes.
J'aimerais donc que mon programme récupère toutes les valeurs demandé lorsque $cahier est présent.
J'ai essayé avec plusieurs code mais impossible de trouver la solution.

Si quelqu'un pouvait m'aiguiller svp.


Sub recherche()

Dim i As Long
Dim j As Long
Dim l As Long
Dim req As String
Dim Fichier As String
Dim CheminFichier As String
Dim celluletrouvee As Range
Dim indice As String
Dim ligne As Long
Dim col As Long

CheminFichier = "C: ..."

re:

req = InputBox("Renseignez un nom")

If req = "" Then
MsgBox "Vous n'avez rien saisie"
GoTo re
End If

If req <> "" Then

Application.ScreenUpdating = False

i = 2
j = 2
l = 1

Do While Sheets("donnees").Cells(i, 2).Value <> ""


If req = Sheets("donnees").Cells(i, 2).Value Then

Fichier = Sheets("donnees").Cells(i, 1).Value

Workbooks.Open (CheminFichier & Fichier)

indice = "$cahier"

Set celluletrouvee = Range("B16:B100").Find(indice, lookat:=xlWhole)

If celluletrouvee Is Nothing Then
MsgBox ("Aucun nom ne correspond")
Else

ligne = celluletrouvee.Row 'k
col = celluletrouvee.Column

kol:
Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, l).Value = Cells((ligne - 1), (col + 1)).Value
Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, (l + 1)).Value = Cells((ligne - 1), (col + 3)).Value
Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, (l + 2)).Value = Cells((ligne - 1), (col + 4)).Value
Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, (l + 3)).Value = Cells((ligne - 1), (col + 5)).Value
Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, 5).Value = Workbooks("Programme.xlsm").Sheets("donnees").Cells(i, 1).Value


ligne = ligne + 1

If celluletrouvee <> "" Then

Do While Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, l).Value <> ""

l = l + 1

Loop

GoTo kol


End If


Workbooks(Fichier).Close (True)

End If


j = j + 1

End If

i = i + 1
Loop
end if

end Sub
A voir également:

4 réponses

michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Bonjour,

Juste pour le problème Valeur sur plusieurs lignes



déclarations:
Dim Plage as range
Dim Ligne as Byte 'tu ne vas que de 6 à 100
suppression de cellule trouvée
et
suppression de col
tu cherches "$cahier" dans la colonne B donc Col sera toujours égale à "B" (ou 2)


je n'ai pas regardé les imbrications avec i et j peut ^tre avant ou après le next.. à toi de voir

Workbooks.Open (CheminFichier & Fichier)
indice = "$cahier"
Set Plage = Sheets(1).Range("B16:B100") 'sheets non précisé à adapter
nbre = Application.CountIf(Plage, indice)
If nbre = 0 Then
ligne = 15
For Cptr = 1 To nbre
ligne = Plage.Find(indice, Cells(ligne, "B"), lookat:=xlWhole).Row
With Workbooks("Programme.xlsm").Sheets("Inv")
.Cells(j, (l + 1)).Value = Cells((ligne - 1), "C")
'... etc
End With
Next
End If
Else
'msgbox.....




 Michel
0
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   7
 
Bonjour,

merci pour votre réponse.
Cependant, ce code ne fonctionne pas.
Ai-je peut-être fais une erreur ?

Sub recherche()

Dim i As Long
Dim j As Long
Dim l As Long
Dim req As String
Dim Fichier As String
Dim CheminFichier As String
Dim indice As String
Dim ligne As Long
Dim Plage As Range
Dim repere As Byte

CheminFichier = "C: ..."

re:

req = InputBox("Renseignez un nom")

If req = "" Then
MsgBox "Vous n'avez rien saisie"
GoTo re
End If

If req <> "" Then

Application.ScreenUpdating = False

i = 2
j = 2
l = 1

Do While Sheets("donnees").Cells(i, 2).Value <> ""


If req = Sheets("donnees").Cells(i, 2).Value Then

Fichier = Sheets("donnees").Cells(i, 1).Value

Workbooks.Open (CheminFichier & Fichier)

indice = "$cahier"

Set Plage = Sheets(1).Range("B16:B100")

nbre = Application.CountIf(Plage, indice)
If nbre = 0 Then
repere = 15
For Cptr = 1 To nbre
repere = Plage.Find(indice, Cells(Ligne, "B"), lookat:=xlWhole).Row
With Workbooks("Programme.xlsm").Sheets("Inv")
.Cells(j, (l + 1)).Value = Cells((Ligne - 1), "C")
.Cells(j, l).Value = Cells((Ligne - 1), "B")
.Cells(j, (l + 2)).Value = Cells((Ligne - 1), "D")
.Cells(j, (l + 3)).Value = Cells((Ligne - 1), "E")

End With
Next
Workbooks("Programme.xlsm").Sheets("Inv").Cells(j, 5).Value = Workbooks("Programmexlsm").Sheets("donnees").Cells(i, 1).Value

End If

Workbooks(Fichier).Close (True)

end if
i = i + 1
loop

end if

end sub
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
bonjour,
je n'ai plus le pb en t^te mais j'ai du écrire une C... (au choix)

if nbre>0 au lieu de nbre=0
0
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   7
 
Merci, en effet je pense que c'était une partie du problème ;)
Mais j'ai une autre erreur sur :
repere = Plage.Find(indice, Cells(Ligne, "B"), lookat:=xlWhole).Row

"L'indice n'appartient pas à la sélection"
Sauriez-vous pourquoi ?

Merci pour votre aide.
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314 > siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention  
 
ce coup-ci , ca fait 1 partout ;o° (je sais , c'est lundi)

moi je parlais de "ligne" et toi de "repère "
donc en employant "repere"
repere = Plage.Find(indice, Cells(repere, "B"), lookat:=xlWhole).Row
0
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   7
 
Maintenant j'ai une "incompatibilité de type" :(
0
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   7
 
UP svp
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
BONJOUR,

Je n'ai pas que ca à faire !

le mieux est de joindre les 2 classeurs dans un zip

Mettre le zip sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci par un clic droit sur le lien proposé dans le message de réponse


0
siamens_duj Messages postés 192 Date d'inscription   Statut Membre Dernière intervention   7
 
Bonjour,
c'est bon j'ai réussi.
Merci.
0