Formulaire polyvalent CRUD et recherche intuitive

Bonjour,

J'essaie de faire cohabiter dans une base de données deux codes d'origine différente (voir fichier joint) mais je rencontre quelques difficultés. Un de ces codes est celui de Pascal Richard (paritec/papou) publié en mars 2020 concernant la recherche intuitive de type "google" (de TextBox vers ListBox). Le deuxième est celui de Philippe Tulliez publié en avril 2020 et concerne un formulaire polyvalent (consultation, ajout, modification et suppression) de base de données (Usf GestBD Tableau Structuré V2, sans calendrier).

La saisie de quelques caractères dans le TextBox1 déclenche bien la procédure de filtrage pour ne laisser sur la ListBox que la(es) occurrence(s) pertinentes. Le problème est que le fait de cliquer sur une de ces occurrences ne met pas à jour les TextBox (tb) de la base de données.

A contrario, lorsque l'on clique avec la souris directement sur un enregistrement de la ListBox, sans passer par la recherche intuitive, les TextBox (tb) de la base se mettent bien à jour. De même lorsque l'on utilise les boutons de navigation, les TextBox (tb) se mettent à jour dynamiquement, à chaque enregistrement.

A mon humble avis, il y a un conflit entre les ListIndex de ListBox1_Change et de ListBox1_Click que je ne sais pas résoudre.

Aurait-il quelqu'un qui serait intéressé par le sujet et disposé à consacrer un peu de temps? D'or et déjà, merci d'avance. Georg

Bonjour,

en fait lorsque vous "filtrez" pour une recherche, il y a bien mise à jour de la listbox1, mais le problème vient du fait que le "crud" est fait pour un affichage complet des données car ces dernières dans la ListeBox correspondent à celles du tableau de donnée : lorsque vous cliquez sur la deuxième ligne sans filtrage cela correspond à l'index 1 de la ListeBox, mais le Crud lui ajoute 1 afin d'obtenir 2 qui là correspond bien à la ligne 2 du tableau de données.

Donc si vous faites un filtrage sur Marx, la donnée initiale est en index 6 qui avec le +1 passe à 7 et on arrive bien à la 7ième ligne de la base de donnée. Donc si vous filtrez, Marx passe en première position, index 0 + 1 = 1 les TextBox sont mise à jour avec les données de Breton !

Ce n'est pas un conflit c'est un changement de référence du à la recherche...

@ bientôt

LouReeD

LouReeD, le forum,

Merci pour ta réponse et ton analyse. Je comprends très bien tes explications et les partage. Seul hic, comment y remédier?

Merci encore.

Comme ceci :

Modification du code de ListeBox Change :

Private Sub ListBox1_Change()
    If ListBox1.ListIndex = -1 Then Exit Sub
    iR = Trouve_Ligne(ListBox1.List(ListBox1.ListIndex, 0), Range("TData[iD]"))
'---Lecture de l'enregistrement iR (iR = CurrentRecord)
    ReadRecord
    CheckButton
End Sub

et dans le module "Main" ajoutez cette fonction :

' fonction pour trouver la ligne du tableau correspondant au nom
Function Trouve_Ligne(Nom As Long, Plage As Range)
    Dim Trouve As Variant
    On Error Resume Next
    Trouve = Application.Match(Nom, Plage, 0)
    If Trouve < 1 Then Trouve_Ligne = 0: Exit Function
    Trouve_Ligne = Trouve
End Function

En fait la récupération de la ligne où se trouve les données se fait par la recherche de l'iD du personnel "cliqué", comme cela il n'y a pas de relation position ListeBox et position tableau de donnée.

@ bientôt

LouReeD

LouReed, le forum,

J'ai fait de tests et tout a l'air de fonctionner à merveille. Ton intervention a été propre et limpide. Merci beaucoup !!!

Sans trop vouloir abuser de ta disponibilité et tes connaissances, il reste les deux autres questions :

a) Serait-il possible de remplir les TextBox (tb) automatiquement lorsqu'il ne reste qu'une seule occurrence dans la ListBox après une recherche?

b) Serait-il possible de appliquer le format R0000 à la première colonne de la ListBox?

Si tu n'as pas le temps ce n'est pas grave, je peux vivre avec. Merci d'avance. Georg.

Bonsoir,

modification à faire dans la textbox1.change :

