XL 2021 VBA Formulaire

delsart59

XLDnaute Nouveau
Bonjour à vous,

Je suis actuellement sur un projet de collecte de données pour mon entreprise et j'ai donc voulu créer un formulaire automatiser pour ajouter toutes ces données.

Depuis peu mon formulaire ne fonctionne plus et je ne sais pas pourquoi.

Je vous explique, à travers le formulaire présent dans le fichier que je vais vous joindre, avant je pouvais à l'aide de petits boutons que j'ai programmé, alimenter une table qui elle-même alimentait des combobox. Mes combobox me permettaient à la fois de filtrer ma listeview et d'ajouter des données à ma base de données.
Or depuis peu, je ne sais pas pourquoi, je ne peux plus ajouter des données à l'aide du bouton et consulter juste après ma combobox à jour, si je fais cela mon fichier plante.
Petite précision, si j'ajoute une donnée (cette fonction marche correctement) et que je ferme et reouvre le formulaire, cela met à jour ma combobox et mon fichier ne plante pas mais ce n'est pas pratique.

SI quelqu'un peu me venir en aide please.

PS: Je ne pourrais pas télécharger vos fichier car je suis sur mon ordinateur du travail.

Merci par Avance.

Cordialement
 

Pièces jointes

  • DATABASE FINALE Neels 2.1.xlsm
    213.5 KB · Affichages: 9
Solution
Hello

une nouvelle version en PJ
1) pour modifier une ligne, il faut selectionner la ligne dans la listview ET cliquer sur le bouton "Modifier" (il n'apparait QUE si tu as selectionné une ligne)
tant que tu n'as pas cliqué sur ce bouton, les sélections dans les combo déclenchent les filtres
une fois cliqué, les autres boutons deviennent inactifs, et le bouton change de texte ("Valider la modif")
tu fais tes modifs en selectionnant dans les combo
tu valides en recliquant sur le bouton
==> la table excel est mise à jour, ET la ListView est rechargée, les boutons redeviennent actifs

2) j'ai aussi ajouté un bouton "Supprimer la ligne" qui permet de supprimer une ligne de la table

delsart59

XLDnaute Nouveau
Regarde la PJ
j'ai fait un peu de ménage et modifié le code pour exploiter les TablesStructurées (Listobjects)

J'ai supprimé les plages nommées,
j'ai donc supprimé les rowsources des combobox
==> j'ai créé une macro "LoadCombo" qui permet de les charges
j'ai modifié le code pour ajouter des éléments dans les différentes tables "listes"
==> donc, lorsque tu ajoutes un élément, le combo est automatiquement rechargé avec le nouvel élément
Je te remercie pour ton retour, je vais essayer de l'adapter à mon fichier en local car je ne peux pas executer de macros qui ont été téléchargées.

Je te renvoie un message pour te dire ce qu'il en est.

Cordialement
 

delsart59

XLDnaute Nouveau
Regarde la PJ
j'ai fait un peu de ménage et modifié le code pour exploiter les TablesStructurées (Listobjects)

J'ai supprimé les plages nommées,
j'ai donc supprimé les rowsources des combobox
==> j'ai créé une macro "LoadCombo" qui permet de les charges
j'ai modifié le code pour ajouter des éléments dans les différentes tables "listes"
==> donc, lorsque tu ajoutes un élément, le combo est automatiquement rechargé avec le nouvel élément
Re,

Concernant l'ajout et la consultation, ça ne me ferme plus le fichier !! cependant, mon bouton ne réinitialise plus les boxs et les boxs ne me permettent plus de filtrer dans ma listview.

Saurais-tu comment y remédier ?

Cordialement
 

vgendron

XLDnaute Barbatruc
en fait, il faudrait expliquer le comportement attendu
1) quand tu cliques/selectionnes une ligne dans la Listview (pour l'instant, ca remplit les combo avec les valeurs de la ligne sélectionnée

2) quand tu selectionnes un élément dans un des combo==> ca filtrait la liste (souvent elle se retrouve vide)
 

vgendron

XLDnaute Barbatruc
une nouvelle version ici

1) quand tu cliques sur un des "+" pour ajouter un élément
==> un control est fait pour voir si l'élément n'existe pas déjà
==> l'élément est ajouté dans sa table, et la table est triée

2) le bouton qui efface les combo
==> je l'ai déplacé en haut à droite et changé le texte

3) le bouton "Initialiser"
==> j'ai changé le texte "reload All BDD"

