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

  1. #61
    Rédacteur

    Bonjour MadeInSwiss,
    Merci pour ton message.
    Je souhaiterais pouvoir effectuer une recherche depuis la combobox cboMember sur plusieurs colonne de ma base de donnée.
    Au stade actuel de mes connaissances, il n'est pas possible de faire une recherche multi-colonne au départ d'un contrôle ComboBox. La recherche dépend de la propriété MatchEntry qui suivant la valeur qui s'y trouve effectuera la recherche dans la colonne définie par la propriété TextColumn
    Extrait de l'aide VBA
    La propriété MatchEntry recherche des entrées à partir de la propriété TextColumn d'un contrôle ListBox ou ComboBox.
    Le contrôle recherche dans la colonne identifiée par la propriété TextColumn une entrée correspondant à la saisie de l'utilisateur. Lorsqu'une correspondance est trouvée, la ligne contenant la correspondance est sélectionné, le contenu de la colonne est affiché et celui de sa propriété BoundColumn devient la valeur du contrôle. Si la correspondance n'est pas ambiguë, le résultat de la correspondance déclenche l'événement Click.
    Le contrôle déclenche l'événement Click dès que l'utilisateur tape une suite de caractères correspondant exactement à l'entrée de la liste. Pendant que l'utilisateur tape, l'entrée est comparée à la ligne courante de la liste et à la ligne suivante. Lorsque l'entrée ne correspond qu'à la ligne courante, la correspondance est non ambiguë.
    Dans Microsoft Forms, ceci est vrai que la liste soit ou non triée. Cela signifie que le contrôle trouve la première occurrence qui correspond à l'entrée en fonction de l'ordre des éléments de liste. Par exemple, la saisie de "abc" ou "bc" déclenche l'événement Click pour la liste suivante :
    abcde
    bcdef
    abcxyz
    bchij
    Notez que dans chacun des cas, l'entrée correspondante n'est pas unique ; cependant, elle est suffisamment différente de l'entrée adjacente pour que le contrôle interprète la correspondance comme étant non ambiguë et déclenche l'événement Click.

    Pour faire une recherche multi-colonne, utilises plutôt un contrôle TextBox en affichant dans un ComboBox ou ListBox le résultat de la recherche en fonction des lettres tapées dans le TextBox
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  2. #62
    Rédacteur

    Bonjour Citaro,
    Bonjour Philippe,
    Bravo pour ce post qui m'est très instructif.
    Merci pour ton appréciation.

    Avec le code suivant qui se trouve sur la worksheet "Démonstration", on lance le userform en double cliquant sur les données de la feuille.
    As-tu une solution pour ouvrir le userform en mode modification en fonction de la ligne sur laquelle on double clique.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     If Not Intersect(Target, Me.Range("A1").CurrentRegion) Is Nothing Then
      Cancel = False
      With usfDemo
      .Tag = Target.Row - 2
      .Show
      End With
      Cancel = True
     End If
    End Sub
    Ce n'est pas la sélection dans la liste qui détermine si tu es en modification ou pas. C'ets toi qui détermine en fonction de tes propres critères si les données sont consultables, modifiables, etc.
    J'utilise pour cela la constante énumérée Status
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Enum Status ' Constantes énumérées Status
     Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    End Enum
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  3. #63
    Futur Membre du Club
    Bonjour Philippe,

    Citation Envoyé par Philippe Tulliez Voir le message

    Pour faire une recherche multi-colonne, utilises plutôt un contrôle TextBox en affichant dans un ComboBox ou ListBox le résultat de la recherche en fonction des lettres tapées dans le TextBox

    Merci pour ta réponse, effectivement c'est la piste que je suis en train d'explorer depuis hier : rajout d'une textbox et affichage dans listbox.
    Par contre, je rencontre des soucis lorsque je veux en plus cliquer dans la listbox sur l'un des résultats pour accéder à ma fiche correspondante.
    Je vais creuser tout ça dans la journée et me permettrai de revenir vers vous si je bloque.

    Bonne journée.

  4. #64
    Membre du Club
    Un grand merci à vous monsieur Tulliez, ce post est une mine d'enseignements même si je suis loin de tout comprendre.
    Je commence à adapter votre code à mes besoins (alimenter une base de données de dégustation, on est bien loin de l'utilisation initiale )

    Souhaitant ajouter d'autres ListBox identique à la votre je m'interroge sur cette ligne : ".RowSource = Range("lstHobby").Address(external:=True)"
    je ne comprends pas où vous définissez lstHobby dans votre code. Si par hasard vous trouvez le temps de me répondre je vous en remercie par avance.

  5. #65
    Expert éminent
    Bonjour,

    sans vouloir couper l'herbe sous le pied de Philippe, lorsque dans un code VBA tu as Range("UneChaine"), ceci correspond à une plage nommée (quand "UneChaine" n'est pas une adresse de cellule type A1 ou autre).

    cette plage nommée, tu la retrouveras probablement via le menu "Formules">>"Gestionnaire de noms"

  6. #66
    Membre du Club
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    sans vouloir couper l'herbe sous le pied de Philippe, lorsque dans un code VBA tu as Range("UneChaine"), ceci correspond à une plage nommée (quand "UneChaine" n'est pas une adresse de cellule type A1 ou autre).

    cette plage nommée, tu la retrouveras probablement via le menu "Formules">>"Gestionnaire de noms"
    Bonjour joe.levrai merci pour cette réponse, je me demandais en fait si cette plage était nommée dans le code vba. Visiblement non.

  7. #67
    Rédacteur

    Bonjour Paul,
    D'abord merci à Joe que je salue au passage d'avoir déjà apporté la réponse à ta question.

    je me demandais en fait si cette plage était nommée dans le code vba. Visiblement non.
    Oui effectivement cette plage (lstHobby) est nommée indépendamment du code VBA et pour rendre dynamique mes listes je converti toujours la plage de données en tableau.
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  8. #68
    Membre du Club
    Un grand merci à vous deux. Bonne continuation.

  9. #69
    Membre du Club
    J'ai remarqué un truc qui n'a pas été évoqué précédemment.
    Lorsqu'on clique sur Nouveau les champs TxtBox sont vidés (ClearTextBox) mais pas la ListBox (les cases cochées lors du précédent enregistrement le reste).
    Existe-t-il une fonction pour réinitialiser la ListBox ?

  10. #70
    Rédacteur

    Bonsoir Paul,
    Lorsqu'on clique sur Nouveau les champs TxtBox sont vidés (ClearTextBox) mais pas la ListBox (les cases cochées lors du précédent enregistrement le reste).
    C'est exact, cela a échappé à ma vigilance lors des tests.

    A priori en ajoutant la ligne en rouge on pourrait déjà avoir une solution provisoire (Attention pas testé complètement)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub cmdNew_Click()
     UserFormStatus = Status.NewRec
     ClearTextBox   ' Efface les valeurs des TextBox
     InitListBox    ' Initialise ListBox 16/11/2016
     OppositeStatus ' Inverse la valeur booléenne des boutons d'action
    End Sub


    Je vais m'en occuper dans les prochains jours et publierai la modification. Il y a d'ailleurs également le choix du sexe qui reste égalment coché sur le dernier choix.
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  11. #71
    Membre du Club
    Et bien ça c'est du SAV de luxe, je vous remercie. Bon ça ne fonctionne pas mais ce n'est pas grave.

  12. #72
    Rédacteur

    Bonjour,
    Et bien ça c'est du SAV de luxe, je vous remercie. Bon ça ne fonctionne pas mais ce n'est pas grave.
    Qu'est-ce qui ne marche pas ?

    Procédure à ajouter dans le UserForm nommé usfMember
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ClearListBox(objListBox As MSForms.ListBox)
     ' Version 4.1 - 17/11/2016
     ' Efface les multi-sélections de l'objet ListBox
     Dim Elem As Byte
     With objListBox
      If .MultiSelect = fmMultiSelectMulti Then
       For Elem = 0 To .ListCount - 1:  .Selected(Elem) = False:   Next
      End If
     End With
    End Sub


    et ajouter la ligne en rouge dans la procédure événementielle nommée cmdNew_Click
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub cmdNew_Click()
     UserFormStatus = Status.NewRec
     ClearTextBox   ' Efface les valeurs des TextBox
     ClearListBox Me.lstHobby ' Enlève les sélections du ListBox 17/11/2016
     OppositeStatus ' Inverse la valeur booléenne des boutons d'action
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  13. #73
    Membre du Club
    Citation Envoyé par Philippe Tulliez Voir le message
    Qu'est-ce qui ne marche pas ?
    Ben non finalement tout fonctionne Merci monsieur Tulliez

  14. #74
    Expert éminent
    Bonjour,

    petite astuce, tel le remplacement d'une formule par sa valeur sur une plage Excel

    pour décocher tous les éléments d'une ListBox déjà chargée
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    With Me.ListBox1
       If .MultiSelect <> fmMultiSelectSingle Then .List = .List
    End With



    EDIT : dans le fond, le test de la valeur de propriété de MultiSelect n'apparaît pas nécessaire ?

  15. #75
    Candidat au Club
    Bonjour Philippe ,

    Impressionnant ce que tu nous offre merci.

    Je suis partis de votre travail et je l'ai personnaliser pour mes besoins. Tout va bien, mais je bloque sur 2 points
    1) lorsque je cree un nouveau record, j'ai ajouter l'instruction date de creation, et cela fonctionne.
    Private Sub UserForm_Initialize()
    txtDateF.Text = Date
    End Sub

    Ce que je voudrais, ajouter une Date Supression, ET que la ligne avant d'etre supprimer soit copier dans un Onglet Archives. Pourrais-tu me guider?

    2) J'ai fait export/import de ton formulaire, dans mon classeur, et tout a bien ete. Par la suite apres avoir personnalise mon formulaire, j'ai refait la meme procedure dans mon classeur pour avoir un autre formulaire. (Objectif : Mon classeur a plusieurs Onglets, et chaque Onglets ont leur formulaire. Mon probleme se situe avec un code d'erreur quand j'ouvre mon 2 ieme formulaire : J'ai alors ce message d'erreur ERREUR DE COMPILATION, NOM AMBIGUE DETECTE : Status ... alors je dois mettre ces lignes en message
    'Enum Status
    'Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    'End Enum
    Pourquoi? Je cherche et je compare, et je ne vois pas.

    Indice : J'ai modifier le R00, pour le ID, car chaque formulaire aura un ID different. (C-A-D : C00, D00 .. )

    Private Sub ReadRecord(ByVal RecordNumber As Long)
    ' Lecture de l'enregistrement
    RecordNumber = RecordNumber + 1
    With rng
    Me.txtName = .Cells(RecordNumber, 2)
    Me.txtDateF = .Cells(RecordNumber, 3)
    If UCase(.Cells(RecordNumber, 4)) = "F" Then Me.optFemale.Value = True Else Me.optMale = True
    Me.frmMember.Caption = "Fiche " & Format(.Cells(RecordNumber, 1), "C000")
    End With
    End Sub

    Private Sub WriteRecord(ByVal RecordNumber As Long)
    ' Ecriture de l'enregistrement
    Me.cboMember.ListIndex = -1
    RecordNumber = RecordNumber + 1
    With rng
    With .Cells(RecordNumber, 1)
    If Len(.Value) = 0 Then ' ID
    .Value = Application.WorksheetFunction.Max(rng.Columns(1)) + 1
    End If
    .NumberFormat = "\C000" ' Format
    End With
    .Cells(RecordNumber, 2) = Me.txtName
    .Cells(RecordNumber, 3) = Me.txtDateF
    .Cells(RecordNumber, 4) = IIf(Me.optFemale = True, "Inactif", "Actif")
    .Cells(RecordNumber, 5) = Me.txtName
    End With
    Me.cboMember.ListIndex = CurrentRecord
    End Sub


    Merci a l'avance
    Michel

  16. #76
    Rédacteur

    Bonjour Michel,
    Merci pour ton appréciation
    Mon probleme se situe avec un code d'erreur quand j'ouvre mon 2 ieme formulaire : J'ai alors ce message d'erreur ERREUR DE COMPILATION, NOM AMBIGUE DETECTE : Status ... alors je dois mettre ces lignes en message
    'Enum Status
    'Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    'End Enum
    Pourquoi? Je cherche et je compare, et je ne vois pas.
    Le message d'erreur signifie dans ce cas précis qu'il y a une constante énumérée qui porte le même nom dans le même projet (classeur).
    Il faut faire précéder Enum par Private, comme ci-dessous et cela devrait fonctionner.
    Je ne garanti pas qu'il n'y aura pas une autre procédure portant le même nom car lors de mes tests, je n'avais qu'un seul UserForm dans le projet.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Private Enum Status
     Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    End Enum
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  17. #77
    Candidat au Club
    Cela fonctionne maintenant.

    Merci de m'avoir expliquer la cause et la correction a apporter.
    Car je n'aurais pense a cela, une notion que je ne connaissais pas encore, pourtant logique.

  18. #78
    Candidat au Club
    fichiers compléments
    Bonjour,

    Tout d'abord, je vous félicite pour ce travail remarquable.
    Vous avez parlé de fichiers compléments. Pourrez-vous svp m'indiquer l'endroit où je peux les télécharger?
    Merci

  19. #79
    Rédacteur

    Bonjour DameG,
    Tout d'abord, je vous félicite pour ce travail remarquable
    Merci pour ton appréciation.

    Vous avez parlé de fichiers compléments. Pourrez-vous svp m'indiquer l'endroit où je peux les télécharger?
    Cela ne me dit rien. Pourrais-tu me rafraîchir la mémoire en m'indiquant le lien de la discussion où j'en parle ?
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  20. #80
    Membre régulier
    Limiter l'incrémentation de ligne ...
    Bonjour Philippe, super boulot je me sert de votre exemple pour faire mes premier pas en Vba !!!

    J'essaye d'adapter votre démo à un quelque chose de concret pour moi ... comment faire pour que l'incrémentation de ligne s'arrête à la ligne 80 avec le R et continu à la 81 avec CA01...CA02 etc ...

    Comment faire pour que lorsqu'on supprime une ligne la référence supprimer donne son numéro au suivant, pour avoir les numéro qui se suivent. Si je supprime le 5 , on passe de 4 à 6, comment faire pour que que le 6 devienne 5 et que le 7 devienne 6 etc ...

    Merci d'avance.