Private Sub TextBox1_Change()   'recherche intuitive paritec/mars 2020/excel-pratique

    Dim i&, fin&, y&, a&, mem As Boolean, bb
    Application.ScreenUpdating = 0

    If TextBox1 = "" Then ListBox1.Clear: Exit Sub
    ListBox1.Clear

    With shtDataBase
        y = 1
        fin = .Range("B" & Rows.Count).End(xlUp).Row
        aa = .Range("B5:K" & fin)       'B5:I + 2 colonnes supplémentaires (J et K)
    End With

    For i = 1 To UBound(aa)
        aa(i, UBound(aa, 2) - 1) = i + 1
        aa(i, UBound(aa, 2)) = ""
    Next i

    For i = 1 To UBound(aa)
        For a = 1 To UBound(aa, 2)
            If aa(i, a) Like "*" & TextBox1 & "*" Then aa(i, UBound(aa, 2)) = "oui": y = y + 1: Exit For
        Next a
    Next i

    If y = 1 Then Exit Sub

    ReDim bb(1 To y - 1, 1 To UBound(aa, 2) - 1)
    y = 1

    For i = 1 To UBound(aa)
        If aa(i, UBound(aa, 2)) = "oui" Then
            For a = 1 To UBound(aa, 2) - 1
                bb(y, a) = aa(i, a)
            Next a
            y = y + 1
        End If
    Next i

    With ListBox1
        Rem .ColumnCount = 8
        .ColumnCount = UBound(aa, 2) - 1
        .ColumnWidths = "35;75;75;55;75;75;75;80;0"
        .List = bb
        If .ListCount = 1 Then
            iR = Trouve_Ligne(.List(0, 0), Range("TData[iD]"))
        '---Lecture de l'enregistrement iR (iR = CurrentRecord)
            ReadRecord
            CheckButton
        End If
    End With
End Sub

Le principe : si la listbox.count passe à 1 (une seule valeur affichée) alors on lance la recherche de la ligne correspondante et on lance les procédure Crud de lecture de donnée.

Pour le format, c'est soit vous le passez en alphanumérique dans votre tableau source soit cela reste comme ça. Si vous le passez en alphanumérique alors il faudra changer le type de la variable pour la fonction recherche ligne qui ici cible un "long" alors qu'il faudra chercher un "String". Mais cela fonctionnera tout de même avec simplement ce changement.

@ bientôt

LouReeD

LouReeD, le forum,

Impecable, merci encore.

Pour le format, c'est soit vous le passez en alphanumérique dans votre tableau source soit cela reste comme ça. Si vous le passez en alphanumérique alors il faudra changer le type de la variable pour la fonction recherche ligne qui ici cible un "long" alors qu'il faudra chercher un "String". Mais cela fonctionnera tout de même avec simplement ce changement.

Là, j'avoue pas trop comprendre, désolé. Dans mon tableau, la colonne B a un format personnalisé de type \R0000. Je devrais faire quoi pour passer dans un format alphanumérique?

Georg

Bonjour,

Supprimer ce format numérique et écrire l'iD entièrement, du coup ça devient de l'alphanumerique et tout s'affichera dans le textbox.

@ bientôt

LouReeD

Bonjour LouReeD, le forum,

Merci pour ta réponse. J'ai enlevé le format \R0000 de la colonne B et je l'ai mis au format Standard. Ensuite, j'ai saisi les iD manuellement mais j'obtiens un message d'erreur d'exécution 13 "Incompatibilité de type" dans la procédure ListBox1_Change et la ligne iR (>>>) surlignée en jaune (dans le flash du formulaire, pendant quelques secondes avant l'apparition de la fenêtre d'erreur, on voit que la première colonne a pris le bon format).

Private Sub ListBox1_Change()
 '---Lecture de l'enregistrement iR (iR = CurrentRecord)
    If ListBox1.ListIndex = -1 Then Exit Sub
>>> iR = Trouve_Ligne(ListBox1.List(ListBox1.ListIndex, 0), Range("TData[iD]"))
    ReadRecord
    CheckButton
End Sub

Aurais-tu une idée? Cordialement, Georg.

C'est ce que je dissais, la fonction attend un "Long" actuellement, il faut donc mettre "String" en lieu et place du "Long"

@ bientôt

LouReeD

LouReeD, le forum,

Bon, j'ai testé avec String et avec Long. Avec le premier je perds l'incrémentation automatique de l'iD et avec le second je perds le format R0000 dans la ListBox. Tout compte fait, je garde le Long et tant pis pour le format.

Je remercie LouReeD pour ses interventions rapides et de qualité qui m'ont permis d'avancer dans mon projet. Bonne soirée. Georg

Bonsoir,

