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.

L'alléger je ne sais pas, mais l'accélerer certainement :
VB:
'Set Plage = F.Range("b2:b" &  F.Range("b65000").End(xlUp).Row)
T = F.Range("b2:b" & F.Range("b65000").End(xlUp).Row).Resize(, 54).Value

' For Each Cel In Plage
For L = 1 To UBound(T, 1)
        
        With BDD
'          .ListItems.Add , , Cel
           .ListItems.Add , , T(L, 1)
            
           For Nbr = 1 To 47
'              .ListItems(.ListItems.Count).ListSubItems.Add , , F.Cells(Cel.Row, Entetes(Nbr))  'Cel.Offset(0, 1)
                .ListItems(.ListItems.Count).ListSubItems.Add , , T(L,  Entetes(Nbr))
encore qu'il faudrait remplacer les entête de colonnes par leurs numéros dans Entetes
 

GADENSEB

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

Merci !
Si je comprend bien

Code:
'Set Plage = F.Range("b2:b" &  F.Range("b65000").End(xlUp).Row)
T = F.Range("b2:b" & F.Range("b65000").End(xlUp).Row).Resize(, 54).Value

' For Each Cel In Plage
For L = 1 To UBound(T, 1)
        
        With BDD
'          .ListItems.Add , , Cel
          .ListItems.Add , , T(L, 1)
            
           For Nbr = 1 To 47
'              .ListItems(.ListItems.Count).ListSubItems.Add , , F.Cells(Cel.Row, Entetes(Nbr))  'Cel.Offset(0, 1)
               .ListItems(.ListItems.Count).ListSubItems.Add , , T(L,  Entetes(Nbr))


remplace


Code:
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


Mais où est la référence à

Code:
Set F = Sheets("BASE EMPLOI")
 

Dranreb

XLDnaute Barbatruc
Re : Bdd / listview / Optimisation de code

Non, remplace le paquet plus bas: l'alimentation du corps du ListView, après le Set F
Et, je n'avais pas vu que vous vouliez les Entêtes de colonnes en entête de ListView. Il vous faudra alors plutôt un deuxième tableau pour les numéros de colonnes.
 
Dernière édition:

GADENSEB

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

Ok je tente le coup dans ce sens là
Pour la premiére partie si je fais

....Array("B":"BB") ..... cela fonctionne-t- il ?
Et dans ce cas comment mettre la taille sur toutes les colonnes ?
 

Dranreb

XLDnaute Barbatruc
Re : Bdd / listview / Optimisation de code

Alors pas besoin de tableau Entête.
Vous pouvez peut être utiliser cette fonction pour les entêtes de ListView:
VB:
Function EntCol(ByVal N As Long) As String
N = N - 1: If N > 25 Then EntCol = Chr$(N \ 26 + 64) & Chr$(N Mod 26 + 65) Else EntCol = Chr$(N + 65)
End Function
 

GADENSEB

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

Ok je recompil le code pour savoir si j'ai tout bien compris

Code:
Private Sub UserForm_Initialize()
Set F = Sheets("BASE EMPLOI")
With Me.BDD

Function EntCol(ByVal N As Long) As String
N = N - 1: If N > 25 Then EntCol = Chr$(N \ 26 + 64) & Chr$(N Mod 26 + 65) Else EntCol = Chr$(N + 65)
End Function

    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")
 
'Set Plage = F.Range("b2:b" &  F.Range("b65000").End(xlUp).Row)
T = F.Range("b2:b" & F.Range("b65000").End(xlUp).Row).Resize(, 54).Value

' For Each Cel In Plage
For L = 1 To UBound(T, 1)
        
        With BDD
'          .ListItems.Add , , Cel
          .ListItems.Add , , T(L, 1)
            
           For Nbr = 1 To 47
'              .ListItems(.ListItems.Count).ListSubItems.Add , , F.Cells(Cel.Row, Entetes(Nbr))  'Cel.Offset(0, 1)
               .ListItems(.ListItems.Count).ListSubItems.Add , , T(L,  Entetes(Nbr))
    Next
 end with
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
 

Dranreb

XLDnaute Barbatruc
Re : Bdd / listview / Optimisation de code

Une procédure Function ne peut pas être incluse dans une autre procédure en VBA.
Vous n'avez plus besoin du tableau Entête. Spécifiez directement les numéros de colonnes. Pour les avoir en lettres, mais pour les entête de la ListView seulement, Utilisez EntCol(C). Rend "A" par exemple si C vaut 1.

Ah, mais non, ce ne sont pas les Entête de colonnes que vous voulez comme entête de la LisView ce sont les titres ! Pourquoi vous vous embêtez avec les entêtes de colonnes ? Les numéros de colonnes marche tout aussi bien partout !
 
Dernière édition:

Herdet

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

Bonjour,
GADENSEB
Si cela peut t'aider, tu trouveras en pièce jointe une autre procédure pour afficher une base de données dans un ListView.
Je l'ai adaptée à ton soucis d'affichage de titres.
Dans tous les cas, pour gérer une base de données, il est nécessaire qu'il ait une ligne de tête avec des noms de champs bien définis.
Il faut éviter de travailler avec des colonnes du tableur (A,B,C,.....)

Cordialement
Robert
 

Pièces jointes

  • RD-base de donnees et ListView.xlsm
    26.7 KB · Affichages: 66

GADENSEB

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

Hello
@ Dranreb : J'avoue ne pas trop te suivre .... c'est la premiére fois que j'utilise FUNCTION, j'avoue ne pas trop comprendre le résultat de cette fonction, pourrais-tu m'expliquer please !

@ Herdet : Ton Code est super, par contre pourrait-on éviter de travailler avec des noms sur des sélection ( si j'ai bien compris ton code)

Défi supplémentaire ;-) pouvoir modifier une données pour qu'elle soit mofier aussi dans la base...


Merci à tous les deux.

Bonne soirée

Seb
 

Herdet

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

Hello
@ Herdet : Ton Code est super, par contre pourrait-on éviter de travailler avec des noms sur des sélection ( si j'ai bien compris ton code)

Défi supplémentaire ;-) pouvoir modifier une données pour qu'elle soit mofier aussi dans la base...
Bonsoir,
Pour quelle(s) raison(s) ne souhaites-tu pas utiliser des noms définis ?

Au lieu des noms définis dans le classeur, on peut toujours utiliser des noms de feuilles et des références de cellules mais cela ne présente aucune sécurité car toute modification de la base (insertion/suppression/ajout de lignes et de colonnes, modification du nom de feuille, etc..) cause un plantage.
Lorsque l'on gère une base de données en VBA, le leitmotiv est "rigueur" et donc il ne doit y avoir aucune référence en "dur" du genre " F.Range("b2:b" & F.Range("b65000") mais que des variables qui font appel à des plages nommées et modifiables sur les feuilles.
Au lieu de
With Sh_Base
Set a = Cells(Range("BD_CHAMPS").Row + 1, 1).CurrentRegion
...
tu peux toujours écrire
Set a = Sheets("BASE").Cells(8, 1).CurrentRegion ou Set a = Sheets("BASE").Range("A8").CurrentRegion
... mais à tes risques et périls.

pour le défi supplémentaire, je pense que c'est faisable, je regarderai ça.
Discussion apparentée :
https://www.excel-downloads.com/threads/modifier-ligne-listview-via-textbox.168595/

A+
Robert
 

Discussions similaires

Réponses
11
Affichages
238