Bdd / listview / Optimisation de code

GADENSEB

XLDnaute Impliqué
Bonjour Le Forum,
Je reviens vers vous pour ma bdd
Je cherche maintenant à tout gérer via des USF

Je créer donc un USF général avec des onglets
Dans l'un de ces onglets "BDD" je rappel toute la BDD présente dans l'onget "BASE EMPLOI'"


Mon code est un peu lourd, je trouve, comment pourrais-je l'alléger ?

On active l'USF en cliquant que sur G6 "Sommaire"

Bonne fin d'aprem
Seb



Code:
'Private Sub BDD_BeforeLabelEdit(Cancel As Integer)
 Private Sub UserForm_Initialize()
 
 
 With GENERAL
.Top = 0
.Left = 0
.Height = Application.UsableHeight
.Width = Application.UsableWidth
End With
 
 
 
Set F = Sheets("BASE EMPLOI")
With Me.BDD
 
Entetes = Array("B", "C", "D", "E", "G", "H", "I", "J", "K", "L", "N", "O", "P", "Q", "R", "T", "U", "V", "W", "X", "Y", "AA", "AB", "AC", "AD", "AF", "AG", "AH", "AI", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB")
largeur = Array(80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70, 80, 80, 80, 70, 70, 70)
    With .ColumnHeaders
        .Clear
        nbr = -1
        For nbr = 0 To 47
           .Add , , F.Cells(1, Entetes(nbr)), largeur(nbr) '80
        Next
 
    End With
    .View = 3                   ' type Report
    .Gridlines = True           ' affichage de lignes
    .FullRowSelect = True       ' sélection complète de la ligne
    .HideColumnHeaders = False  ' afficher les en-têtes de colonnes
    .LabelEdit = 0              ' Autoriser la saisie
    '.LabelEdit = 1             ' N'autoriser la saisie
 
End With
Call LISTING
End Sub
Sub LISTING()
 
 'Remplit la Listview avec les données d'Excel
 
BDD.ListItems.Clear
 
Set F = Sheets("BASE EMPLOI")
 
Entetes = Array("B", "C", "D", "E", "G", "H", "I", "J", "K", "L", "N", "O", "P", "Q", "R", "T", "U", "V", "W", "X", "Y", "AA", "AB", "AC", "AD", "AF", "AG", "AH", "AI", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB")
 
   Set Plage = F.Range("b2:b" & F.Range("b65000").End(xlUp).Row)
    For Each Cel In Plage
        With BDD
 
            .ListItems.Add , , Cel
 
            For nbr = 1 To 47
 
            .ListItems(.ListItems.Count).ListSubItems.Add , , F.Cells(Cel.Row, Entetes(nbr))  'Cel.Offset(0, 1)
 
            Next
 
        End With
    Next
 
End Sub
 
 
 
Private Sub BDD_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
 
   'Permet le classement par clic sur le titre de la colonne
 
    BDD.Sorted = False
    BDD.SortKey = ColumnHeader.Index - 1
 
    If BDD.SortOrder = lvwAscending Then
        BDD.SortOrder = lvwDescending
        Else
        BDD.SortOrder = lvwAscending
    End If
 
   BDD.Sorted = True
End Sub
 
Private Sub MODIFICATIONS_Click()
   Dim i As Integer, j As Integer
 
    'Boucle sur toutes les lignes
    For i = 1 To BDD.ListItems.Count
        Cells(i, 1) = BDD.ListItems(i).Text
 
        'Boucle sur les colonnes
        For j = 1 To BDD.ColumnHeaders.Count - 1
            Cells(i, j + 1) = BDD.ListItems(i).ListSubItems(j).Text
        Next j
    Next i
 
 
End Sub
 

Pièces jointes

  • BASE EMPLOI - DEMO.xlsm
    246.9 KB · Affichages: 60
  • BASE EMPLOI - DEMO.xlsm
    246.9 KB · Affichages: 63
  • BASE EMPLOI - DEMO.xlsm
    246.9 KB · Affichages: 72
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Bdd / listview / Optimisation de code

Bonjour.
FUNCTION, …, pourrais-tu m'expliquer please
C'est une procédure qui renvoie une valeur, généralement calculée à partir d'un ou plusieurs arguments qui lui sont passés en paramètres. En dehors de l'instruction Function, le nom de celle ci, suivi des arguments entre parenthèses, représente une expression prenant la valeur calculée grâce à l'exécution de la procédure Function.
En VBA une function peut aussi renvoyer un objet.
 
Dernière édition:

Herdet

Nous a quitté
Repose en paix
Re : Bdd / listview / Optimisation de code

Bonjour,
GADENSEB :

Comme promis le défi de la mise à jour de la base est solutionné.
Ci-joint la version 2 avec la possibilité de modification des données à partir de la liste de détail de la ligne sélectionnée dans la Listview.

Dans la boîte de dialogue affichée :
Clic dans la base ==> affichage des détails, clic ==> affichage Frame de Modifications

Bouton Valider : affiche les valeurs modifiées dans la colonne 3 de la liste de détails

Bouton Actualiser et relire la base : Après confirmation, les données modifiées de la ligne sélectionnée sont écrites dans la base de données

Bon, à force de vouloir aller plus loin dans les fonctionnalités, c'est déjà devenu une petite application.

Bien sûr, il y encore quelques petites imperfections dans le comportement visuel mais rien de grave.

Cordialement
Robert
 

Pièces jointes

  • RD-base de donnees et ListView-v02.xlsm
    52.1 KB · Affichages: 69

GADENSEB

XLDnaute Impliqué
Re : Bdd / listview / Optimisation de code

Hello,

@ Dranreb : Merci à toi, je comprends mieux à présent

@ Herdet : Wahou ! le code de malade !
J'ai passé du temps pour décrypter tout cela, des questions me viennent à l’esprit :

- Pourrais-ton inclure la procédure de modification dans le tableau général au lieu d'avoir un second tableau ?
- Pour adapter ton code à ma Bdd comment faire appel à la feuille "BASE EMPLOI" dans le code qui sélectionne les données ?
- Pourquoi faut-il inclure une ligne supplémentaire au dessus des données, pour ne pas perturber le code ?


Merci

bonne journée

Sébastien
 

Herdet

Nous a quitté
Repose en paix
Re : Bdd / listview / Optimisation de code

Hello,
...
- Pourrais-ton inclure la procédure de modification dans le tableau général au lieu d'avoir un second tableau ?
- Pour adapter ton code à ma Bdd comment faire appel à la feuille "BASE EMPLOI" dans le code qui sélectionne les données ?
- Pourquoi faut-il inclure une ligne supplémentaire au dessus des données, pour ne pas perturber le code ?
...
Sébastien
Bonjour,

GADENSEB:
Je n'ai pas compris toutes tes questions :
1) Qu'entends-tu par "tableau" général" et "second tableau" . Quels sont les noms définis dans mon code VBA ?

2) Pour adapter le code à ta feuille BASE EMPLOI, il faut :
Insérer 3 lignes au dessus des champs
Définir la plage : BD_LV_LARG = BASE EMPLOI!$A$2:$CC$2 ( CC ou plus )
Définir la plage : BD_CHAMPS = BASE EMPLOI!$A$4:$CC$4 ( CC ou plus )
La ligne 1 peut servir à des informations.
En pratique, on peut insérer autant de lignes que l'on veut au-dessus des champs de la base, il faut seulement bien adapter les références de BD_CHAMPS et BD_LV_LARG

