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 de données via user form


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    apprenti
    Inscrit en
    Juillet 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : apprenti
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 25
    Par défaut Recherche de données via user form
    Bonjour a tous,

    J'ai un soucis avec un code sur vba.

    j'ai beaucoup naviguer sur le forum et essayer différents codes, mais je n'arrive pas à obtenir ce que je recherche.

    MON PROBLÈME:

    J'ai un USF qui me propose de taper soit, une référence, soit, une désignation

    voir image de mon usf si besoin

    Nom : USF voir le stock.png
Affichages : 1919
Taille : 100,5 Ko


    Ce que j'aimerai c'est que lorsque je clique sur le bouton OK, la référence et/ou la désignation soit rechercher dans la conne A de la feuille appelé (base de données).

    Les réponse s'afficheront dans une boite de dialogue. Chaque réponse sera sous forme de lien à cliquer pour accéder à la cellule correspondante.



    Plus simplement, c'est exactement le même principe que la fonction "recherche et sélectionner" d'excel. Sauf que je me sert de mon USF pour faire la recherche.


    (La recherche doit respecter exactement la casse).


    Je n'ai pas de code à vous montrer, ça ma tellement saoulé que j'ai effacer ce que j'ai fait de rage

    Je vous serais très reconnaissant de me filer un ptit coup de main

    merci ...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 199
    Par défaut
    Bonjour,

    Un début de piste.

    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
    Dim critere As String
    Dim cpt As Integer
     
    critere = "a récupérer"
     
    maListe = "ListBox_resultat"
     
    Controls(maListe).Clear
    Controls(maListe).ColumnCount = 2  'Nbre de colonnes
    Controls(maListe).ColumnWidths = "0;10" 'Largeur de la colonne
     
    For cpt = 2 To Sheets("base de données").Range("A" & Rows.Count).End(xlUp).Row
        If Sheets("base de données").Cells(cpt, 1) = critere Then
            Controls(maListe).AddItem cpt
            Controls(maListe).List(Controls(maListe).ListCount - 1, 1) = Sheets("base de données").Cells(cpt, 1)
        End If
    Next cpt

  3. #3
    Membre averti
    Homme Profil pro
    apprenti
    Inscrit en
    Juillet 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : apprenti
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 25
    Par défaut
    slt, merci pour ta réponse rapide,

    donc, pour que je pige ce que tu as fait (pour progresser et m'améliorer)

    1- tu déclare tes variable: cpt, c'est la variable "référence", c'est un nombre donc, variable type integer
    critere est la "désignation", c'est du texte donc, variable type string

    2- critère ?? ca je vois pas a quoi ça correspond
    3- tu appel l'user form creer sous le nom listbox_resultat
    4- tu supprime les ancienne données contenues dans ton USF
    5- tu crée deux colonnes dans ton USF de 10 de large (pas dur, tu l'as mis en comm lol)

    6- la ligne 15 et 16 sont un peu flou, peut-tu me détailler les opérations?
    7- On ajoute l'item cpt sur ma liste
    8- La ligne 18, est également un peu flou.






    Si tu as le temps, de m'écrire quelques lignes de détails, ce serait cool
    merci bien.

    De mon coté je vois pour l'adapter

  4. #4
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Dans l'exemple ci-dessous, la recherche est faite sur toutes les colonnes du tableau et ne tient pas compte de la casse. Tu tapes une valeur dans la TextBox1 et si celle valeur est contenue dans une cellule de la base, sa ligne entière est affichée. Pour atteindre la ligne dans la base il suffit de cliquer sur un élément de la ListBox1... Code commenté.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Homme Profil pro
    apprenti
    Inscrit en
    Juillet 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : apprenti
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 25
    Par défaut
    Salut thautheme

    je pense avoir compris comment fonctionne ton code, mais j'ai un peu de mal à l'adapter.

    lorsque je l'insère dans mon fichier, j'ai un soucis avec la variable "O".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set O = Sheets("base de données") 'définit l'onglet O
    sur cette ligne, vbe indique variable non défini, alors que un peu plus haut, la variable est défini selon ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private O As Worksheet 'déclare la variable O (Onglet)
    le nom de l'onglet correspond bien avec le code ( base de données).

    Est-ce que le problème peut venir d'un soucis de "sub" et "private sub", ou encore de l'USF ???

  6. #6
    Membre averti
    Homme Profil pro
    apprenti
    Inscrit en
    Juillet 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : apprenti
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 25
    Par défaut
    voici le code complet:

    -j'ai juste renommé les variables avec les mots en entier pour que je m'y retrouve plus facilement.

    -J'ai mis la commande d’exécution sur mon bouton ok.

    Si tu vois une anomalie...

    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
    Private O As Worksheet 'déclare la variable O (Onglet)
    Private Tableau_cellules As Variant 'déclare la variable Tableau_cellules (Tableau de Cellules)
    Private Nombre_lignes As Integer 'déclare la variable Nombre_lignes (Nombre de Lignes)
    Private Nombre_colonnes As Byte 'déclare la variable Nombre_colonnes (Nombre de colonnes)
     
     
     
     
     
    Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Set O = Sheets("base de données") 'définit l'onglet O
    Tableau_cellules = O.Range("A1").CurrentRegion 'définit le tableau de cellules Tableau_cellules
    Nombre_lignes = UBound(Tableau_cellules, 1) 'définit le nombre de lignes de Tableau_cellules
    Nombre_colonnes = UBound(Tableau_cellules, 2) 'définit le nombre de colonnes de Tableau_cellules
     
    Me.ListBox1.ColumnCount = Nombre_colonnes + 1 'définit le nombre de colonnes de la ListBox1 (à adapter, dans cet exemple je recherche dans la ligne entière. +1 pour le numéro de ligne)
    Me.ListBox1.ColumnWidths = "0 pt;" 'masque la première colonne de la ListBox1 (celle ou sera stocké le numéro de la ligne)
    End Sub
     
     
     
    Private Sub btm_ok_Click()
     
     
    With TextBox1_Change() 'au chargement dans la TextBox1
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Byte 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim Tableau_lignes() As Variant 'déclare la variable Tableau_lignes (Tableau des Lignes)
     
     
     
     
    Me.ListBox1.Clear 'vide la ListBox1
    K = 1 'initialise la variable K
    For I = 2 To Nombre_lignes 'boucle 1 : sur toutes les lignes I du tableau de cellules Tableau_cellules (en partant de la seconde)
        For J = 1 To Nombre_colonnes 'boucle 2 : sur toutes les colonnes J du tableau de cellules Tableau_cellules
            If InStr(1, Tableau_cellules(I, J), Me.TextBox1.Value, vbTextCompare) <> 0 Then 'condition : si le texte de la TextBox1 est contenu dans la donnée
            'ligne I colonne J (sans tenir compte de la casse)
                ReDim Preserve Tableau_lignes(Nombre_colonnes + 1, 1 To K) 'redimensionne le tableau de lignes Tableau_lignes
                Tableau_lignes(0, K) = I 'récupère dans la ligne 0, colonne K de Tableau_lignes le numéro de ligne (masqué)
                For L = 1 To Nombre_colonnes 'boucle sur toutes les colonnes de Tableau_cellules
                    Tableau_lignes(L, K) = Tableau_cellules(I, L) 'récupère dans la ligne L, colonne K de Tableau_cellules la valeur de la ligne I , colonne L de Tableau_cellules (transposition)
                Next L 'prochaine colonne de la boucle 2
                K = K + 1 'incrémente K
                Exit For 'sort de la boucle 2
            End If 'fin de la condition
        Next J 'prochaine colonne de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    If K > 1 Then 'condition : si K est supérieur à 1 (au moins une occurrence a été trouvé)
        If K = 2 Then ReDim Preserve Tableau_lignes(Nombre_colonnes + 1, 1 To 2) 'si une seule occurrence trouvée, redimensionne Tableau_lignes pour pouvoir transposer
        Me.ListBox1.List = Application.Transpose(Tableau_lignes) 'alimente la ListBox1 avec le tableau Tableau_lignes transposé
     
    End If 'fin de la condition
     
    End Sub
     
     
     
     
    Private Sub ListBox1_Click() 'au clic dans la ListBox1
    O.Rows(Me.ListBox1.Column(0, ListIndex)).Select 'sélectionne la ligne de l'élément sélectionné
    Unload Me 'vide et ferme l'UserForm
    End Sub

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,

    As-tu placé la ligne de déclaration de la variable O :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private O As Worksheet 'déclare la variable O (Onglet)
    tout en haut du module comme dans mon exemple ?
    Cela permet d'utiliser la même variable pour tout le module une fois qu'elle a été définie. C'est pour cela que je la définie à l'initialisation...


    Re,

    Je t'avais fait une procédure qui s'actualisait à chaque changement dans la Textbox1 et tu l'as remplacée par un bouton ?! Ce n'est pas très efficace mais surtout ce qui me semble douteux c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With TextBox1_Change() 'au chargement dans la TextBox1

    Je ne pense pas que cela fonctionne. Pourquoi ne garde-tu pas la solution proposée. Qu'est-ce qui te gêne dans la procédure TextBox1_Change ?

  8. #8
    Membre averti
    Homme Profil pro
    apprenti
    Inscrit en
    Juillet 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : apprenti
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 25
    Par défaut
    exact, la ligne que tu as repéré ne fonctionne pas, je teste des trucs.


    en fait, ce que j'essai de faire, c'est simplement de déplacer la textbox dans mon USF*, puis de la valider par le btm_ok.

    *(c'est l'usf qui est en début de conversation).

    L'USF de réponse, ta listbox est tres bien, c'est juste que dans mon fichier il y a toujours un partie requête, puis une partie réponse.


    J'essaie de respecter une architecture de construction pour mon fichier.

Discussions similaires

  1. [Toutes versions] VBA - utiliser données de user form dans main
    Par cecile_64 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2012, 15h11
  2. [XL-2003] rechercher des données via un fichier source
    Par arsenic1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/01/2012, 14h08
  3. Droit DBA donné à tout user via AS SYSDBA
    Par MaxBoys dans le forum Administration
    Réponses: 4
    Dernier message: 30/05/2008, 18h34
  4. format Text/Number via un user form
    Par jeo13 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/05/2008, 09h10
  5. Rechercher un enregistrement via un form
    Par priest69 dans le forum IHM
    Réponses: 2
    Dernier message: 28/11/2005, 10h36

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