Méthode Find

Dapounet

XLDnaute Nouveau
Bonjour à tous !

Comme j'ai pu l'annoncer dans ma présentation je suis un néophite de la programmation sous VBA ! Je n'ai jamais eu l'occasion de développer sous ce langage !
Mais à l'heure d'aujourd'hui, on m'a demandé de l'aide pour réaliser une macro sous excel.
J'ai quand même quelques notions en programmation (principalement en java) et j'essaie de faire des liens, mais j'ai beaucoup de mal.


Concernant le projet à réaliser, j'ai besoin de trouver l'état "Etat" d'une valeur "V1" d'une feuille "f1", sur une colonne d'une feuille "f2".

Ce n'est pas forcément très clair, je vais essayer de donner plus d'informations et un exemple :

J'ai 2 feuilles : 1 que l'on peux comparer à un garage automobile et la deuxième que l'on peut considérer comme le fichiers de toutes les réparations à effectuer.
Dans le garage, chaque ligne correspond à un véhicule. Chaque ligne de la deuxième feuille correspond à une réparations à effectuer sur ces véhicules (vitre cassées, problème de direction.... par exemple).
Sur ma première feuille, je n'ai aucun renseignement sur l'état d'avancement des réparations mais j'ai tout de même les références des réparations à faire. Sur la deuxième feuille, j'ai les réparations à effectuer avec leur état (réparé ou non) mais pas la correspondance au véhicule.

Le lien entre ces 2 feuilles est donc le numéro de la réparation.
J'aimerais pouvoir garder les 2 feuilles et avoir un suivi de chaque véhicule.
Pour cela, j'aurais besoin de :
- chercher dans la deuxième feuille le numéro d'anomalie correspondant au véhicule
- de trouver l'état d'avancement de la réparation
- de copier cet état dans ma première feuille.

