IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction Find qui ne trouve pas


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Ingénieur mécanique
    Inscrit en
    Juillet 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 9
    Par défaut Fonction Find qui ne trouve pas
    Bonjour,

    Je travaille sur une macro permettant de déterminer une valeur dans un tableau à double-entrées, avec les entrées données par l'utilisateur.
    J'utilise donc la fonction Find et je balaie mon Range pour trouver la ligne correspondante à la première entrée, de même avec la colonne pour ensuite récupérer la valeur de la Cell correspondante.
    En enlevant petit à petit des morceaux de code pour isoler ce qui ne marchait pas, je me suis rendue compte que le programme ne trouve pas la valeur recherchée, même si elle est présente dans le Range. Je ne trouve pas mon erreur, et je veux bien un peu d'aide...

    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Option Explicit
     
    Sub determination_filetage()
     
    Application.Workbooks("Filetages").Worksheets("Filetage").Activate
     
    Dim diam_male As Double
    Dim diam_femelle As Double
    Dim filet_par_pouce As Double
    Dim pas As Double
     
    diam_male = Cells(5, 2).Value
    diam_femelle = Cells(4, 2).Value
    filet_par_pouce = Cells(4, 5).Value
    pas = Cells(5, 5).Value
     
    MsgBox "Recherche de la combinaison diamètre mâle " & diam_male & "/" & diam_femelle & " femelle et filetage filet par pouce " & filet_par_pouce & "/" & pas & " pas"
     
    Dim ligne_male As Range
    Dim ligne_femelle As Range
    Dim num_ligne_male As Integer
    Dim num_ligne_femelle As Integer
    Dim colonne_filet As Range
    Dim colonne_pas As Range
    Dim num_colonne_filet As Integer
    Dim num_colonne_pas As Integer
     
    With Worksheets("Détermination filetage")
     
        Set ligne_male = Range("A5:A319").Find("diam_male")
        If ligne_male Is Nothing Then
            MsgBox "Diamètre mâle non trouvé"
            Else
            num_ligne_male = Rows("ligne_male")
            MsgBox num_ligne_male
        End If
     
    End With
     
    MsgBox "Fin de macro"
     
    End Sub
    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Le rang d'une cellule X n'est pas rows("X"), mais :

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    le conseil de paria est avisé (comme de coutume)

    cependant, je ne suis pas sûr que ce soit la genèse de ton problème de FIND qui ne trouve pas, puisque FIND est utilisé avant la coquille soulevée par paria

    tu utilises FIND avec le minimum d'argument, c'est à dire le premier (What)

    Or, si tu ne specifies pas les autres arguments (LookIn, LookAt, After etc...) VBA va prendre par défaut les paramètres utilisés la dernière fois (que ce soit par VBA ou directement dans le menu "Rechercher" de Excel)

    Ainsi, il suffit que la dernière recherche "argumentée" ai utilisé l'argument LookAt:=XlWhole pour qu'une recherche partielle (LookAt:=XlPart) ne fonctionne pas

    C'est bien sûr un exemple, mais je t'invite fortement à renseigner tous les arguments de cette méthode, au besoin de regarde dans l'aide en ligne l'entrée lexicale "Range.Find"


    EDIT : et en regardant bien, tu utilises ta variable en tant que chaine de caractère, en enlevant les guillemet ça devrait peut être déjà résoudre le souci

    EDIT2 : ah ben Menhir a posté ce point pendant que je rédigeais mon message

  4. #4
    Membre du Club
    Femme Profil pro
    Ingénieur mécanique
    Inscrit en
    Juillet 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 9
    Par défaut
    Merci pour vos réponses rapides ! Je vais essayer demain au boulot et je vous dirais si ça marche

  5. #5
    Membre du Club
    Femme Profil pro
    Ingénieur mécanique
    Inscrit en
    Juillet 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 9
    Par défaut
    Bon bah, j'ai suivi vos conseils mais ça ne marche pas plus...

    Voilà le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Option Explicit
     
    Sub determination_filetage()
     
    Application.Workbooks("Filetages").Worksheets("Filetage").Activate
     
    Dim diam_male As Double
    Dim diam_femelle As Double
    Dim filet_par_pouce As Double
    Dim pas As Double
     
    diam_male = Cells(5, 2).Value
    diam_femelle = Cells(4, 2).Value
    filet_par_pouce = Cells(4, 5).Value
    pas = Cells(5, 5).Value
     
    MsgBox "Recherche de la combinaison diamètre mâle " & diam_male & "/" & diam_femelle & " femelle et filetage filet par pouce " & filet_par_pouce & "/" & pas & " pas"
     
    Dim ligne_male As Range
    Dim ligne_femelle As Range
    Dim num_ligne_male As Integer
    Dim num_ligne_femelle As Integer
    Dim colonne_filet As Range
    Dim colonne_pas As Range
    Dim num_colonne_filet As Integer
    Dim num_colonne_pas As Integer
     
    With Worksheets("Détermination filetage")
     
        Set ligne_male = Range("A5:A319").Find(diam_male, LookIn:=xlValues, LookAt:=xlWhole)
        If ligne_male Is Nothing Then
            MsgBox "Diamètre mâle non trouvé"
            Else
            num_ligne_male = ligne_male.Row
            MsgBox num_ligne_male
        End If
     
    End With
     
    MsgBox "Fin de macro"
     
    End Sub
    C'est frustrant parce que pourtant c'est pas censé être compliqué ^^'

    Merci d'avance !

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Juste avant ton If ... Is Nothing, mets le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Cells(5, 2), diam_male, ligne_male
    En supposant que la valeur que tu cherches soit en A10 (modifie l'adresse en fonction de ton cas), ajoutes en dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Cells(5, 2)=Worksheets("Détermination filetage").Range("A10"), Worksheets("Détermination filetage").Range("A10")
    Qu'est-ce que ça te renvoie dans la fenêtre d'exécution de l'éditeur VBA ?

  7. #7
    Membre du Club
    Femme Profil pro
    Ingénieur mécanique
    Inscrit en
    Juillet 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 9
    Par défaut
    J'ai bien rajouté le point manquant mais je préfère conserver le with, parce que je fais la même recherche avec plusieurs variables ensuite (ça marchait pas donc j'ai voulu voir si ça marchait avec une déjà ^^).

    Le find ne trouve toujours pas ma valeur
    Est-ce que ça peut être un réglage général d'Excel qui fait que ça ne fonctionne pas ?

    je ne suis pas une spécialiste en informatique, et je me débrouille avec ce que je trouve sur internet, notamment quand il y a des erreurs mais là, j'ai pas d'erreur donc j'ai du mal à voir mon erreur...

    Merci pour votre aide !

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Erreur de manip, j'ai édité mon message précédent au lieu de le citer.
    Tant pis, je recopie ici.


    Juste avant ton If ... Is Nothing, mets le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Cells(5, 2), diam_male, ligne_male
    En supposant que la valeur que tu cherches soit en A10 (modifie l'adresse en fonction de ton cas), ajoutes en dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Cells(5, 2)=Worksheets("Détermination filetage").Range("A10"), Worksheets("Détermination filetage").Range("A10")
    Qu'est-ce que ça te renvoie dans la fenêtre d'exécution de l'éditeur VBA ?

  9. #9
    Membre du Club
    Femme Profil pro
    Ingénieur mécanique
    Inscrit en
    Juillet 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 9
    Par défaut
    J'obtiens une Erreur d'exécution '91' : Variable objet ou variable de bloc With non définie.

    EDIT :

    J'ai rajouté les différents arguments du find et maintenant j'ai une erreur d'execution 13 : incompatibilité de type...
    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Option Explicit
     
    Sub determination_filetage()
     
    Application.Workbooks("Filetages").Worksheets("Filetage").Activate
     
    Dim diam_male As Double
    Dim diam_femelle As Double
    Dim filet_par_pouce As Double
    Dim pas As Double
     
    diam_male = Cells(5, 2).Value
    diam_femelle = Cells(4, 2).Value
    filet_par_pouce = Cells(4, 5).Value
    pas = Cells(5, 5).Value
     
    MsgBox "Recherche de la combinaison diamètre mâle " & diam_male & "/" & diam_femelle & " femelle et filetage filet par pouce " & filet_par_pouce & "/" & pas & " pas"
     
    Dim ligne_male As Range
    Dim ligne_femelle As Range
    Dim num_ligne_male As Integer
    Dim num_ligne_femelle As Integer
    Dim colonne_filet As Range
    Dim colonne_pas As Range
    Dim num_colonne_filet As Integer
    Dim num_colonne_pas As Integer
     
    With Worksheets("Détermination filetage")
     
        Set ligne_male = .Range("A5:A319").Find(diam_male, after:="A4", LookIn:=xlValues, LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=False, searchformat:=False)
        Debug.Print Cells(5, 2), diam_male, ligne_male
        Debug.Print Cells(5, 2) = Worksheets("Détermination filetage").Range("A6"), Worksheets("Détermination filetage").Range("A10")
        If ligne_male Is Nothing Then
            MsgBox "Diamètre mâle non trouvé"
            Else
            num_ligne_male = ligne_male.Row
            MsgBox num_ligne_male
        End If
     
    End With
     
    MsgBox "Fin de macro"
     
    End Sub

  10. #10
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    diam_male n'est pas une chaîne de caractère mais le nom d'une variable.
    Enlève les guillemets et je pense que ça marchera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Set ligne_male = Range("A5:A319").Find(diam_male)
    Idem pour la variable dans le Rows juste après.

Discussions similaires

  1. VBA Access : Fonction find qui ne marche pas
    Par leeloo35 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/02/2008, 16h56
  2. requete SQl avec la fonction max () qui ne marche pas
    Par eclipse012 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 14h32
  3. fonction header qui ne redirige pas
    Par cels dans le forum Langage
    Réponses: 8
    Dernier message: 01/11/2006, 10h12
  4. Une fonction settimeout qui s'execute pas
    Par stepon dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 11h55
  5. IE qui ne trouve pas un element
    Par darktears dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 17/01/2006, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo