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 :

Problème Find, objet requis


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut Problème Find, objet requis
    Bonjour.
    J'ai un gros souci avec la commande Find.
    Dans le code ci-dessous, le premier Find, qui doit trouver un numéro de ligne, fonctionne correctement.
    Les suivants, qui cherchent des numéros de colonne, par contre, plantent: erreur de run-time 91.
    Pourquoi?

    N.B.: je ne peux pas joindre de fichier, la gestion informatique de mon bureau l'empêche.
    En tout cas, tous les élémeents appelés dans le code sont présent dans la même feuille, il s'agit d'un Workbook avec un seul Sheet. Les plages sont nommées.

    Merci à quiconque peut me filer un coup de main, parce que je dois résoudre rapidement.


    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
    Sub remplir()
    Dim nom As String, note As String, dern As Date, prem As Date
    Dim ligne As Long, colDer As Long, colPrem As Long, colDebut As Long, colFin As Long
     
    NrRgLista = Range("lista").Rows.Count
    For i = 2 To NrRgLista  'la 1ère ligne contient des noms de champs
    With Range("lista").Rows(i)
        nom = .Cells(1).Value
        dern = .Cells(2).Value
        prem = .Cells(3).Value
        note = .Cells(4).Value
        iniCong = dern + 1
        finCong = prem - 1
    End With
    If nom <> "" Then
     
        ligne = Range("caleNomi").Find(nome).Row 'ça marche !
     
    With ActiveSheet.Range("caleDate")
        Set colDer = .Find(dern, LookIn:=xlValues).Column   ' ça bloque! Run-time 91
        Set colPrem = .Find(prem, LookIn:=xlValues).Column
        Set colDebut = .Find(iniCong, LookIn:=xlValues).Column
        Set colFin = .Find(finCong, LookIn:=xlValues).Column
        If colDer Is Nothing And colPrem Is Nothing Then
            MsgBox "date dernier jour hors calendrier"
            Exit Sub
        Else
            MsgBox "trouvé: " And colDer
            Exit Sub
        End If
    ' ensuite il faudra mettre ces données dans le tableau
     
    End With
    End If
    Next
    End Sub

  2. #2
    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,

    Find renvoie un objet Range lorsque la recherche a abouti
    Dans le cas contraire, elle renvoie un objet Nothing

    Or, un objet Nothing n'a pas de propriété .Column

    Il faut tester ce que renvoie ton find avant de vouloir en extraire des propriétés ou y appliquer des méthodes

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Set sert affecter un objet, colDer est un Long !
    Enlèves le Set :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    colDer = .Find(dern, LookIn:=xlValues).Column

  4. #4
    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


    je n'avais même pas relevé

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Merci Joe et Patrice pour ces observations qui effectivement m'apportent quelques détails en plus.
    Toutefois:

    1) Set je l'ai ajouté par dispération, puis enlevé, puis rajouté... ça ne marche ni avec ni sans!

    2) je pensais gérer les "Nothing" par la suite, donc je me suis assuré simplement que les toutes premières données sont présentes dans le Range("lista"): il n'y a donc pas de "nothing" possible dans mes données dans le cas présent.

  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
    On n'utilise pas Set pour une simple valeur.
    Cette commande est réservée à la transmission de références d'objets.

    Une remarque supplémentaire : Il est conseillé de vérifier le résultat d'un Find avant d'exploiter ce résultat.

    Par exemple pour ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Trouve As Range
     
        Set Trouve = Range("caleDate").Find(dern, LookIn:=xlValues).Column
        If Trouve Is Nothing Then
            MsgBox(dern & "non trouvée dans caleDate")
            Exit Sub
        End If
        colDer = Trouve.Column

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    D'accord.
    J'ai bien compris que Set est pour les objets et pas pour les données.
    Comme je le disais il y a quelques minutes, cela a été une tentative... 'hystérique" due au désespoir, mais Find ne marchais pas non plus avant que je mette Set.
    Par ailleurs, le Range("caleDate") contient des dates du 1/1/19 au 25/1/19 et j'ai fait attention à ne mettre QUE des dates de début janvier.
    Par conséquent, le "Nothing" que je voulais affronter plus tard, n'a pas lieu d'être pour l'instant.

    Pour tout dire, le If qui me donne l'information, dans mon code est carrément annulé par un apostrophe en début de ligne: il servait seulement dans ce forum pour montrer comment je pensais traiter l'info. Et en tout cas, le code s'arrête avant.

  8. #8
    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,

    Find et les dates, c'est un peu capricieux

    il me semble qu'il faut plutôt zieuter dans les xlFormulas que dans les xlValues

    et attention au formatage de la date, Find y est très sensible

    Ps : Menhir, t'as laissé un .column à tort à la ligne 3 de ton code

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Menhir, excuse-moi.
    Je viens maintenant de comprendre le sens de ton code.
    Je vais essayer et je reviens plus tard.
    (Désolé, je n'avais pas saisi...)

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut ça ne marche toujours pas
    Voilà, donc j'ai modifié le code, que re-voici:

    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
    Sub remplir()
    Dim nom As String, note As String, dern As Date, prem As Date
    Dim ligne As Long, colDer As Range, colPrem As Range, colDebut As Range, colFin As Range
     
    NrRgLista = Range("lista").Rows.Count
    For i = 2 To NrRgLista  'la 1ère ligne contient des noms de champs
    With Range("lista").Rows(i)
        nom = .Cells(1).Value
        dern = .Cells(2).Value
        prem = .Cells(3).Value
        note = .Cells(4).Value
        iniCong = dern + 1
        finCong = prem - 1
    End With
    If nom <> "" Then
     
        ligne = Range("caleNomi").Find(nom).Row 'ok, ça marche comme avant
     
    With ActiveSheet.Range("caleDate")
        Set colDer = .Find(dern, LookIn:=xlValues) '.Column   ' ça ne marche plus
        Set colPrem = .Find(prem, LookIn:=xlValues) '.Column
        Set colDebut = .Find(iniCong, LookIn:=xlValues) '.Column
        Set colFin = .Find(finCong, LookIn:=xlValues) '.Column
     
        If colDer Is Nothing And colPrem Is Nothing Then
     
            MsgBox "date dernier jour hors calendrier - " & nom & " " & ligne
            Exit Sub
        Else
            MsgBox "trouvé: " And colDer.Column
            Exit Sub
        End If
    ' ensuite il faudra mettre ces données dans le tableau
     
    End With
    End If
    Next
    End Sub
    Maintenant les variables des colonnes sont des objets, donc Set. Mais - malgré que les dates sont BIEN comprises dans le calendrier - il ne les trouve pas.
    J'ai aussi contrôlé le format des dates, en donnant le même (ggg gg/mm/aa) à TOUTES les cellules des deux plages (lista et caleDate).
    Comme le "Nothing" est géré (merci Menhir), je n'ai plus d'erreur run-time, mais... les variables des colonnes que je cherche sont toujours Nothing (testé avec F8) et à la fin j'obtiens la MsgBox "hors calendrier" alors que je devrais obtenir l'autre.

    Je dois tout fermer, désormais. Si vous avez d'autres suggestions, je suis preneur et je les lirai demain.
    Merci à tous!

  11. #11
    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
    Citation Envoyé par joe.levrai Voir le message
    Find et les dates, c'est un peu capricieux
    +1
    Et il faut aussi être sûr que les données sont des dates "entières", c'est-à-dire ne comportant pas d'heures.
    Et attention : ce n'est pas parce que les heures ne sont pas affichées qu'elles ne sont pas présente dans la donnée.

    Sans compter les cas où de soit-disant "dates" ne sont en fait que du texte ressemblant à des dates.

    Bref, pour de nombreuses raisons, les dates dans Excel sont à manipuler comme de la nitroglycérine.

    il me semble qu'il faut plutôt zieuter dans les xlFormulas que dans les xlValues
    Perso, avec les dates, je préfère utiliser une boucle testant la propriété .Text plutôt qu'un Find : c'est plus lent mais plus sûr.
    Ou alors, passer par les fonction Excel avec un Evaluate ou un WorksheetFunction.

    Ps : Menhir, t'as laissé un .column à tort à la ligne 3 de ton code
    Mea Culpa.

    Citation Envoyé par luca.donati Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If colDer Is Nothing And colPrem Is Nothing Then
    Ce n'est pas un And mais un Or qu'il faut utiliser : il suffit qu'un seul soit Nothing pour avoir un problème.

    Maintenant les variables des colonnes sont des objets, donc Set. Mais - malgré que les dates sont BIEN comprises dans le calendrier - il ne les trouve pas.
    Voir tout ce qui a été dit sur les dates dans ce qui précède.

Discussions similaires

  1. Problème Objet requis dans code qui tournait très bien
    Par Kestion100 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2015, 10h55
  2. Problème d'objet requis
    Par patriceoliver dans le forum VBScript
    Réponses: 1
    Dernier message: 28/10/2014, 19h03
  3. [XL-2000] Problème d'objet requis et listes conditionnelles
    Par Alqualonde dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/12/2010, 13h28
  4. Find - Erreur 424 - Objet requis
    Par wilfried_42 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2009, 09h42
  5. Problème Objet requis
    Par vroggero dans le forum VBA Access
    Réponses: 6
    Dernier message: 06/07/2007, 12h44

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