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 avec la méthode find


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Par défaut Problème avec la méthode find
    Bonjour,

    J'ai besoin pour un projet sur excel de trouver une date précise sur une ligne(la première), cette ligne contient toutes les dates de l'année.

    J'utilise donc la méthode find de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuil1").Range("A1:NZ1").find(dtmMaDate).select
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Rows(1).find(dtmMaDate).select
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Range("1:1").find(dtmMaDate).select
    Dans les trois cas, le programme semble fonctionner que lorsque ça l'arrange... sur mon module2 j'avais ce problème au bout de plusieurs essais de mon code ça se mettait à me rendre l'erreur suivante : "Erreur '1004': La méthode Select de la classe Range à échouée". Je redemarrais alors mon classeur et ça fonctionnait à nouveau.
    Maintenant le problème se produit sur mon module 3 sauf que cette fois c'est totalement aléatoire. (par exemple, ça ne marchait pas il y a 1h, là je viens de ressayer, ça a marché, puis j'essaye encore, et hop à nouveau l'erreur, je n'ai pas fermé le classeur entre deux...) .

    Quelqu'un à t-il déjà eu ce problème ? Une idée d'où peut venir l'erreur ?

    J'ai bien entendu essayer de rajouter des arguments à la méthode find mais il semblerait que le problème vienne du range...

    Merci à tout ceux qui peuvent apporter une bride de réponse.

    En vous souhaitant une agréable après midi.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Heuvanek,

    J'utilise énormément la méthode Worksheets.Find. Mais je me fais souvent gronder car certains considèrent qu'on peut éviter de l'utiliser.
    Quoi qu'il en soit, je n'ai jamais rencontré ton problème.
    Une chose est sure : il n'y a pas d'aléatoire. Les cas de tests sont différents !

    En revanche, la méthode Range.Select est, quant à elle, toujours évitable !
    Je te propose que tu nous envoies ton code afin que l'on puisse l'analyser.
    Je pense que ton problème vient de là, comme l'indique l'erreur.

    Cordialement,
    Kimy

  3. #3
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut Autres options
    Bonjour,
    Pour ma part, j'associe le .find à un Range et non pas à un Select, petit exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MaRech as Range
     
    Set MaRech = worksheets("Feuil1").Range("A1:NZ1").find(dtmMaDate)
    'MaRech est donc la Range qui contient la date cherchée, tu peux donc récupérer l'adresse, la colonne, la ligne, la sélectionner, ...
    Sinon,
    Si toutes les dates de l'année sont en ligne, et considérant le 01/01/2015 en B1
    Ta cellule est donc sur la ligne 1 dans la colonne = [la date cherchée]-[01/01/2015]+2 '+2 pour compenser l'écart de date et la colonne A qui ne contient pas de date
    En code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(1).Cells(1, (dtmmadate - Worksheets(1).Cells(1, 2).Value) + 2).Select
    (J'espère que j'ai pas fait de faute dans le code car écrit à la volée)

    Bon amusement

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Tu peux peut-etre trouver l'origine du probleme avec le code qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub terst()
    If IsNull(Worksheets("Feuil1").Range("A1:NZ1").NumberFormat) Then
     MsgBox "La propriete NumberFormat n'est pas uniforme.", , "Probleme potentiel"
    End If
    For Each c In Worksheets("Feuil1").Range("A1:NZ1")
     If Trim(c.Value) <> "" Then
      If TypeName(c.Value) <> "Date" Then
        MsgBox c.Value & " n'est pas une date.", , c.Address
        Exit For
      End If
     End If
    Next
    End Sub

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Par défaut
    Bonjour messieurs,

    Pour tout vous dire, le problème ne s'est pas réglé, mais étant donné que ce qui m’intéressait, c'était le numéro de colonne de cette date j'ai finalement crée une variable (ça suit un peu le conseil de FvanderMeulen et de Kimy_Ire finalement):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lngColonneJour = Worksheets("Feuil1").Range("A1:NZ1").find(dtmMaDate).Row
    Du coup là plus de bug...

    Alors qu'avant j'utilisais donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    worksheets("Feuil1").Range("A1:NZ1").find(dtmMaDate).select
    lngColonneJour = ActiveCell.Row
    (vrai que j'aurais pu voir l'inutilité d'avoir deux lignes, mais parfois quand on voit trop de code on réfléchit plus assez)

    Le problème semble donc venir, comme le message l'indiquait, de la méthode Select qui doit plus ou moins mal s'entendre avec Range.
    Je me souviendrais donc d'éviter celle ci à l'avenir

    J'ai bien lu ton code Docmarti, je le testerais peut-être lundi, histoire de quand même avoir des réponses.

    Sinon du coup, quoi pour remplacer Find si c'est une méthode plutôt bancale ?

    Merci de votre aide, je ne sais pas si je mets le sujet en résolu, peut-être puis-je vous envoyer mon code complet pour que vous me donniez de conseil de codeurs de base, pour ma part je suis auto-didact en VBA donc forcement j'ai pas tout les bons réflexes.

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    Bonjour, bonjour !

    La méthode Find est efficace avec des données cohérentes (format entre autres, la recherche s'effectuant sur l'affichage).
    Ce qui est bancale, c'est ton code en cas de non correspondance : juste consulter l'exemple de l'aide VBA de cette méthode !
    S'il s'agit de la feuille active, Select n'est pas en cause (mais à éviter pour raison d'efficacité).

    Une autre voie est d'utiliser les fonctions de feuille de calculs, faut-il là encore bien les coder …

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    je suis assez étonné que l'on ne te l'ai pas encrore dit!!!

    c'est un problème connu que find déraille un peu avec les dates tout du moins non il ne déraille pas c'est plutôt l'utilisateur qui oublie un paramètre important

    en effet quand tu a une cellule avec "26/06/2015" c'est pas forcement ce qui a été tapé ou injecté

    exemple si tu tape dans une cellule "26-06-2015" et que dans le menu format tu applique le format date classique tu obtiens "26/06/2015" ca!!! c'est ce que tu vois pas ce qui y est

    je te suggère donc de faire une recherche sur les expressions "date serial" et format(unedate,"dd/mm/yyyy")

    je pencherais plutôt pour date serial et la j'ai tout dis
    A bon entendeur
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Inutile de t'acharner sur la méthode Find qui ne me semble pas en cause (une fois n'est pas coutume ).

    Pour pouvoir sélectionner une plage en utilisant la méthode Select, tu dois tout d'abord avoir activé le classeur et activé (ou sélectionné ) la feuille qui contient la plage concernée.
    Le fait que tu aies un fonctionnement erratique semble indiquer que la feuille "Feuil1" n'est pas toujours activée lors de la tentative de sélection de la cellule (cause qui a été avancée par Kimy_Ire dès le début), ce qui explique l'absence de défaut lorsque tu n'utilises plus cette méthode.

    Pour éviter ce type de problème, il est effectivement préférable d'éviter l'utilisation de la méthode Select lorsque cela n'est pas indispensable.

    Cordialement.

  9. #9
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Voici une methode simple qui evite Find:

    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
    Sub tt3()
     
    dtmMaDate = "10/01/2015"
     
    Set r = Worksheets("Feuil1").Range("A1:NZ1")
     
    lig = r.Row
    For i = r.Column To r.Columns.Count + r.Column - 1
     Set c = r.Cells(lig, i)
     If IsDate(c.Value) Then
     
      If CDate(c) = CDate(dtmMaDate) Then
       c.Select
       Exit For
      End If
     End If
    Next
     
    End Sub

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonsoir


    dans le cas d'une recherche de date je suis assezd'accords avec docmarti
    j'utiliserait une boucle mais sans avoir a utiliser une variable "i" mais plutôt un boucle "for each in ..."puisqu'il y a qu'une seul ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set r = Worksheets("Feuil1").Range("A1:NZ1")
    for each cel in r.cells
    if cel=format(madate,"dd/mm/yyyy") then......
     
     
    next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Par défaut
    Merci Patrick et docmarti, pour une seule ligne ça remplace en effet le find sans soucis.
    (Ce serait aussi efficace d'un point de vue temps d'execution pour une matrice 100X100 ? Si oui je garde le code précieusement)

    Sinon après test je confirme les propos de GFZT82, en activant la feuille juste avant, il n'y a plus de problèmes. J'ai donc ma réponse.
    Le format de la date ne posait pas de problème (enfin je crois) étant donné que je tapais bien celle ci au format JJ/MM/AAAA dans les cellules.

    (ce qui m'a d'ailleurs valu de devoir séparer tout ça pour pouvoir enregistré mes archives avec la date)

    Voici mon code, celui-ci permet de détecter dans une intervalle de 7 jours et dans une certaines liste de personnes qui sont en congé et de faire une croix sur les cellules correspondantes. (la feuille congé contient un calendrier et une liste de personnel, lorsque une cellule est remplie cela signifie que la personne en question est absente ce jour là) (la feuille non demandé contient la même liste de personnel, sur sept jours, et le programme raye donc les cellules des personne en congé le jour en question.)


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    Option Explicit On
    Option Base 1
     
    Sub verif_conge()
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '''''''''''Permet de vérifier que dans la liste des personnes non demandé si certaines personne''''
        ''''''''''''''''sont en congé de façon a ne pas les affecter sur le planning par erreur''''''''''''
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
     
        Dim lngLigne As Long, lngDernLigne As Long, lngJour As Long, lngIndColDate As Long
        Dim lng_Colonne(7) As Long
        Dim dtm_Jour(7) As Date
        Dim strNomClasseur As String
        Dim objFC As Object, objFPADD As Object
        Dim bool_NomDate() As Boolean
        Dim dtmJourTempo As Date
     
        strNomClasseur = ActiveWorkbook.Name
        objFC = Workbooks(strNomClasseur).Worksheets("CONGE")
        objFPADD = Workbooks(strNomClasseur).Worksheets("non demandé")
     
        lngDernLigne = objFC.Range("A2000").End(xlUp).Row
        ReDim bool_NomDate(370, lngDernLigne)
     
        For lngJour = 1 To 7
     
        dtm_Jour(lngJour) = objFPADD.Cells(1, lngJour)
        dtmJourTempo = dtm_Jour(lngJour)
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '''''On trouve la cellule contenant la date et on enregistre ses coordonnées'''''''''''
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
        lngIndColDate = objFC.Range("A1:NZ1").Find(dtmJourTempo).Column '(et non pas .Row comme j'ai marqué dans mes réponses précédentes ^^)
     
        lng_Colonne(lngJour) = lngIndColDate
     
        Next lngJour
     
     
     
        For lngJour = 1 To 7
     
            For lngLigne = 2 To lngDernLigne
     
                If objFC.Cells(lngLigne, lng_Colonne(lngJour)) <> "" Then
     
                    bool_NomDate(lng_Colonne(lngJour), lngLigne) = True
     
                Else
     
                    bool_NomDate(lng_Colonne(lngJour), lngLigne) = False
     
                End If
     
            Next lngLigne
     
        Next lngJour
     
        For lngJour = 1 To 7
     
            For lngLigne = 2 To lngDernLigne
     
                If bool_NomDate(lng_Colonne(lngJour), lngLigne) = True Then
     
                    With objFPADD.Cells(lngLigne, lngJour).Borders(xlDiagonalDown)
     
                        .LineStyle = xlContinuous
                        .Weight = xlThick
                        .ColorIndex = xlAutomatic
     
                    End With
     
                    With objFPADD.Cells(lngLigne, lngJour).Borders(xlDiagonalUp)
     
                        .LineStyle = xlContinuous
                        .Weight = xlThick
                        .ColorIndex = xlAutomatic
     
                    End With
     
                End If
     
            Next lngLigne
     
        Next lngJour
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec la méthode find et find next
    Par Sylvie66 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2015, 17h33
  2. Problème avec ma méthode Find
    Par cdurep dans le forum Excel
    Réponses: 2
    Dernier message: 04/03/2014, 10h30
  3. [XL-2010] Problème avec la méthode find d'un objet Range dans une zone filtrée
    Par stargates01 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 28/02/2014, 23h27
  4. problème avec la méthode getElementById() dans Firefox
    Par matrouba dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 08h55
  5. Problème avec la méthode pack()
    Par tomca dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2005, 10h58

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