Tout en sachant bien sûr (pour pimenter le tout ^^" ) que tous les véhicules n'ont pas forcément de réparations à effectuer !
Le tout permettant de savoir quel véhicule est apte ou non à circuler !

(PS : je m'épatte sur mon inventivité car ce n'est absolument pas le cadre de mon travail ! mais parlant en même temps du salon de l'auto avec un collègue, c'est le seul exemple qui m'est venu en tête ! ^^" )

En espérant vous avoir fournit assez de détail pour pouvoir m'aider ?! Sinon, de toute façon, je repasserais sur le forum pour voir =)

Voici le début de mon code :

Code:
Sub TestResearch()
'
' TestResearch Macro
' Essai pour la recherche d'une valeur en VB
'
    
'
' Définition des variables
' numAno = numero de l'anomalie a chercher
' ligne = numéro de la ligne sur laquelle on souhaite effectuer la recherche
' colonne = numéro de la colonne sur laquelle on souhaite effectuer la recherche
' plage est la plage sur laquelle on souhaite effectuer la recherche
'

    Dim numAno As String
    Dim ligne As Integer
    Dim colonne As Integer
    Dim Plage As Range
    

'
' Initialisation des variables
'
    
    ligne = 18
    colonne = 9
    numAno = Workbooks(1).Worksheets(2).Cells(colonne, ligne)
       
    Set Plage = Worksheets(4).Range("B4:B20773").Find(numAno)
    Plage.Select


End Sub

Sachant que je n'ai pas eu l'occasion de tester les bouts de codes copiés directement à partir du net, je ne comprends pas à quoi sert le "Plage.Select". Et je ne suis pas du tout sûr de mon Find :eek:

Merci d'avance pour les conseils que vous pourrez m'apporter =)
 

jp14

XLDnaute Barbatruc
Re : Méthode Find

Bonsoir

"Concernant le projet à réaliser, j'ai besoin de trouver l'état "Etat" d'une valeur "V1" d'une feuille "f1", sur une colonne d'une feuille "f2"".

Ci dessous une fonction qui recherche une valeur dans une plage( zone contenant des cellules) d'une feuille

Code:
'---------------------------------------------------------------------------------------
' Procedure : recherchemot
' DateTime  : 30/06/2007 20:35
' Author    : jp14
' Pour      : http://www.excel-downloads
' Utilisation   :
' dim lig as long
'etat =recherchemot(plage_pour la recherche,valeur_cherché,nom_de_la_feuille )
' ad plage de recherche
'ad = "a2:" & Sheets("rue").Cells.SpecialCells(xlCellTypeLastCell).Address(0, 0) ' on recherche dans l'ensemble de la feuille
'
'---------------------------------------------------------------------------------------
'
Function recherchemot(plage_recherche As String, valcherche As Variant, nom_de_la_feuille As String)
Dim firstAddress As String
Dim cel As Range
Dim ligne1 As Long
Dim ligne2 As Long


With Sheets(nom_de_la_feuille).Range(plage_recherche)
     Set cel = .Find(valcherche, LookIn:=xlValues, SearchOrder:=xlByColumns, lookat:=xlWhole) ' on recherche ligne par ligne
  If Not cel Is Nothing Then
        recherchemot = cel.Offset(0, 1).Value
        Exit Function
    End If
End With
recherchemot = 0

End Function
exemple
etat =recherchemot("B4:B20773","V1","f1" )
L'etat de la valeur v1 se trouve dans la cellule adjacente, offset(0,1) même ligne, colonne suivante.
recherchemot = cel.Offset(0, 1).Value


A tester
 
G

Guest

Guest
Re : Méthode Find

Bonjour Dapounet,


La methode select ne sert qu'a selectionner la cellule trouvée correspondant à l'occurence cherchée.
Quant à la méthode Find, l'aide excel sur cette méthode est très précise.

Pour ce qui est de tes lignes de code, j'écrirais:

Code:
    Set Plage = Worksheets(4).Range("B4:B20773").Find(What:=numAno,Lookin:=xlValues)
    IF not Plage Is Nothing Then
         Plage.Select
         .....Autre traitement....
    End iF

Pour des réponses plus précises, un fichier exemple serait utile.

A bientôt
 

Roland_M

XLDnaute Barbatruc
Re : Méthode Find

bonsoir

si je puis me permettre un petit rappel au sujet de Find qui m'a déjà causé des problèmes,
il est recommandé avec Find de préciser tous les paramètres au risque d'avoir des surprises quand au résultat !
car Find garde en mémoire la dernière recherche effectuée qui peut ne pas correspondre au besoin du moment !
'Find(ChaineRecherchée, After:=pas obligé, LookIn:=valeur ou formule ou autre, Lookat:=chaine entière ou pas important !, MatchCase:=True=tient compte de la case False=n'en tient pas compte, SearchOrder:=par ligne ou par colonne, SearchDirection:=suite)
exemple:
Set FindRang = Sheets(FEUIL).Range(Range).Find(ChaineRecherche, After:=ActiveCell, LookIn:=xlValues, Lookat:=xlWhole, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not FindRang Is Nothing Then = "Trouvé !"
 

Dapounet

XLDnaute Nouveau
Re : Méthode Find

Voici un bout de mon tableau et donc des feuilles relatives.

Sur la première feuille, on peut retrouver en première colonne le numéro que l'on peut attribuer au véhicule. Ensuite, les colonnes G à M contiennent les numéros de réparations.

Sur la deuxième feuille, on peut retrouver en première colonne les numéros de réparations à effectuer. En deuxième colonne, le numéro du véhicule attaché à la réparation. Et finalement, l'état en colonne "AJ".

J'aimerais pouvoir avoir l'état en colonne "AD" de la première feuille, est ce possible ?! oO

Merci beaucoup pour vos conseils ;)
 

Pièces jointes

  • Maintenance garage.xls
    18.5 KB · Affichages: 130
  • Maintenance garage.xls
    18.5 KB · Affichages: 130
  • Maintenance garage.xls
    18.5 KB · Affichages: 128

Dapounet

XLDnaute Nouveau
Re : Méthode Find

Pour faire une synthèse, si j'ai bien compris la leçon : ( ^^" )

