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 :

Recherche dans un fichier - réponses collées sur une autre feuille [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Recherche dans un fichier - réponses collées sur une autre feuille
    Bonjour,

    Pour les besoins de mon boulot, je suis en train de répertorier des notions grammaticales (je recopie les tables des matières de bouquins, en gros). J'aurai maintenant besoin de faire un formulaire de recherche : l'utilisateur entre la notion qu'il recherche dans une boîte de dialogue, et toutes les lignes qui contiennent ce mot apparaissent.

    Description du classeur :

    - une feuille "IndexEssai" où sont entrées mes données (les notions grammaticales / le nom du bouquin où on peut les trouver / lien hypertexte vers un PDF (le bouquin))
    - une feuille "boutons" qui comporte mon bouton pour lancer la recherche

    J'ai plusieurs contraintes :
    - je ne veux pas que les utilisateurs aient directement accès à la page où sont entrées les données (donc pas de liens hypertextes qui renvoient sur cette page)

    - il faudrait que la ligne entière qui contient le mot recherché s'affiche (pas uniquement la cellule)


    J'ai cherché un peu partout et je suis arrivée à un code qui me semble correct et qui pourtant ne marche pas (aucune donnée ne s'affiche ; pourtant je peux entrer le mot recherché dans la boîte de dialogue et j'ai le message que j'ai choisi lorsque j'entre une donnée non-répertoriée).


    Voici mon code :

    Pour le bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
     
    Public Sub CommandButton1_Click()
     
    Dim mot As String
     
    mot = InputBox("Tapez la notion que vous recherchez - N'oubliez pas les accents !")
    Range("B12:B" & Range("B65536").End(xlUp).Row).ClearContents
     
    Call recherche(mot)
     
    End Sub

    Pour la recherche :

    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 recherche(mot)
    Dim Feuille As Worksheet
    Dim Ligne As Integer
    Dim firstAddress
    Dim trouve As Boolean
    Dim c As Range
     
    On Error GoTo fin
     
    Ligne = 12
     
    For Each Feuille In Sheets
        If Feuille.Name = "IndexEssai" Then
        With Feuille.Rows
            Set c = .Find(mot, LookIn:=xlValues, LookAt:=xlPart)
            If Not c Is Nothing Then
                firstAddress = c.Address
            Do
                c.EntireRow.Copy
                Worksheets("Boutons").Range(Ligne, 2).Paste
            Set c = .FindNext(c)
     
            Ligne = Ligne + 1
     
            Loop While Not c Is Nothing And c.Address <> firstAddress
            trouve = True
     
            End If
        End With
        End If
     
    Next Feuille
     
    If Not trouve Then MsgBox ("Aucune réponse n'a pu être trouvée")
     
    fin:
     
    End Sub


    Voilà, j'espère avoir été assez claire ! Sinon, je peux toujours joindre un exemple de mon fichier...


    Si jamais vous avez des idées sur pourquoi ça ne marche pas et qu'est-ce que je pourrai modifier, ça me tirerait une sacrée épine du pied !


    Mille mercis d'avance !


    Pauline

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 99
    Points : 141
    Points
    141
    Par défaut
    Bonjour Paulineegue, le forum
    avec le fichier ce serait plus facile de t'aider et de te renvoyer la solution
    et si tu n'est pas opposée à une listbox là tu aurais toute ttes lignes et pas de risques que tes intervenants touchent à tes feuilles
    a+
    papou

  3. #3
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Le problème lorsqu'on bypasse tout le code via un "On Error GoTo ..." est que l'on ne voit pas quand et où ça coince.

    Il y a 2 erreurs :

    La syntaxe Range(Ligne, 2) n'est pas correcte, soit tu écris Range("B" & Ligne), soit Cells(Ligne, 2)

    Ensuite tu copies une ligne entière (toutes les colonnes) et tu essayes de la coller sur l'autre feuille, à partir de la colonne B...ça dépasse...

    Essaie en apportant ces deux corrections, après on pourrait encore optimiser 2 ou 3 petits trucs.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci pour votre aide !

    J'ai apporté les corrections et miracle, ça marche !! Merci beaucoup !!!

    J'ai donc commencé par enlever le OnError, et j'ai vu que ce qui clochait apparemment (mis à part l'erreur de syntaxe), c'est que la méthode "Paste" n'est pas associée à l'objet "Range". J'ai juste modifié avec "PasteSpecial" et tout fonctionne !


    Enfin presque... Il me reste juste un petit quelque chose : lorsque je clique sur le bouton "Cancel" de mon "Input Box", il n'y a que le titre qui s'affiche, en boucle (je dois arrêter brutalement le code pour que ça cesse).

    Je joins un exemple pour que ce soit plus clair.

    http://www.cijoint.fr/cjlink.php?fil...ijSb3mMAA.xlsm



    Vraiment merci pour votre aide, elle tombe à pic ! J'ai une réunion avec ma responsable cette aprèm, je vais pouvoir lui montrer tout ça !


    Pauline

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu!!!!
    bonjour

    je rajouterais une remarque moi


    tu fait une boucle sur toute s les feuille pour ne prendre en compte lesheets("index")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Feuille In Sheets'pour toutes les feuilles dans la feuille heu!........
        If Feuille.Name = "IndexEssai" Then'si la feuille s'appelle "indexessai"
        With Feuille.Rows
    ton ordinateur marche trop vite c'est ca ,tu veux le rallentir

    pourquoi ne pas faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for each cel in sheets("indexessai").cells 'mais bon c'est long puisque ca va chercher dans toutes la feuille cellules par cellule
    n'y a t'il pas un moyen de chercher dans un plage plus precise
     
    'le reste de ta macro bien que je n'ai pas bien regarder
    au plaisir
    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

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    C'est de ça dont je voulais parler lorsque je disais qu'il y avait encore quelques petits trucs à optimiser.

    Concernant le copier/coller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c.EntireRow.Copy
    Worksheets("Boutons").Cells(Ligne, 2).Paste
    tu peux simplement faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.EntireRow.Copy Worksheets("Boutons").Cells(Ligne, 2)
    Concernant l'Inputbox, si l'utilisateur clique sur "Annuler" ou s'il la valide vide, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub CommandButton1_Click()
     
    Dim mot As String
     
    mot = InputBox("Tapez la notion que vous recherchez - N'oubliez pas les accents !")
     
    If mot <> "" Then
        Range("B12:B" & Range("B65536").End(xlUp).Row).ClearContents
        Call recherche(mot)
    End If
     
    End Sub
    Là on pourrait pousser un peu plus loin en refusant par exemple les saisies inférieures à 3 caractères
    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
    Public Sub CommandButton1_Click()
     
    Dim mot As String
     
    reco:
    mot = InputBox("Tapez la notion que vous recherchez - N'oubliez pas les accents !")
     
    If mot <> "" Then
        If Len(mot) < 3 Then
            MsgBox "Votre recherche doit comporter minimum 3 caractères !"
            GoTo reco
        Else
            Range("B12:B" & Range("B65536").End(xlUp).Row).ClearContents
            Call recherche(mot)
        End If
    End If
     
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    d'accord avec toi fring


    et j'insisterais sur le point de choisir une plage dès le départ
    car sis le mot recherchées peut se trouver dans n'importe quel colonne et ligne j'imagine le cafouillis dans le tableau


    au plaisir
    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 à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci vraiment pour toute votre aide !

    Ca marche beaucoup mieux comme cela, en effet ! Par contre, je ne trouve pas la syntaxe pour spécifier une plage au début de mon code (je suis débutante en VBA... ), donc j'ai laissé cette partie en l'état, même si c'est effectivement plus long.

    Merci vraiment beaucoup, je commence à mieux comprendre comment j'aurais dû faire dès le début (pour une prochaine fois).

    Pauline

  9. #9
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Pour définir une plage de recherche, à la place de With Feuille.Rows, tu écris With Feuille.Range("A1:D97") '<-- plage de cellules à adapter

    Pour reprendre ce que disait Patrick, point sur lequel je n'ai pas insisté parce que cela ne va pas énormément optimiser ta procédure, pourquoi vérifies-tu que le classeur comporte la feuille "IndexEssai" ? Ca ne sera pas toujours le cas ?
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/01/2014, 15h29
  2. Récupération de données dans un fichier pour copie sur une feuille
    Par Maxime082 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 19/05/2011, 19h41
  3. Copie-colle sur une autre feuille
    Par mytho dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2010, 16h55
  4. Réponses: 1
    Dernier message: 27/07/2009, 13h53
  5. Réponses: 2
    Dernier message: 12/01/2009, 22h37

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