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 excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Janvier 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Janvier 2020
    Messages : 4
    Par défaut fonction find excel
    Bonjour à tous,
    Je suis nouveau sur ce forum, après multiple recherche sur le net, je ne trouve pas la solution et je pense que le problème vient de la date (ce que je recherche), quand je fais une recherche sur un string aucun problème sa fonctionne mais la date non,
    Dans une textbox je rentre une date ex:"03/02/2020", sur la feuille de calcul le format des dates est la suivante "jjj jj" ce qui apparaît sur la feuille pour l'exemple lun 03
    avec un sub le format de la date donne "ddd dd" format US,
    je dois ensuite rechercher cette date sur cette feuille sélectionner auparavant avec la fonction find (avec LookAt:=xlWhole ou LookAt:=xlValue)
    cette date existe bien, quand je clique sur la cellule, il affiche "03/02/2020" malgre l'utilisation des fonction (Cdate, FormatNumber, Format), sur cette cellule
    "range.find" me donne nothing?????

    Je précise avec une boucle (each,next) aucun problème, mais j'aimerais utiliser la fonction "find" car je dois rechercher l'intersection d'une colonne et d'une ligne en fonction de deux paramètres (date et Nom), Je travail sur l'élaboration d'un planning automatique où doit figurer les absences, vacances etc...
    Votre aide sera la bienvenue.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 166
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exemple vite fait mais testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function FindDate(LookupValue As String, LookupRange As Range) As Range
      Set FindDate = LookupRange.Find(What:=CDate(LookupValue), _
                                      LookIn:=xlFormulas, _
                                      LookAt:=xlWhole, _
                                      MatchCase:=False)
     
    End Function
    Que l'on invoque avec cette procédure qui cherche la date placée en cellule L2 dans la colonne Naissance de l'unique tableau structuré.
    L'ensemble se trouvant dans la feuille nommée Bd du classeur où se trouve le code VBA

    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
    Sub TestFindDate()
      Dim ColumnToSearch As Range
      Dim DateValue As String
      Dim rngFound As Range
      Dim txtFound As String
      With ThisWorkbook.Worksheets("bd")
        Set ColumnToSearch = .ListObjects(1).ListColumns("Naissance").DataBodyRange
        DateValue = .Range("L2").Value
      End With
      ' Recherche
      Set rngFound = FindDate(DateValue, ColumnToSearch)
      '
      If rngFound Is Nothing Then
         txtFound = "Date " & DateValue & " cannot be found"
       Else
         txtFound = " (" & CDate(DateValue) & ") trouvée à l'adresse " & rngFound.Address
      End If
      MsgBox txtFound
      '
      Set ColumnToSearch = Nothing: Set rngFound = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Janvier 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Janvier 2020
    Messages : 4
    Par défaut resolu
    Bonjour, merci pour cette réponse,
    comme je ne connais pas trop la propriété "ListObject, ListColumns", je suis débutant en VBA, j'ai trouvé la solution par une façon détourné:
    J'ai modifié le format de mes dates en N° de série en faisant une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 0 To 18  ' 18 nombre de colonnes 
       With ActiveSheet.Range("c3").Offset(0, i)  'les dates se trouvent sur la  troisième ligne "3" + une incrémentation sur les colonnes Offset(0, i)
         .Select
         .NumberFormat = "0"
      End With
     Next
    dt la valeur à chercher

    dt est la date sous le format "ddd dd" sur ma feuille, pour la changer en N° de série : (trouvé en faisant des recherches sur developpez)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     valeur=Int(CDbl(CDate("dt")))
    ,

    ensuite j'utilise la fonction find sur toute la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     With ActiveSheet.Range("a1:z100") 'la zone où s'effectue la recherche
        Set trouve = .Find(What:=valeur, LookIn:=xlValues)
           If Not trouve Is Nothing Then
                        MsgBox _
                            Prompt:="La cellule trouvée a pour adresse " & trouve.Address, _
                            Buttons:=vbInformation, _
                            Title:="Info"
                            Debug.Print (trouve.Address) 'information à retirer du code finalisé 
                             Debug.Print (trouve.Column)
          End If 
     end with
    et pour finir je réinitialise les dates à leur format initiale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      For i = 0 To 18
          With ActiveSheet.Range("c3").Offset(0, i)
            .Select
           .NumberFormat = "ddd dd"
         End With
       Next
    Je ne sais si ceci est très efficace, je pense que la solution de Philippe Tulliez est plus rapide et plus adéquate mais cela fonctionne,
    maintenant je dois trouver l'intersection entre la colonne (trouve.column) et une ligne qui correspond à un Nom rechercher.
    au travail!!!

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 166
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'objet ListtObject est un tableau structuré
    Il y a tellement d'avantage à l'utiliser que ce soit manuellement ou à l'aide du VBA que cela devient aberrant que l'on utilise encore les plages classiques surtout quand on en a pris connaissance.

    Alors pour revenir à ma proposition, la petite fonction nommée FindDate que j'ai proposée a deux arguments LookupValue (valeur que l'on cherche) et LookupRange (Objet Range) plage de données où a lieu la recherche
    Comme c'est un objet Range, on peut parfaitement passer n'importe quelle plage de données
    Puisque la zone des données d'un tableau structuré (DataBodyRange) est un objet Range

    Donc en reprenant mon exemple et en utilisant une plage non issue d'un tableau structuré, j'aurai le même résultat

    Voici donc le code invoquant la fonction FindDate corrigé pour une plage classique et ce quel que soit le format (date) de la plage de recherche et celui de la cellule où se trouve la date cherchée. Pour l'exemple la colonne Date de naissance est la troisième mais on pourrait bien entendu prévoir une ligne de code cherchant l'étiquette de colonne.
    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
    Sub TestFindDate_Range()
      ' Déclaration
      Dim rng As Range            ' Plage globale
      Dim rngFound As Range       ' Cellule où se trouve la date cherchée
      Dim ColumnToSearch As Range ' Colonne où chercher la date
      Dim DateValue As String     ' Date à chercher
      Dim txtFound As String      ' Message
      ' Assignation
      With ThisWorkbook.Worksheets("bd")
        Set rng = .Range("A1").CurrentRegion
        With rng
          Set ColumnToSearch = .Columns(3)
          DateValue = .Range("L2").Value
        End With
      End With
      ' Recherche
      Set rngFound = FindDate(DateValue, ColumnToSearch)
      '
      If rngFound Is Nothing Then
         txtFound = "Date " & DateValue & " cannot be found"
       Else
         txtFound = " (" & CDate(DateValue) & ") trouvée à l'adresse " & rngFound.Address
      End If
      MsgBox txtFound
      '
      Set ColumnToSearch = Nothing: Set rngFound = Nothing
    End Sub
    A lire : Apprendre à utiliser les tableaux structurés Excel : création, manipulations et avantages(1)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Janvier 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Janvier 2020
    Messages : 4
    Par défaut Ne fonctionne pas
    Bonjour philippe,
    merci pour votre effort, mais malgré de multiples essais avec votre solution, çà ne fonctionne pas! j'ai changé xlformulas avec xlvalues, pas de changement,
    J'ai modifié un peu votre code car j'ai pas mal de cellule fusionné. votre solution fonctionne avec la valeur de la cellule "c3", je pense que cela vient que les dates
    sont issues de formules et du format de ces dates,
    Pour l'instant j'utilise ma méthode qui fonctionne de changement de format des dates en N°de série, mais j'aimerais quand même comprendre d'où vient le problème avec votre solution qui pour moi reste la plus logique à utiliser.

    Classeur1.xlsm

    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
    Sub TestFindDate_Range()
              ' Déclaration
              Dim rng As Range            ' Plage globale
              Dim rngFound As Range       ' Cellule où se trouve la date cherchée
              Dim ColumnToSearch As Range ' Colonne où chercher la date
              Dim DateValue As String     ' Date à chercher
              Dim txtFound As String      ' Message
              ' Assignation
              With ThisWorkbook.Worksheets("bd")
                Set rng = .Range("A1").CurrentRegion
                rng.Select
                 With rng
                ' Set ColumnToSearch = .Columns(3)
                 Set ColumnToSearch = rng
     
                End With
                  DateValue = .Range("l3").Value
              End With
              ' Recherche
              Set rngFound = FindDate(DateValue, ColumnToSearch)
              '
              If rngFound Is Nothing Then
                 txtFound = "Date " & DateValue & " cannot be found"
               Else
                 txtFound = " (" & CDate(DateValue) & ") trouvée à l'adresse " & rngFound.Address
              End If
              MsgBox txtFound
              '
              Set ColumnToSearch = Nothing: Set rngFound = Nothing
            End Sub
     
     
     
    Function FindDate(LookupValue As String, LookupRange As Range) As Range
      Set FindDate = LookupRange.Find(What:=CDate(LookupValue), _
                                      LookIn:=xlFormulas, _
                                      LookAt:=xlWhole, _
                                      MatchCase:=False)
     
    End Function

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 166
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En fichier joint, l'exemple avec deux feuilles, l'une contenant un tableau structuré et l'autre une plage de cellules classique
    En rappelant tout de même que la fonction renvoie la première cellule trouvée qui est la demande initiale car évidemment il serait possible de créer une fonction renvoyant toutes les cellules contenant cette date.
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [XL-2016] Fonction FIND dans Macros et VBA Excel
    Par MamaB dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/03/2019, 17h07
  2. Fonction "Find" sous VBA Excel
    Par havannah dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2016, 17h48
  3. [MFC/Excel] Fonction Find de la classe CRange
    Par SmOkEiSBaD dans le forum MFC
    Réponses: 1
    Dernier message: 02/06/2008, 10h03
  4. [Excel/Range] Fonction Find de la classe CRange
    Par SmOkEiSBaD dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/06/2008, 10h02
  5. Fonction find de excel
    Par qltmi dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/02/2008, 21h03

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