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 :

[VBA-E] recherche dans un tableau


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut [VBA-E] recherche dans un tableau
    Salut tout le monde, je suis nouveau sur ce forum,
    j'essaie de réaliser une macro de recherche via une inputbox sous excell. Le programme que j'ai réalisé pour l'instant ne marche que sur un petit classeur; pour un classeur de plus de 1500 lignes (et une dixaine de colonnes), cela ne marche pas et celà affiche cette erreur : "La méthode 'Range' de l'objet _Global a échoué" . Voici le pgm :


    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
    Dim xCellule As Range 
    Dim xSelection As String 
    Dim Message As String 
     
    'Crée une boîte de dialogue : 
      Message = InputBox(" Entrez la date  : ", "Mon Programme", "01/mm/aaaa") 
     
     
    'Arrête procédure si utilisateur clique sur annuler 
    If Message = "   " Then Exit Sub 
     
    'Place la valeur dans la cellule A1; 
    'Worksheets("feuil2").Range(" A1 ").Value = Message 
     
    'Sélectionner le tableau : 
    'sélectionner toutes les cellules du tableau : 
     
    Selection.Worksheet.UsedRange.Select 
     
    'activer la dernière cellule du tableau 
    Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count).Activate 
     
    'Recherche " Message " dans le tableau : 
     
    For Each xCellule In Selection 
        If xCellule.Value = Message Then 
            xSelection = xSelection & xCellule.Address & "," 
        End If 
    Next 
        If Len(xSelection) > 0 Then 
            Range(Left(xSelection, Len(xSelection) - 1)).Select 
        End If


    Quelqu'un saurait-il me dire comment résorber ce problème?
    merci d'avance

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    tu est sur de ton message d'erreur ? déjà sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Worksheet.UsedRange.Select
    c'est incorrect !

  3. #3
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par bbil
    tu est sur de ton message d'erreur ? déjà sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Worksheet.UsedRange.Select
    c'est incorrect !
    désolé même si ce code ne me plait pas ... il marche !! , enfin dans certain cas... cela dépend , de la sélection au moment ou on lance la macro...

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Je suppose que, dans tes 1500 lignes tu as trop de fois la date recherchée et que donc la sélection de cellules non-contiguës échoue.

    Ceci dit, ça ne répondra peut-être pas à ta question mais, pourquoi cherches-tu à sélectionner toutes les cellules qui correspondent à ta date?

    Quel traitement veux-tu faire?

    Il y a certainement moyen de faire ce traitement sans sélection.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut merci
    Merci à tous les deux d’avoir répondu ;
    Pour Bbil : "Selection.Worksheet.UsedRange.Select" : cela permet de sélectionner un tableau. Connais tu un autre moyen pour sélectionner un tableau (lorsque tu ne connais pas les cellules ni leur emplacement)?
    Pour Alintech : oui, je suis obligé de faire une application qui sélectionne plusieurs cellules en même temps, afin de faire une recopie.
    Il est nécessaire que la personne rentre la date recherchée via une inputbox. Le message qu’elle a écrit est sélectionné et est cherché à travers le tableau. Une fois que les différentes cellules contenant ce message sont sélectionnées, j’ai fait une macro qui permet de sélectionner les lignes sur lesquelles se trouvent les cellules sélectionnées et de les recopier sur une autre feuille.
    Et donc Alintech, je voudrais savoir, sais tu comment je pourrais faire pour sélectionner un si grand nombre de cellules sans que cela échoue ?

    Merci bcp

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si tu te places dans une cellule renseignée de la plage que tu veux "ausculter", CurrentRegion te donne cette plage.
    AlainTech t'a par ailleurs indiqué qu'une sélection n'était pas nécessaire

    Tu dis

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Salut tout le monde, donc pour résumer, le but de ce programme est de permettre à l'utilisateur, via une inputbox, de sélectionner le mot qu'elle souhaite rechercher dans le tableau. Ainsi, le programme va sélectionner le tableau sur lequel va s'effectuer la recherche, et (sur la sélection) toutes les cellules contenant le mot recherché seront sélctionnées. Il est nécessaire pour la suite de mon programme que cela s'effectue comme cela.

    Donc cela donne :

    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
    Dim xCellule As Range 
    Dim xSelection As String 
    Dim Message As String 
     
    'Crée une boîte de dialogue : 
      Message = InputBox(" Entrez la date  : ", "Mon Programme", "01/mm/aaaa") 
     
    'Arrête procédure si utilisateur clique sur annuler 
    If Message = "   " Then Exit Sub 
     
    'sélectionner toutes les cellules du tableau : 
     Selection.Worksheet.UsedRange.Select 
     
    'Recherche " Message " dans le tableau : 
     For Each xCellule In Selection 
        If xCellule.Value = Message Then 
            xSelection = xSelection & xCellule.Address & "," 
        End If 
    Next 
        If Len(xSelection) > 0 Then 
            Range(Left(xSelection, Len(xSelection) - 1)).Select



    Je te remercie Ouskel'n'or de m'avoir donné une solution. J'ai essaye de l'appliquer sous cette forme :

    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
      Message = InputBox(" Entrez la date  : ", "Mon Programme", "01/mm/aaaa")
     
    'Arrête procédure si utilisateur clique sur annuler
    If Message = "   " Then Exit Sub
    ' Place la valeur dans la cellule A1; (peut être faut il le mettre sur une autre
    ' feuille pour faciliter les recherches sur les tableaux)
    ' Worksheets("feuil2").Range(" A1 ").Value = Message
    ' Sélectionner le tableau :
     
    Set Plage = ActiveCell.CurrentRegion
        With Plage
        .Find(What:=Message, After:=ActiveCell, LookIn:=xlFormulas _
            , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False).Activate
         End With
    Set Plage = Nothing
    Mais cela n'a pas été très fructueux. J'ai aussi l'impression que cela ne permet pas de sélectionner plusieurs cellules à la fois.
    Voilà, je suis vraiement désolé, je débute sur les macros et en vba alors je ne suis pas très bon pour adapter les informations que l'on me communique lol.
    Donc si ej n'ai pas compris certaines choses, merci encore de me l efaire savoir.

    En tout cas, merci à vous tous qui m'avez répondu

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    As-tu remarqué que dans cette ligne,
    If Message = " " Then Exit Sub
    tu as placé un espace. Annuler dans InputBox renvoie une chaîne vide soit "" et non " " (nulle dit l'aide)

    A toutes fins utiles et à tout hasard

    A+

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Regarde la fonction find, je pense qu'elle est plus adaptée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Set Plage = ActiveCell.CurrentRegion
        With Plage
        .Find(What:=message, After:=ActiveCell, LookIn:=xlFormulas _
            , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False).Activate
         End With
    Set Plage = Nothing
    A+

  10. #10
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    ? c'est un multi post ou mon message à été effacé ? il me semble avoir déjà répondu que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Selection.Worksheet.UsedRange.Select
    été incorrect.. et qu'il ne correspondé pas au message d'erreur donné

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut macro excel-recherche+recopie
    Salut tout le monde,
    je suis novice en macro excel; et j’ai deux petits pbm à résoudre :
    Je dois faire une recherche dans un tableau contenant un très grand nombre de lignes (1500).
    J’avais un pgrm qui marchait très bien sur les petits tableaux, mais qui était limité de par la mémoire.
    Ainsi, grâce à ‘Ouskel’n’or’, j’ai pu géré un pti pgrm qui fait une recherche via une inputbox.
    Cela donne :


    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
    Sub Macro1()
    '
    Dim Message As String
    'Crée une boîte de dialogue :
      Message = InputBox(" Entrez la date  : ", "Mon Programme", "01/mm/aaaa")
    'Arrête procédure si utilisateur clique sur annuler
    If Message = "" Then Exit Sub
    Set Plage = ActiveCell.CurrentRegion
        With Plage
        .Find(What:=Message, After:=ActiveCell, LookIn:=xlFormulas _
            , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False).Activate
         End With
    Set Plage = Nothing
    '
    End Sub

    Ce programme marche très bien pour la recherche de mots, mais cela bug pour la recherche de dates.
    Dans mon tableau excel, les dates sont sous la forme : févr-2005 ou juin-2006. Quand on tape la date il faut écrire par ex : 01/02/2005, et excel converti automatiquement cette date en févr-2005. Ainsi, lorsqu’on fait une recherche, il faut rechercher 01/02/2005 et non pas févr-2005.
    Le pbm c’est qu’il y a un bug lorsque je fait ce type de recherche avec ce pgm… et je en sais pas pkoi
    Dc si kkn pouvait me dépanner ca seré sympa
    Mon 2ème petit souci est le suivant :
    Le but de ce pgm étant de recopier toutes les lignes correspondant à la date recherchée, sur une autre feuille excel.
    J’ai fait une application qui permet la sélection de toute une ligne lorsque une cellule est sélectionnée, et un syst de recopie sur une autre feuille.
    Cela donne :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ‘sélectionner les lignes à partir d’une sélection
    Selection.EntireRow.Select
    ‘permet de copier et coller une ligne sur une autre feuille
    Selection.Copy
    Sheets("Feuil2").Select
    k = ActiveSheet.UsedRange.SpecialCells(xlLastCell).End(xlToLeft).Row + 1
    Cells(k, 1).Select
    ActiveSheet.Paste

    Le but étant de recopier toutes les lignes contenant la date recherchée sur une autre feuille,
    J’avais pensé à une boucle qui dit kkchse comme : tant qu’il y a un élément dans une cellule qui correspond à l’élément recherché alors continuer la recherche, si il n’y a plus d’élement : arrêter.
    Le pbm est que je n’arrive pas à le mettre en forme

    Merci d'avance a ceux qui pourront me venir en aide

  12. #12
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 155
    Par défaut
    Salut,

    1/pour ta prmière question, t'a pas déclaré l'objet plage, je pense que le problème vient de là

    2/ pour le second, j'ai pas très bien compris; mais de ce que j'ai compris, tu peux utiliser la boucle Do.............While

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Lorsque je déclare plage, ca me met : "erreur de compliation objet requis". En quoi faudrait il que je le déclare?
    merci

  14. #14
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    il faut que tu le déclare comme "Range"
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello tibss,

    Comme le second message était la suite du premier, je les ai fusionnés.
    Pour la déclaration de plage, là n'est pas le pb, mais effectivement, déclare-la comme variant, tu n'auras pas d'erreur à ce niveau.
    Tu dis maintenant que le format des dates est "févr-2005", tout à l'heure, c'était févr_2005

    Dans ce cas là, c'est beaucoup plus simple. Teste ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim message As Date
    LaDate = "01-" + "Févr-2005"
    message = Format(CDate(LaDate), "dd mm yyyy")
    MsgBox message
    Et là tu recherche message

    A+

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut snif
    personne n'a d'idées pour résoudre mon pbm?

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    oui, c'est ce que j'avais fait par la suite, j'avais défini plage en tant que range et message en tant que string. Mais cela continue de bugger.

    En ce qui concerne ton pgm ouskel'n'or, j'ai pas tt compris. Il permet d'afficher le 1er février ds une message box. Cela n'est pas tt à fait en rapport avec le pgm ek ej veux qfaire.
    Moi je veux saisir n'importe quelle date à travers une input box, et faire la recherche de cette date dans n'importe quel tableau excell

    voili la difficulté

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Pour l'instant, le pgm donne :
    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 Macro1()
    '
     
    Dim Message As String
    Dim Plage as Range
     
    'Crée une boîte de dialogue :
    Message = InputBox(" Entrez la date : ", "Mon Programme", "01/mm/aaaa")
     
    'Arrête procédure si utilisateur clique sur annuler
    If Message = "" Then Exit Sub
     
    Set Plage = ActiveCell.CurrentRegion
    With Plage
    .Find(What:=Message, After:=ActiveCell, LookIn:=xlFormulas _
    , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False).Activate
    End With
    Set Plage = Nothing
    '
    End Sub

    Lorsque je rempli mon tableau et que j'y met des dates, ej les met sous la forme : 01/02/2005, 01/07/2005, 01/09/2005. Ainsi, dans le tableau excel ces dates figurent sous la forme févr-2005, juillet-2005, spt-2005...

    Lorsque que je ferai ma recherche pour févr-2005 il faudra donc que je recherche 01/02/2005 et non pas févr-2005.

    Le pbm, c'est qu'avec ce programme, je ne peux pas sélectionner les dates de type : 01/02/2005.

    Et ej en sais pas pkoi cela n emarche pas

    est ce que cette précision éclaire votre vision des choses?

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Faut-il tout te dire ?
    Essaie d'extrapoler les pistes qu'on te donne

    Citation Envoyé par tu
    Ainsi, lorsqu’on fait une recherche, il faut rechercher 01/02/2005 et non pas févr-2005.
    Je te donne le moyen de formater la date saisie comme elle est dans la feuille. Dans l'exemple, cette date, je la mets dans la variable message.
    Ne peux-tu pas imaginer la saisie d'une date dans un inputbox avant qu'elle soit formatée comme tu le désires ?
    On ne peut pas faire le travail à ta place.
    On te donne des pistes et il me semble qu'on t'en a données pas mal, à toi d'essayer d'adapter.
    C'est tout de même un minimum que tu peux faire

    Pour connaître la dernière ligne de ton tableau, en recherche, tu peux tester que le numéro de la dernière ligne trouvée n'est pas inférieur au numéro de la précédente. S'il est inférieur c'est que la recherche a redémarré depuis le haut
    C'est une solution. Il y en a une autre que j'ai oubliée mais tu auras certainement une réponse sous peu

    A+

    inférieur ou égal, le numéro de ligne

Discussions similaires

  1. [XL-2010] [VBA ARRAY]Recherche dans un tableau par rapport à une plage
    Par Hugo_pack dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/07/2014, 18h00
  2. [E-07] Recherche dans un tableau à 2 entrées en VBA
    Par mrah1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/02/2009, 17h18
  3. [VBA]Macro pour lancer une recherche dans un tableau
    Par manhes dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/04/2007, 18h08
  4. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 17h50
  5. [VBA-E]Recherche dans un tableau
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 49
    Dernier message: 05/07/2006, 10h35

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