Set Plage = Worksheets(4).Range("B4:B20773").Find(What:=numAno, After:=Cells(colonne, ligne), LookIn:=xlValues, Lookat:=xlWhole, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not FindRang Is Nothing Then = "Trouvé !"

M'indiquera "Trouvé !" si il y a bien une valeur correspondant à ma réparation ?!
De plus, est ce que : "After:=Cells(colonne, ligne)" est juste ? Puis-je lui passer 2 constantes en paramètres ?

J'aurais besoin d'aide aussi concernant le reste du traitement : comment recopier la valeur trouvé en feuille 2, dans la feuille 1 en effectuant un test dessus ?
Car en effet, si le véhicule n'a pas toutes les réparations d'effectuées, il n'est pas considéré comme "roulant". Je pensais à un test type :

Code:
IF NOT Plage IS NOTHING THEN 
    IF Plage.Select=="Validé" THEN
        Ajout de la valeur dans la feuille 1
        colonne++
    ENDIF
    IF Plage.Select!="Validé" THEN
        Ajout de la valeur dans la feuille 1 (au même endroit que pour la condition précédente)
        ligne++
    ENDIF
ENDIF
IF Plage IS NOTHING THEN
    colonne++
ENDIF
(Je tiens à préciser que ce que je viens de coder est fait totalement comme ça m'est passé par la tête !! ^^" Je vous prie donc de m'excuser si j'ai fait de grosses erreurs ! )

Est-ce juste ? Que pouvez-vous me conseiller ?
 

skoobi

XLDnaute Barbatruc
Re : Méthode Find

Bonsoir,

si j'ai bien compris, dans les 2 cas de figure, tu ajoutes (dans la ligne suivante colonne A?) dans la feuille 1 donc:

Code:
If Not Plage Is Nothing Then
    Sheets(1).Range("A65536").End(xlUp).Offset(1, 0).Value = Plage.Value
    If Plage.Value = "Validé" Then
'     ???   colonne++ ???
    ElseIf Plage.Value <> "Validé" Then
'     ???   ligne++  ???
    End If
Else
  colonne++
End If
 

Dapounet

XLDnaute Nouveau
Re : Méthode Find

Et bien en fait, c'est presque ça ! ^^"

Je voudrais ajouter la valeur dans une case "éloigné" !
Histoire de garder une certaine lisibilitée dans le tableau.

Je ne peux pas tester ta méthode ce soir mais l'essaierai dès demain matin au travail !

Pour le "colonne ++" et le "ligne++", je cherche à incrémenter d'un, la valeur de colonne et/ou de ligne (qui sont deux variables de type entier). Ce n'est pas la bonne méthode ?!
 

Dapounet

XLDnaute Nouveau
Re : Méthode Find

alors en fait, je pensais incrémenter ces valeurs pour me permettre de passer à l'anomalie suivante en général.

en fait, le "colonne++" me sert à passer à la réparation suivante du véhicule.
on regarde si il y a des réparations.
si oui, on regarde son état.
si c'est "réparé", on incrémente "colonne" afin de regarder si il y a une autre réparation à effectuer (donc dans la colonne suivante) et on passe le statut du véhicule à "réparé" en attendant un éventuel changement d'état sur une éventuelle autre anomalie.
si l'état est "non réparé", on passe l'état du véhicule à "non réparé" et on incrémente ligne pour passer au véhicule suivant étant donné que si un véhicule à une réparation qui n'est pas faite, il est considéré comme non roulant.

en espérant avoir été clair ?! :S

par rapport aux fichiers que j'ai pu laisser dans un précédent message, par exemple :

on regarde le statut de la réparation 1 dans la feuille 2 (après l'avoir cherché).
si l'état est "réparé", on passe le statut du véhicule à "réparé" sur la feuille 1(recopier le statut de l'anomalie est-il une bonne solution ?!), on incrémente la variable colonne afin de regarder si il y a une autre réparation (en l'occurence, la réparation 2)
ensuite, on recommence le même procédé.
si l'état de la réparation 2 est "réparé", on remplace le statut du véhicule de nouveau par celui de l'anomalie ("réparé"). et on réincrémente colonne.
on recommence toujours le même procédé. là, si on imagine que la réparation 3 n'est "pas réparée", on recopie ce statut pour l'état du véhicule ("pas réparée"), on repasse la variable colonne à la valeur de la première colonne avec les réparations (ici, la colonne G), et on incrémente la variable "ligne" d'une unitée afin de passer au véhicule suivant.
on recommence le procédé de recherche de statut.
si on considère qu'il n'y a pas de réparations à effectuer pour le deuxième véhicule (ligne 2 avec rien dans la colonne G), on passe le statut du véhicule à "réparé" et on incrémente la variable ligne d'une unitée afin de passer au véhicule suivant.


edit : je souhaiterais que l'état du véhicule soit placé dans la colonne AD. comment puis-je faire ?!
 
Dernière édition:

Dapounet

XLDnaute Nouveau
Re : Méthode Find

Hey, je ne peux pas fournir mon tableau exact car il est confidentiel (ce n'est pas une gestion de garage ! ^^" ).
Cependant, dès mon arrivée au travail demain, j'enverrais une version "light" pour vous aider ..... à m'aider =)

Sinon, j'ai un petit peux avancé dans mon code et commence à comprendre certaines choses en VBA !!! Sweeeeeeeeeeeeeeeeeeeeeeeeeet !! ^^"

Voici où en est mon code à l'heure actuelle :

Code:
Sub TestResearch()
'
' TestResearch Macro
' Essai pour la recherche d'une valeur en VB
'
    
'
' Définition des variables
' numAno = numero de l'anomalie a chercher
' ligne = numéro de la ligne sur laquelle on souhaite effectuer la recherche
' colonne = numéro de la colonne sur laquelle on souhaite effectuer la recherche
' plage est la plage sur laquelle on souhaite effectuer la recherche
'

    Dim numAno As String
    Dim toto
    Dim lignef1 As Integer
    Dim colonnef1 As Integer
    Dim lignef2 As Integer
    Dim colonnef2 As Integer
    Dim Plage As Range
    

'
' Initialisation des variables
' Worksheets(2).Cells(lignef1, colonnef1) nous pose sur la cellule H2, premiere case avec anomalie sur la feuille 2
' Worksheets(4).Cells(lignef2, colonnef2) nous pose sur la cellule B4, premiere case avec anomalie sur la feuille 4
'
    
    lignef1 = 2
    colonnef1 = 8
    lignef2 = 3
    colonnef2 = 2
    
    numAno = Worksheets(7).Cells(lignef1, colonnef1).Value
       
'
' Debut du traitement a effectuer
'
' UnePlage.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte) où :
' What est l'élément à trouver. Obligatoire (les autres paramètres sont facultatifs mais tres fortement conseille).
' After est la cellule après laquelle est commencée la recherche.
' LookIn précise dans quoi rechercher l'élément, xlFormulas, xlValues ou xlComments. A noter que si vous recherchez une date et que celle-ci est contenue dans une variable Date, vous devez choisir xlFormulas.
' LookAt précise si la recherche s'effectue dans la cellule entière (xlWhole) ou non (xlPart).
' SearchOrder indique dans quel sens la recherche doit se faire, xlByColumns ou xlByRows.
' SearchDirection indique dans quel direction la recherche doit se faire,  prochain (xlNext) ou suivant (xlPrevious).
' MatchCase doit être égal à True si vous voulez respecter la casse.
' After:=Cells(lignef2, colonnef2),
    Set Plage = Worksheets(8).Range("B4:B65536").Find(What:=numAno, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True, SearchOrder:=xlByRows, SearchDirection:=xlNext)
    
' Si il y a une valeur pour l'etat :
    If Not Plage Is Nothing Then
    ' On copie l'etat situe dans la feuille 4 sur la feuille 2
        toto = Plage.Offset(0, 35).Value
        
		' Ici, j'ai un problème avec ma variable toto. Apparemment ce serait un problème de type ?! 
		' Je voudrais mettre la valeur de toto ("Validé" ou "Pas validé") dans la Destination précisée.
        toto.Copy Destination:=Worksheets(7).Range(Cells(lignef1, 31))
		
        ' Si l'etat est "valide" alors on incremente colonne pour regarder si il y a une autre anomalie
        If toto = "Validé" Then
            colonnef1 = colonnef1 + 1
            colonnef2 = colonnef2 + 1
        End If
        
        ' Si l'etat est different de "valide" alors on incremente ligne pour passer au folio/raster suivant
        ElseIf toto <> "Validé" Then
            lignef1 = lignef1 + 1
            lignef2 = lignef2 + 1
            colonnef1 = 8
            colonnef2 = 2
        End If
    ' Ici, j'ai du supprimer un end if car à la compilation, il m'a dit qu'il ne correspondait à aucun if. Pourquoi ?!
	
' Si il n'y a pas de valeur pour l'etat d'une anomalie :
    If Plage Is Nothing Then
        Worksheets(7).Range(Cells(lignef1, 31)) = "Validé"
        lignef1 = lignef1 + 1
    End If

'
End Sub

Je pense avoir résolu quelques problèmes mais certains bugs persistent !
Si vous avez des idées pour m'aider, n'hésitez pas ! ^^"

Encore merci ! ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 211
Messages
2 086 292
Membres
103 171
dernier inscrit
clemm