4) lorsque tu cliques sur une ligne de la liste view, les combo sont remplis avec les items de la ligne
==> ca ne provoque plus la mise à jour de la listview qui se retrouvait vidée

5) lorsque tu selectionnes un item dans les combo
==> la ListView est "filtrée" avec les lignes qui répondent aux critères

à priori, tu n'as rien pour "Modifier" une ligne déjà existante.. à part modifier à la main directement dans la BDD avec risque de saisir des infos invalides car non listées dans les tables "listes"
 

Pièces jointes

  • DATABASE FINALE Neels 3.xlsm
    220.3 KB · Affichages: 4

delsart59

XLDnaute Nouveau
une nouvelle version ici

1) quand tu cliques sur un des "+" pour ajouter un élément
==> un control est fait pour voir si l'élément n'existe pas déjà
==> l'élément est ajouté dans sa table, et la table est triée

2) le bouton qui efface les combo
==> je l'ai déplacé en haut à droite et changé le texte

3) le bouton "Initialiser"
==> j'ai changé le texte "reload All BDD"

4) lorsque tu cliques sur une ligne de la liste view, les combo sont remplis avec les items de la ligne
==> ca ne provoque plus la mise à jour de la listview qui se retrouvait vidée

5) lorsque tu selectionnes un item dans les combo
==> la ListView est "filtrée" avec les lignes qui répondent aux critères

à priori, tu n'as rien pour "Modifier" une ligne déjà existante.. à part modifier à la main directement dans la BDD avec risque de saisir des infos invalides car non listées dans les tables "listes"
Bonjour à toi, tout d'abord je te souhaite une bonne semaine.

Je te remercie pour ton retour et ton aide. Effectivement, je n'ai pas ajouté de bouton modifier et c'était bien une idée de base mais j'avais peur que cela entre en conflit avec le filtre car lorsqu'on séléctionne une ligne, cela va filtrer dans la listeview et si on aporte une modification, la listeview n'est plus modifiée si ?

Cordialemebt
 

vgendron

XLDnaute Barbatruc
Hello

une nouvelle version en PJ
1) pour modifier une ligne, il faut selectionner la ligne dans la listview ET cliquer sur le bouton "Modifier" (il n'apparait QUE si tu as selectionné une ligne)
tant que tu n'as pas cliqué sur ce bouton, les sélections dans les combo déclenchent les filtres
une fois cliqué, les autres boutons deviennent inactifs, et le bouton change de texte ("Valider la modif")
tu fais tes modifs en selectionnant dans les combo
tu valides en recliquant sur le bouton
==> la table excel est mise à jour, ET la ListView est rechargée, les boutons redeviennent actifs

2) j'ai aussi ajouté un bouton "Supprimer la ligne" qui permet de supprimer une ligne de la table
 

Pièces jointes

  • DATABASE FINALE Neels 4.xlsm
    224 KB · Affichages: 6

delsart59

XLDnaute Nouveau
Hello

une nouvelle version en PJ
1) pour modifier une ligne, il faut selectionner la ligne dans la listview ET cliquer sur le bouton "Modifier" (il n'apparait QUE si tu as selectionné une ligne)
tant que tu n'as pas cliqué sur ce bouton, les sélections dans les combo déclenchent les filtres
une fois cliqué, les autres boutons deviennent inactifs, et le bouton change de texte ("Valider la modif")
tu fais tes modifs en selectionnant dans les combo
tu valides en recliquant sur le bouton
==> la table excel est mise à jour, ET la ListView est rechargée, les boutons redeviennent actifs

2) j'ai aussi ajouté un bouton "Supprimer la ligne" qui permet de supprimer une ligne de la table
Bonjour à toi,

Tout fonctionne correctement, je tenais à te remercier pour ton aide !
Juste une derniere petite question, sais tu comment je peux proteger certaines fonctionnalités, je veux dire par la que certaines personnes seront en écriture et d'autres en lecture.

Cordialement
 

vgendron

XLDnaute Barbatruc
Hello

pour ce qui est des protections.. je suis moins à l'aise...car pour "planter" ma solution, il suffit de savoir acceder au vba pour bypasser..
mais, si on s'adresse à un public totalement néophyte et dénué de mauvaise intention, la proposition ci -jointe peut suffire