A NOTER : une bizarrerie dans ton fichier BASE EMPLOI - DEMO.xlsm
Après insertion de 3 lignes, le texte "---" réapparait systématiquement en A2 et A3 . Pourquoi ? Un "change" en VBA ?
J'avoue ne pas avoir regardé de près ton fichier source, je verrais cela demain.

3) la ligne vide au-dessus des champs est impérative pour le VBA (voir explication en rouge dans ma feuille BASE
Par rapport à la cellule sélectionnée, la fonction CurrentRegion va sélectionner toutes les cellules vers le haut, bas, gauche et droite jusqu'aux lignes vides donc il faut limiter la sélection à la ligne des champs par une ligne vide avec aucune valeur ( ligne 3 dans ce cas).

Le code de la Sub BASE_Lecture deviendrait :

Code:
Sub BASE_Lecture()
   Dim i As Integer, j As Integer
   BD_LiCh = Range("BD_CHAMPS").Row         ' BASE :ligne des champs
   BD_ColD = Range("BD_CHAMPS").Column    ' BASE :1ere colonne de données
   With Sh_Base
      Set a = .Cells(BD_LiCh + 1, BD_ColD).CurrentRegion              '  région à partir de la Cells(...) sélectionnée
      'NOTA a = base de données complète avec la ligne des champs
      Set CHA = a.Offset(0, 0).Resize(1, a.Columns.Count)                          ' noms des champs
      Set BDD = a.Offset(1, 0).Resize(a.Rows.Count - 1, a.Columns.Count)    ' données seules sans les champs
      Set CHA_L = Range("BD_LV_LARG")                                                  ' largeurs de colonnes
   End With

   BDD_NbLi = BDD.Rows.Count                                               ' BASE données seules : nb de lignes
   BDD_NbCol = BDD.Columns.Count                                           ' BASE données seules : nb de colonnes
   '......... etc.......
   '.....................
   
End If

Cordialement
Robert
 

Herdet

Nous a quitté
Repose en paix
Re : Bdd / listview / Optimisation de code

Bonjour,
GADENSEB

Bon, j'ai examiné ton fichier mais pas tout assimilé bien sûr.

Le gros défaut c'est qu'il y a beaucoup de références en dur dans le code.
Par exemple : Cells(i, "A") = Cells(i, "B") & "-" & Cells(i, "C") & "-" & Cells(i, "AF") & "-" & Cells(i, "BB")
Si une colonne est insérée ou déplacée ou si la base elle même est déplacée ==> PLANTAGE IRRÉMÉDIABLE

Dans le fichier ci joint, j'ai préféré créer une nouvelle feuille BASE avec tes données et j'ai adapté mon code précédent à celles-ci dans une UserForm UF_BASE à peu près similaire.

Dans la feuille BASE, seul le bouton "Afficher BASE" est fonctionnel, je te laisse terminer tout le reste et adapter ton code pour les autres boutons de la feuille BASE.

Bon travail
Robert
 

Pièces jointes

  • GADENSEB-BASE EMPLOI - DEMO-Herdet-v01.xlsm
    362.8 KB · Affichages: 70

GADENSEB

XLDnaute Impliqué
Re : Bdd / listview / Optimisation de code

Salut,
Je viens de regarder ton code !
J'aime bien la page "PARAMETRES", je pense que c'est une bonne orientation que je souhaite garder.

Pour :
- Tableau général et second tableau : ben tu as le tableau de la base puis le tableau dans lequel on modifie
en fait je souhaiterais que l'on puisse modifier directement dans le premier tableau qui représente la bdd.

- Pourrais-ton regrouper tous les boutons dans un seul formulaire qui s’exécute au démarrage ?

Merci encore pour ce travail

Bon We

seb
 

Herdet

Nous a quitté
Repose en paix
Re : Bdd / listview / Optimisation de code

Salut,
Je viens de regarder ton code !
J'aime bien la page "PARAMETRES", je pense que c'est une bonne orientation que je souhaite garder.
Pour :
- Tableau général et second tableau : ben tu as le tableau de la base puis le tableau dans lequel on modifie
en fait je souhaiterais que l'on puisse modifier directement dans le premier tableau qui représente la bdd.
- Pourrais-ton regrouper tous les boutons dans un seul formulaire qui s’exécute au démarrage ?
Merci encore pour ce travail

Bon We

seb
Bonjour,
Dans toutes mes applis, j'ai toujours ajouté une feuille PARAMETRES (ou GESTION ) pour y placer toutes les variables communes, les liens, les répertoires, messages, noms de tableaux, etc.. ainsi qu'une feuille TABLEAUX pour stocker les listes prédéfinies, tableaux de données calculées, etc.
L'avantage est de pouvoir tout visualiser d'un coup d'oeil et d'imprimer, le VBA ne fait qu'y puiser des données ou en mettre à jour sans ralentir l'exécution car Excel est rapide en calcul, lecture et écriture sur une feuille.

Tableau général et second tableau :
J'avais saisi ta demande mais je voulais une confirmation car cela n'est pas possible directement sauf pour la 1ère colonne de ListItems
Microsoft est clair sur ce coup là
Ce lien n'existe plus

Lorsque la propriété LabelEdit a la valeur true, .... Le texte des sous-éléments ne peut pas être modifié si cette propriété a la valeur true. Pour modifier le texte des sous-éléments, vous pouvez spécifier qu'une boîte de dialogue s'affiche lorsque l'utilisateur double-clique sur un sous-élément du contrôle.

On peut difficilement contourner cette restriction :)confused:) d'autant plus que Listview et Treeview sont inclus dans le module MSCOMPCTL.OCX qui n'est plus maintenu par MS$ depuis plusieurs années.
L'avantage du tableau de détails est que l'on peut y faire toutes les modifications de la ligne sélectionnée, effacement, annulation et ensuite seulement passer la ligne dans la base ou bien abandonner en cliquant dans une autre ligne de la base.
C'est bien plus sécurisant de visualiser les valeurs existantes (colonne 3) et les modifications (colonne 4).
Cela peut être aussi utile pour faire une traçabilité des modifications dans une feuille.

