1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
| Option Explicit 'oblige à déclarer toutes les variables
Private OP As Worksheet 'déclare la variable OP (Onglet Projet)
Private ORf As Worksheet 'déclare la variable ORf (Onglet Reférence)
Private TP As ListObject 'déclare la variable TP (tableau structuré Projet)
Private TRf As ListObject 'déclare la variable TRf (Tableau structuré Référence)
Private Tab_Numero As ListObject
Private LI As Integer 'déclare la variable LI (Ligne)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim I As Integer 'déclare la variable I (Incrément)
Dim CellFind As Range
Set OP = Worksheets("Projet") 'définit l'onglet OP
Set ORf = Worksheets("Référence") 'définit le'onglet ORf
Set TP = OP.ListObjects("Tableau2") 'définit le tableau structuré TP
Set TRf = ORf.ListObjects("NumeroUnique") 'définit le tableau structuré TRf
Set Tab_Numero = ORf.ListObjects("Numero")
' Liste1.ColumnCount = 2 'définit le nombre de colonne de"Liste1"
' Liste2.ColumnCount = 2 'définit le nombre de colonne de"Liste2"
' Liste1.ColumnWidths = ";0" 'masque la seconde colonne"Liste1"
' Liste2.ColumnWidths = ";0" 'masque la seconde colonne"Liste2"
'On alimente les listes/combobox avec les données du classeur
Nom.List = TP.DataBodyRange.Columns(1).Value 'alimente "Nom"
For I = 1 To Tab_Numero.ListRows.Count 'boucle sur toutes des donnée du tableau structuré Trf
'On regarde si la valeur est dans Trf
On Error Resume Next
Set CellFind = Nothing
Set CellFind = TRf.DataBodyRange.Find(Tab_Numero.DataBodyRange(I, 1).Value, , xlValues, xlWhole)
On Error GoTo 0
If Not CellFind Is Nothing Then
Liste1.AddItem 'ajoute un élément à "Liste1"
Liste1.Column(0, Liste1.ListCount - 1) = Tab_Numero.DataBodyRange(I, 1).Value 'recupere numero serie de TRf pour mettre dans"liste 1"
Liste1.Column(1, Liste1.ListCount - 1) = I - 1 'récupère la position dans la colonne 1 (cachée)
End If
Next I 'prochaine donnée de la boucle
End Sub
Private Sub Nom_Change() 'au changement dans [Nom]
Dim R As Range 'déclare la variable R (Recherche)
Dim COL As Integer 'déclare la variable COL (Colonne)
Dim I As Integer 'déclare la variable I (Incrément)
'définit la recherche R (recherche le projet dans la première colonne du tableau structuré TP)
Set R = TP.ListColumns(1).Range.Find(Nom.Value, , xlValues, xlWhole)
If Not R Is Nothing Then 'si aucune occurrence n'est trouvée, sort de la procédure
LI = R.Row - TP.HeaderRowRange.Row 'définit la ligne LI de la première occurrence trouvée on enleve la premiere ligne qui est l'entête
Debut.Caption = TP.DataBodyRange(LI, 2).Value 'renvoie la date de début dans [Debut]
Fin.Caption = TP.DataBodyRange(LI, 3).Value 'renvoie la date de fin dans [Fin]
For COL = 4 To TP.ListColumns.Count 'boucle 1 : des colonnes 4 à la dernière colonne de TP
If TP.DataBodyRange(LI, COL) <> "" Then 'si la donnée de TP ligne LI colonne COL n'est pas vide
Liste2.AddItem 'ajoute un élément à"Liste2"
'récupère la référence dans la colonne 0
Liste2.Column(0, Liste2.ListCount - 1) = TP.DataBodyRange(LI, COL)
'récupère la position dans la colonne1 (cachée)
Liste2.Column(1, Liste2.ListCount - 1) = Tab_Numero.ListColumns(1).Range.Find(TP.DataBodyRange(LI, COL), , xlValues, xlWhole).Row - TRf.HeaderRowRange.Row - 1
End If 'fin de la condition
For I = Liste1.ListCount - 1 To 0 Step -1 'boucle 2 : inversée du dernier au premier élément de"Liste1"
'si l'élément est égal à la donnée ligne LI, colonne COL de TP, supprime l'élément, sort de la boucle
If Liste1.List(I) = TP.DataBodyRange(LI, COL) Then
Liste1.RemoveItem (I)
Exit For
End If
Next I 'prochaine élément de la boucle 2
Next COL 'prochaine colonne de la boucle 1
End If
End Sub
Private Sub Droite_Click() 'bouton "Flèche vers la droite"
Dim I As Integer 'déclare la variable I (Incrément)
For I = Liste1.ListCount - 1 To 0 Step -1 'boucle 2 : inversée du dernier au premier élément de"Liste1"
If Liste1.Selected(I) = True Then 'condition : si l'élément de la liste 1 est sélectionné
Liste2.AddItem 'ajoute un élément à"Liste2"
'récupère la référence dans la colonne 0 de"Liste2"
Liste2.Column(0, Liste2.ListCount - 1) = Liste1.Column(0, I)
'récupère la position dans la colonne 1 (cachée) de"Liste2"
Liste2.Column(1, Liste2.ListCount - 1) = Liste1.Column(1, I)
Liste1.RemoveItem (I) 'supprime l'élément de "Liste1"
End If 'fin de la condition
Next I 'prochain élément de la boucle 1
'tri de la liste2
TriListe Liste2
End Sub
Private Sub Gauche_Click() 'bouton "Flèche vers la gauche"
Dim I As Integer 'déclare la variable I (Incrément)
For I = Liste2.ListCount - 1 To 0 Step -1 'boucle 2 : inversée du dernier au premier élément de"Liste2"
If Liste2.Selected(I) = True Then 'condition : si l'élément est sélectionné
Liste1.AddItem 'ajoute un élément à"Liste1"
'récupère la référence dans la colonne 0 de"Liste1"
Liste1.Column(0, Liste1.ListCount - 1) = Liste2.Column(0, I)
'récupère la position dans la colonne 1 (cachée) de"Liste1"
Liste1.Column(1, Liste1.ListCount - 1) = Liste2.Column(1, I)
Liste2.RemoveItem (I) 'supprime l'élément de"Liste2"
End If 'fin de la condition
Next I 'prochain élément de la boucle
'tri de la liste1
TriListe Liste1
End Sub
Private Sub TriListe(aListe As MsForms.ListBox)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim T1 As Variant 'déclare la variable T1 (Temporaire1)
Dim T2 As Variant 'déclare la variable T2 (Temporaire2)
'tri de la liste
With aListe 'prend en compte "aListe"
For I = 0 To .ListCount - 1 'boucle 1 : sur tous les éléments I de la [aListe]
For J = I + 1 To .ListCount - 1 'boucle 2 : sur tous les éléments J de la [aListe]
'condition si I est différent de J est si la position de I est infrérieure à la position de J
If I <> J And CInt(.Column(1, I)) > CInt(.Column(1, J)) Then
'récupère dans T1 la référence de J, récupère dans T2 la position de J
T1 = .Column(0, J)
T2 = .Column(1, J)
'redéfinit la référence de J comme celle de I, redéfinit la position de J comme celle de I
.Column(0, J) = .Column(0, I)
.Column(1, J) = .Column(1, I)
'redéfinit la référence de I comme T1, redéfinit la position de I comme T2
.Column(0, I) = T1
.Column(1, I) = T2
End If 'fin de la condition
Next J 'prochain élément de la boucle 2
Next I 'prochain élément de la boucle 1
End With 'fin de la prise en compte de "aListe"
End Sub
Private Sub Ajouterelement_Click() 'bouton "Valider
Dim I As Integer 'déclare la variable I (Incrément)
Dim R As Range 'déclare la variable R (Recherche)
Dim LN As Integer 'déclare la variable LN (Ligne du Numéro)
Dim NewCol As ListRow
If Nom = "" Then 'condition : si [Nom] est vide
MsgBox "Vous devez désigner un projet !" 'message
Nom.SetFocus 'place le curseur
'Exit Sub 'sort de la procédure
Else
TP.Parent.Range(TP.DataBodyRange(LI, 4), TP.DataBodyRange(LI, TP.ListColumns.Count)).ClearContents 'efface les références de la ligne LI
For I = 0 To Liste2.ListCount - 1 'boucle sur tous les éléments de"Liste2"
'On vérifie que la colonne existe dans le tableau structuré
If TP.ListColumns.Count < 4 + I Then
'Pas assez de colonne, on en ajoute une
TP.ListColumns.Add 'ajoute une colonne à TP
OP.Columns(TP.ListColumns.Count).ColumnWidth = TP.ListColumns(4).Range.ColumnWidth 'largeir de la colonne identique à celle de "Référence1"
TP.HeaderRowRange(1, TP.ListColumns.Count) = "Référence" & I + 1 'ajoute 'en-tête
' Set R = TRf.DataBodyRange.Find(Liste2.List(I), , xlValues, xlWhole) 'définit la rechercghe R (recherche le numéro dans TRF)
' If Not R Is Nothing Then 'condition : s'il existe au moins une occurrence de R trouvée
' LN = R.Row - TRf.HeaderRowRange.Row 'définit la ligne LN de la première occurrence trouvée
' TRf.DataBodyRange(LN, 1).Delete 'supprime le numéro dans TRf
' End If 'fin de la condition
End If
TP.DataBodyRange(LI, 4 + I).Value = Liste2.List(I) 'renvoie l'élément de la boucle dans la donnée ligne LI colonne 4 + I de TP
Next I 'prochain élément de la boucle
'On met à jour le tableau NumeroUnique (qui doit correspondre au contenu de Liste2
TRf.DataBodyRange.Columns(1).ClearContents
TRf.DataBodyRange.Columns(1).Resize(Liste1.ListCount, 1).Value = Liste1.List
TRf.Resize TRf.Range.Resize(Liste1.ListCount + 1, 1)
'en cas de suppression de référence mise à jour de la taille de TP
For I = TP.ListColumns.Count To 4 Step -1 'boucle inversée sur les dernières colonne de TP jusqu'à la 4ème
If Application.WorksheetFunction.CountA(TP.ListColumns(I).Range) = 1 Then 'su le nombre de valeur de la colonne est égal à 1 (le titre)
TP.Resize TP.Range.Resize(TP.ListRows.Count + 1, TP.ListColumns.Count - 1) 'redimensionne le tableau en enlevant la colonne
End If 'fin de la condition
Next I 'prochaine colonne de la boucle
Unload Me 'vide et ferme l'Userorm
End If 'fin de la condition
End Sub
Private Sub CommandButton3_Click()
Unload Me 'vide et ferme l'Userorm
End Sub |
Partager