1) Dans la feuille "Listes", j'ai ajouté une table qui définit une liste d'utilisateurs avec leur mot de passe associé ET leur profil (Lecteur ou Admin
2) à l'ouverture du classeur, la feuille est masquée en xlveryhidden ==> ca veut dire qu'un clic droit en bas à gauche ne suffit pas pour afficher la feuille ==> il faut aller dans le VBA (Alt +F11) voila.. il sufft de ca pour faire sauter la protection :-D

3) tu ouvres donc le fichier
tu cliques sur le bouton pour lancer le formulaire
==> ca ne lance plus directement ton formulaire de saisie, mais un formulaire d'identification
==> tu choisis ton identifiant dans la liste
==> tu saisis le mot de passe
==> tu valides / un messageBox t'indique ton profil
==> le formulaire de saisie/consultation s'ouvre

4) si profil admin==> tu peux utliser le formulaire comme précédemment
si profil Lecteur==> l'ajout d'élément, insertion, modification et suppression sont interdites

PS: comme la feuille "Listes" va etre masquée quand tu vas ouvrir le fichier:
util 1 ==> mot de passe: Mdp1
util 2= => mot de passe: Mdp2
 

Pièces jointes

  • DATABASE FINALE Neels 5.xlsm
    230.1 KB · Affichages: 5

delsart59

XLDnaute Nouveau
Hello

pour ce qui est des protections.. je suis moins à l'aise...car pour "planter" ma solution, il suffit de savoir acceder au vba pour bypasser..
mais, si on s'adresse à un public totalement néophyte et dénué de mauvaise intention, la proposition ci -jointe peut suffire

1) Dans la feuille "Listes", j'ai ajouté une table qui définit une liste d'utilisateurs avec leur mot de passe associé ET leur profil (Lecteur ou Admin
2) à l'ouverture du classeur, la feuille est masquée en xlveryhidden ==> ca veut dire qu'un clic droit en bas à gauche ne suffit pas pour afficher la feuille ==> il faut aller dans le VBA (Alt +F11) voila.. il sufft de ca pour faire sauter la protection :-D

3) tu ouvres donc le fichier
tu cliques sur le bouton pour lancer le formulaire
==> ca ne lance plus directement ton formulaire de saisie, mais un formulaire d'identification
==> tu choisis ton identifiant dans la liste
==> tu saisis le mot de passe
==> tu valides / un messageBox t'indique ton profil
==> le formulaire de saisie/consultation s'ouvre

4) si profil admin==> tu peux utliser le formulaire comme précédemment
si profil Lecteur==> l'ajout d'élément, insertion, modification et suppression sont interdites

PS: comme la feuille "Listes" va etre masquée quand tu vas ouvrir le fichier:
util 1 ==> mot de passe: Mdp1
util 2= => mot de passe: Mdp2
Un grand merci pour ton aide ! Mon fichier fonctionne correctement, j'ai réussi à tout adapter et j'ai aussi compris comment tu as procédé.
 

ChTi160

XLDnaute Barbatruc
Bonjourle Fil
juste pour vous saluer
pourquoi ne pas tester l'autorisation dès le Click sur la ListView
ce que j'ai modifié
VB:
Private Sub CmbModifier_Click()
'Supprimer ci dessous les 4 Lignes'
'    If TypeUtilisateur = "Lecteur" Then
'        MsgBox "Vous n'êtes pas autorisé à apporter toute modification" & Chr(10) & "Approchez-vous du propriétaire de ce fichier"
'        Exit Sub
'    End If

If Me.ListView1.SelectedItem.SubItems(1) = "" Then Exit Sub

EnableEvents = False
Me.CmbModifier.Caption = IIf(Me.CmbModifier.Caption = "Valider Modif", "Modifier Ligne", "Valider Modif")
Me.CmbInsérer.Enabled = False
Me.CmbReinitialiser.Enabled = False

Me.CmbDelete.Enabled = False
Me.ListView1.Enabled = False
    If Me.CmbModifier.Caption = "Modifier Ligne" Then
        Copy_to_Excel
        Actualisation
        Me.CmbInsérer.Enabled = True
        Me.CmbReinitialiser.Enabled = True
        Me.ListView1.Enabled = True
        Me.CmbDelete.Enabled = True
      'Pourquoi ces deux Lignes ????? c'est ou visible ou Invisible des l'identification
        Me.CmbModifier.Visible = False
        Me.CmbDelete.Visible = False
        Set Me.ListView1.SelectedItem = Nothing
     
        EnableEvents = True
    End If