les remerciements pour une fois arrivent un peu vite non ?

Je n'ai pas trop de temps en ce moment, du coup je donne des réponses rapides et voir à coté de la plaque, mais là je crois avoir répondu à tout non ?
Enfin après ce qui suit...

Ci joint votre fichier avec les modifications demandées, enfin la dernière : affichage du format de l'iD dans la listbox et ceci à tous moment sans que cela gène la recherche de ligne avec la fonction ajoutée et sans modifier le format de cellule. on doit donc jongler entre les versions "texte" et version "numérique" de ces iD en fonction de ce que l'on veut faire... Je vous laisse le soin de tester les fonctionnalités de l'application pour voir si "ça tien"...

Les modifications faites : donc partant du principe que sur la feuille c'est du numérique, à chaque endroit où il y un transfert de données entre la feuille et la listbox, j'ai ajouté une boucle sur la première colonne afin d'y "injecter" le format texte. Ceci provoque une erreur sur la recherche de ligne de la fonction Trouve_Ligne. En effet la fonction "même passée" en String va comparer du texte R0004 avec du numérique sur la feuille et oui le format personnalisé sur la feuille n'est que de la poudre aux yeux et c'est bien une colonne de "numérique" ! Du coup la fonction reste en "Long" mais la valeur cherchées est "travaillée" avant de lancer la fonction.

On récupère les 4 caractères à partir de la droite et j'utilise "Evaluate" pour transformer cette partie texte en numérique, et là la fonction fonctionne !

Normalement la sub d'ajout de fiche et d'iD devrait fonctionner du fait qu'elle est basée sur la colonne de la feuille qui elle est toujours en numérique.

bref, le fichier :

@ bientôt

LouReeD

LouReeD, le forum,

les remerciements pour une fois arrivent un peu vite non ?

Désolé, j'ai une dégaine très rapide...

J'ai testé la nouvelle version et ses fonctionnalités : a) la recherche intuitive; b) le remplissage des TextBox à partir de la ListBox, soit par le Change, soit par le Click; c) l'ajout d'un nouvel enregistrement et l'incrémentation automatique de l'ID; d) la modification d'un enregistrement; e) la suppression d'une ligne; f) les boutons de navigation; g) le format de la première colonne et la correspondance entre l'iD et l'enregistrement dans les différentes étapes.

Le résultat est sans appel : magnifique ! Tout semble fonctionner correctement. Et de ton côté LouReeD ? es-tu satisfait ou aurais-tu de remarques/commentaires/suggestions?

Cordialement Georg

Bonjour,

merci pour vos remerciements ! Je n'ai pas fait grand chose par rapport au fichier, si ce n'est l'adapter à vos demandes !
Pour ma part j'ai travaillé (je travaille et travaillerai) sur un USF "universel". le but de celui-ci est de s'adapter automatiquement au tableau structuré se trouvant sur la feuille dont on a utiliser le bouton pour l'ouvrir. J'ai ouvert un fil pour ce dernier mais au moment de le mettre en validation j'ai constaté quelques bugs lors des tests ultimes avant diffusion (Le Fil en question). L'idée est un USF type "CRUD" avec le consultation, l'ajout, la modification et le suppression des fiches, mais surtout la création en "direct" des différents champs pour s'adapter au nombre de colonne de la base de données, la détermination "automatique" du type de données de chaque champ avec l'affichage "format" correspondant dans les contrôles du USF. Mais va falloir que je m'y replonge...

Le problème c'est le temps, les parpaings ne se montent pas tout seul comme la clôture et tout le reste ! Alors on verra bien.

@ bientôt

LouReeD

LouReeD, le forum,

merci pour vos remerciements ! Je n'ai pas fait grand chose par rapport au fichier, si ce n'est l'adapter à vos demandes !

Le pas grand chose à toi c'est énorme pour moi! Je t'ai déjà classé dans mes notes dans la catégorie "orfèvre". Merci de tout coeur.

Ton projet de formulaire universel m'a fait vraiment rêver. J'ai eu un peu la même approche lorsque j'ai découvert le Crud : la simplicité dans la complexité. En apparence une expression minime mais au fond une toile de macros, procédures et de systèmes mettant en lumière une ingéniosité aiguë. Je ne peux que t'encourager à continuer tes travaux (entre un parpaing et un autre bien entendu).

Merci encore une fois et au plaisir de t'avoir croisé. Cordialement, Georg.

@ bientôt

LouReeD

Rechercher des sujets similaires à "formulaire polyvalent crud recherche intuitive"