Regrouper tous les boutons dans un formulaire :
C'est faisable déplaçant dans un nouvel Userform toutes les procédures liées aux boutons ( feuille BASE ) ensuite bien gérer les Userform (visible, Showmodal, Load, Unload). Un peu compliqué !

A mon avis, il vaudrait mieux créer une feuille ACCUEIL bien présentable (titres, formats, couleurs) comprenant :
- un pavé de texte de présentation et expliquant le but de ton application
- tous les boutons ( ceux de la feuille BASE ) qui lanceront les procédures
- une petite explication sur la fonction de ces boutons
- les infos : date de mise à jour, version de l'application et nom de l'auteur.

Si ton application est bien conçue tu pourras peut être ne laisser visible que la feuille ACCUEIL.

Bon travail
Robert

PS : bon, c'est un vrai roman ce message mais c'est la finalité qui est importante !
 

Herdet

Nous a quitté
Repose en paix
Re : Bdd / listview / Optimisation de code

Bonjour,
GADENSEB
N'oublie pas que tu peux créer des TCD pour exploiter la base avec des manipulations manuelles ou en VBA



A+
Robert
 

Pièces jointes

  • Base donnees-TCD.jpg
    Base donnees-TCD.jpg
    47.5 KB · Affichages: 69

Discussions similaires

Réponses
11
Affichages
286