End Sub
'**********************************************'
Private Sub CmbDelete_Click()
'Supprimer ci dessous les 4 Lignes'
'    If TypeUtilisateur = "Lecteur" Then
'        MsgBox "Vous n'êtes pas autorisé à apporter toute modification" & Chr(10) & "Approchez-vous du propriétaire de ce fichier"
'        Exit Sub
'    End If

    IndLigne = Me.ListView1.SelectedItem.Index
    If IndLigne = "" Then Exit Sub
    With Sheets("Base de données").ListObjects("t_BDD")
        .ListRows(IndLigne).Range.Delete
    End With
    Actualisation
'Pourquoi ces deux Lignes ????? c'est ou visible ou Invisible des l'identification
    Me.CmbDelete.Visible = False
    Me.CmbModifier.Visible = False
End Sub
VB:
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
    EnableEvents = False 'pour éviter qu'un changement de sélection dans le combo provoque le vidage de la listbox via la fonction "FilterDataInListView"

   'Assigner les valeurs aux ComboBox
    CbxProjets.Value = ListView1.SelectedItem.SubItems(1) ' txtProjets
    CbxMétiers.Value = ListView1.SelectedItem.SubItems(2) ' txtMétiers
    CbxSystèmes.Value = ListView1.SelectedItem.SubItems(3) ' txtSystèmes
    CbxSousSystèmes.Value = ListView1.SelectedItem.SubItems(4) ' txtSousSystèmes
    CbxEquipements.Value = ListView1.SelectedItem.SubItems(5) ' txtEquipements

   'Assigner les valeurs aux TextBox
    TbxRisques.Text = ListView1.SelectedItem.SubItems(6) ' txtRisques
    TbxSolutions.Text = ListView1.SelectedItem.SubItems(7) ' txtSolutions_préconisées
    TbxNumCR.Text = ListView1.SelectedItem.SubItems(8) ' txtN°CR
    EnableEvents = True
    'Modifier les deux Lignes Ci dessous'
    Me.CmbModifier.Visible = IIf(TypeUtilisateur = "Admin", True, False)'Visible Uniquement si "Admin"
    Me.CmbDelete.Visible = IIf(TypeUtilisateur = "Admin", True, False)'Visible Uniquement si "Admin"'
End Sub
Bonne Continuation
Jean marie
 
Dernière édition:

delsart59

XLDnaute Nouveau
Un grand merci pour ton aide ! grâce à toi mon fichier fonctionne et j'
Hello

pour ce qui est des protections.. je suis moins à l'aise...car pour "planter" ma solution, il suffit de savoir acceder au vba pour bypasser..
mais, si on s'adresse à un public totalement néophyte et dénué de mauvaise intention, la proposition ci -jointe peut suffire

1) Dans la feuille "Listes", j'ai ajouté une table qui définit une liste d'utilisateurs avec leur mot de passe associé ET leur profil (Lecteur ou Admin
2) à l'ouverture du classeur, la feuille est masquée en xlveryhidden ==> ca veut dire qu'un clic droit en bas à gauche ne suffit pas pour afficher la feuille ==> il faut aller dans le VBA (Alt +F11) voila.. il sufft de ca pour faire sauter la protection :-D

3) tu ouvres donc le fichier
tu cliques sur le bouton pour lancer le formulaire
==> ca ne lance plus directement ton formulaire de saisie, mais un formulaire d'identification
==> tu choisis ton identifiant dans la liste
==> tu saisis le mot de passe
==> tu valides / un messageBox t'indique ton profil
==> le formulaire de saisie/consultation s'ouvre

4) si profil admin==> tu peux utliser le formulaire comme précédemment
si profil Lecteur==> l'ajout d'élément, insertion, modification et suppression sont interdites

PS: comme la feuille "Listes" va etre masquée quand tu vas ouvrir le fichier:
util 1 ==> mot de passe: Mdp1
util 2= => mot de passe: Mdp2
Un grand merci pour ton aide ! Mon fichier fonctionne correctement, j'ai réussi à tout adapter et j'ai aussi compris comment tu as proc
Hello Chti
effectivement, c'est mieux de ne pas proposer des boutons de toute facon inactifs..
Hello à vous, j'ai trouvé une autre solution, j'ai ajouter une fonction de demande de mot de passe sur les boutons si on souhaite ajouter des données et si le mot de passe est faux le code renvoie un message d'erreur. De plus, j'ai aussi ajouter le mot de passe à la macro générale.
Qu'en pensez vous ?
Cordialement
 

Statistiques des forums

Discussions
314 704
Messages
2 112 055
Membres
111 410
dernier inscrit
yomeiome