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 :

Impossible de trouver des date existantes [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2012
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 317
    Par défaut Impossible de trouver des date existantes
    bonjour à tous

    J'ai les dates des jours de la semaine sur une ligne; il n'y a pas de formules dans les cellules car elles sont inscrites par une macro

    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
     
    Private Sub ListBox23_Change()
     
     If ListBox23 <> "" And ListBox22 <> "" Then
     
    Range("D2") = lundiSemaine(CLng(ListBox22.Text), CLng(ListBox23.Text)) 'fonction qui trouve la date grace à l'année et au N° de semaine
    ' début de la semaine en D2
    Range("g2") = Range("D2") + 4 'fin de la semaine en g2
     
    ' je calcul les jour à partir de D2 pour les inscrire dans la ligne concernée par la recherche
    Range("a44") = Range("d2")
    Range("c44") = Range("d2") + 1
    Range("e44") = Range("d2") + 2
    Range("g44") = Range("d2") + 3
    Range("i44") = Range("d2") + 4
     
        End If
    End Sub
    les cellules sont au format date, la barre de formule affiche ce format 21/10/2013

    dans les cellules l'affichage est par exemple : 21 octobre 2013

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sheets("vierge").range("a44:i44").find(DateTacheDeb, lookat:=XlWhole)
    La méthode Find ne donne rien, j'ai aussi essayer Match sans plus de résultat

    j'en suis même arrivé là toujours sans succés

    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
     
    Dim Cljour As Integer 'recherche colonne départ et fin
     
                                For Cljour = 1 To 10
                                     If DateTacheDeb = .Cells(44, Cljour) Then
                                        CLD = .Cells(44, Cljour).Column
                                     End If
     
                                    If DateTacheFin = .Cells(44, Cljour) Then
                                        CLF = .Cells(44, Cljour).Column
                                    End If
     
                                    Cljour = Cljour + 1 ' saute une colonne car la cellule est vide
     
                                Next Cljour
    les variables DateTacheDeb et DateTacheFin sont elles aussi au format date et déclarées en .Date et affiche par exemple 21/10/2013

    je n'y comprend plus rien et tous mon code est bloqué à cause de cette recherche, alors si quelqu'un a une idée ce serait super

    merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Il te faut adapter la variable "DateTacheDeb" à la recherche que tu veux effecteur avec "Format" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Test()
     
        Dim DateTacheDeb As String
     
        DateTacheDeb = Format(DateValue("19/10/2013"), "dd mmmm yyyy") 'adapter la date recherchée ici...
     
        MsgBox Sheets("Feuil1").Range("A44:I44").Find(DateTacheDeb, , xlValues, xlWhole).Address
     
    End Sub
    Hervé.

  3. #3
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par dmoluc Voir le message


    les cellules sont au format date, la barre de formule affiche ce format 21/10/2013

    dans les cellules l'affichage est par exemple : 21 octobre 2013
    Les cellules doivent être au format DATE.

    Si la cellule contient l'heure en plus de la date, tu dois utiliser lookat:=xlPart.

    Si la cellule affiche 21 octobre 2013, tu dois utiliser LookIn:=xlFormulas, pas LookIn:=xlValues.

    Si la cellule affiche 21/10/2013 ou 2013/10/21, tu peux utiliser LookIn:=xlValues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Recherche()
     ' DateTacheDeb doit [etre de type DATE
     
    Set result = Sheets("vierge").Range("a44:i44").Find(DateTacheDeb, lookat:=xlPart, LookIn:=xlFormulas)
    If Not result Is Nothing Then
     
     MsgBox result.Address
     Else
      MsgBox DateTacheDeb & " non trouve"
    End If
    End Sub
    Docmarti

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2012
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 317
    Par défaut
    merci pour ces réponses rapides : je ne savais pas que le format d'affichage d'une cellule pouvait perturbé la recherche, xlpart n'avait rien donné et je n'avais pas eu l'idée d'essayer looking:=XlFormula
    DateTacheDeb et DateTacheFin afficher l'heure en plus de la date alors j'avais extrait la date seule dans une autre colonne mais ça n'avait non plus rien donné, d'ou mon désespoir
    comme quoi ça tient parfois à peu de chose

    tous ce qui est sur c'est que le code suivant fonctionne et que mon code est débloqué, alors encore un grand merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim result As Range
     
    Set result = Sheets("vierge").Range("a44:i44").Find(DateTacheDeb, lookat:=xlPart, LookIn:=xlFormulas)
    If Not result Is Nothing Then
     
    CLD = result.Column
    End If
     
    Set result = Sheets("vierge").Range("a44:i44").Find(DateTacheFin, lookat:=xlPart, LookIn:=xlFormulas)
    If Not result Is Nothing Then
     
    CLF = result.Column
    End If

  5. #5
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par dmoluc Voir le message
    je ne savais pas que le format d'affichage d'une cellule pouvait perturbé la recherche
    Bien sûr que le format d'affichage d'une cellule peut perturber la recherche car, je l'ai découvert il y a quelques années, avec le paramètre LookIn:=xlValues, la fonction FIND semble effectuer sa recherche dans la propriété TEXT des cellules et non dans la propriété VALUE comme on s'y attendrait. Ce qui n'est pas le cas. En fait, le résultat est positif seulement si la valeur FormatNumber de la cellule est m/d/yyyy.


    Ce qui fait qu'on rencontre le problème que tu avais : on ne trouve pas des dates existantes.

    Quand, avec FIND, on cherche une valeur de type DATE avec le paramètre LookIn:=xlValues

    Le résultat est positif si :

    FormatNumber- Valeur affichee dans cellule
    m/d/yyyy------- 01/03/2014

    Mais le résultat est négatif si :

    FormatNumber- Valeur affichee dans cellule
    dd/mm/yyyy----- 01/03/2014
    d/mm/yyyy------ 1/03/2014
    dd/mmm/yyyy--- 01/mars/2014
    mmm/dd/yyyy--- mars/01/2014
    yyyy/mm/dd---- 2014/03/01


    Avec le paramètre LookIn:=xlFormulas, quand, avec FIND, on cherche une valeur de type DATE

    Le résultat est positif si la cellule est de l'un des formats DATE:

    FormatNumber =
    m/d/yyyy-------- 01/03/2014
    dd/mm/yyyy----- 01/03/2014
    d/mm/yyyy------ 1/03/2014
    dd/mmm/yyyy--- 01/mars/2014
    mmm/dd/yyyy--- mars/01/2014
    yyyy/mm/dd----- 2014/03/01

    Etc...

    Cordialement

    Docmarti.

  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.
    Citation Envoyé par Docmarti Voir le message
    Bien sûr que le format d'affichage d'une cellule peut perturber la recherche […] avec le paramètre LookIn:=xlValues,
    la fonction FIND semble effectuer sa recherche dans la propriété TEXT des cellules et non dans la propriété VALUE […]

    Mais le résultat est négatif si :

    FormatNumber- Valeur affichee dans cellule
    dd/mm/yyyy----- 01/03/2014
    De mon côté, avec différentes versions françaises d'Excel sur plusieurs ordinateurs,
    le format date classique jj/mm/aaaa d'une cellule et sa propriété Range.Value ne gênent aucunement la recherche
    avec le paramètre LookIn:=xlValues ‼ (voir le code Demo1)

    Et cela ne fonctionne pas avec la propriété Range.Text (Demo7), et pour cause !

    Là où il faut prêter attention c'est dans le passage du premier paramètre - la date cherchée - de la méthode Range.Find.

    Comme en VBA la représentation d'une date entre dièses ou guillemets est au format natif américain,
    il faut veiller à inverser le jour et le mois, pour le 1er mars 2014, c'est #3-1-2014# ou "3/1/2014" (Demo2 & Demo3).

    Par contre s'il y a un zéro devant le mois ou le jour, même au format américain, la recherche échoue … (Demo6)

    Avec la fonction DateValue une date texte au format français classique même avec un zéro est bien trouvée. (Demo4)
    Pas de souci non plus avec une variable au format Date, heureusement ! (Demo5)

    Pour le code suivant testé dans un classeur vierge (en pièce jointe),
    les dates sont au format classique français jj/mm/aaaa en colonne A et dans la cellule H1 :
    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
    Private Sub DateFind(V)
        Dim Rg As Range
        Set Rg = Columns(1).Find(V, , xlValues)
        If Rg Is Nothing Then [C1].Select Else Rg.Select: Set Rg = Nothing
    End Sub
     
    Sub Demo1()
        DateFind [H1].Value
    End Sub
     
    Sub Demo2()
        DateFind #3/1/2014#
    End Sub
     
    Sub Demo3()
        DateFind "3/1/2014"
    End Sub
     
    Sub Demo4()
        DateFind DateValue("01/03/2014")
    End Sub
     
    Sub Demo5()
        Dim Dt As Date
        Dt = [H1].Value
        DateFind Dt
    End Sub
     
    '------------------
    ' Ne trouvent pas !
     
    Sub Demo6()
        DateFind "03/01/2014"
    End Sub
     
    Sub Demo7()
        DateFind [H1].Text
    End Sub
    Fichiers attachés Fichiers attachés

  7. #7
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2012
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 317
    Par défaut
    décidément ces dates

    il me semble que comparer les dates pose aussi quelques soucis. j'ai bien traiter tous les cas dans mes conditions pourtant il y en a qui sont omis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If (DateTacheDeb <= DateDébut And DateFin <= DateTacheFin) Or (DateDébut <= DateTacheDeb And DateTacheFin <= DateFin) Or _
                    (DateDébut <= DateTacheDeb And DateTacheDeb <= DateFin And DateFin <= DateTacheFin) Or (DateTacheDeb <= DateDébut _
                    And DateDébut <= DateTacheFin And DateTacheFin <= DateFin) Or (DateDébut = DateTacheDeb Or DateTacheFin = DateFin) Then
    DatetacheDeb = début de la tache, datetacheFin = fin de tache
    DateDébut = début de la semaine, DateFin = fin de la semaine


    faut-il convertir les dates en nombre, ou il y a_t_il une astuce pour que la comparaison est bien lieu ?

    merci de m'éclairer de vos lumières

  8. #8
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    [...]
    Demos[...]
    Je te remercie de tes demos qui m'ont appris beaucoup.

    Après de longues recherches, je te confirme que la recherche par xlValues dans le paramètre "LookIn" en VBA ne s'intéresse qu'à la propriété TEXT, tout comme la recherche manuelle avec le bouton RECHERCHE dans l'application Excel d'ailleurs. C'est un phénomène trop peu connu qui est pourtant facile à vérifier. Il suffit de rétrécir la largeur de la colonne pour que la valeur numérique recherchée ne soit plus visible en totalité, ou que la date recherchée soit remplacée par #############, pour que la recherche ne donne plus le résultat escompté.


    En voici la démonstration dans un démo.


    Cordialement

    Docmarti.


    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
     
    Sub Demo_1_xlValues_Find_date()
     
      Set_A2_DateValue_And_Width
     
      Set result = DateFind([b2].Value, "B")
     
      Set result = DateFind([a2].Value, "A")
     
    End Sub
     
    Sub Demo2_xlValues_Find_Double()
     
     Set_D2_NumberValue_And_Width
     
     
        Set result = DateFind([D2].Value, "F")
     
         Set result = DateFind([D2].Value, "E")
     
        Set result = DateFind([D2].Value, "D")
     
    End Sub
     
    Sub Demo3_xlValues_String()
     
     Set_H2_StringValue_And_Width
     
       Set result = DateFind([H2].Value, "I")
     
        Set result = DateFind([H2].Value, "H")
     
    End Sub
     
    Function Set_A2_DateValue_And_Width()
     
     [a2].Value = Date
     [b2].Value = [a2].Value
     
      Columns("A:A").AutoFit
    Columns("B:B").ColumnWidth = 2
     
    End Function
     
    Sub Set_H2_StringValue_And_Width()
     
     [H2].Value = "Hello World"
     [I2].Value = [H2].Value
     
      Columns("H:H").ColumnWidth = 2
    Columns("I:I").AutoFit
    End Sub
    Sub Set_D2_NumberValue_And_Width()
     
    [D2].NumberFormat = "General"
    [D2].Value = 123.45678
     
     
    [E2].NumberFormat = "0.00"
    [E2].Value = [D2].Value
     
    [F2].NumberFormat = "General"
    [F2].Value = [D2].Value
     
     Columns("D:E").AutoFit
     
    Columns("F:F").ColumnWidth = 2
     
    End Sub
    Function DateFind(v, col)
     
    Set DateFind = Columns(col).Find(v, , lookat:=xlPart, LookIn:=xlValues)
     
        If DateFind Is Nothing Then
          Cells(1, col).Value = "No"
          Cells(1, col).Select
          MsgBox v & vbCrLf & " Not found in column " & col, , "Not found"
        Else
     
          Cells(1, col).Value = "Yes"
          DateFind.Select
          MsgBox v & vbCrLf & " Found in column " & col, , "Found"
     
        End If
    End Function

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/04/2012, 16h27
  2. format des dates d'une table déjà existante
    Par Gary_Stoupy dans le forum Access
    Réponses: 8
    Dernier message: 19/01/2007, 14h19
  3. trouver des dates
    Par krolineeee dans le forum Langage
    Réponses: 12
    Dernier message: 20/08/2006, 16h43
  4. [Requête] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2004, 11h26

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