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 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
| Option Explicit
'Liste des contrôles de saisie
Const LST As String = "cboCategorie cboArticle txtInfoArticle txtQte txtPrix cboMarge txtPrixM cboPort txtPrixVte txtPrixVteHT"
Const TauxTVA As Double = 0.196
Dim TotPA As Double, TotPV As Double
Dim Modif As Boolean 'Pour contrôler si une modification a été enregitsrée ou non
Dim Indx As Integer
'=== Initialisation: remplissage des combo, définition et remplissage de la listview et des totaux
Private Sub UserForm_Initialize()
Dim Last As Long, y As Long
Dim i As Byte
Dim Tb
'Remplissage des ComboBox
With Feuil3
Me.cboCategorie.List = .Range(.Cells(2, 1), .Cells(.Rows.Count, "A").End(xlUp)).Value
Me.cboArticle.List = .Range(.Cells(2, 2), .Cells(.Rows.Count, "B").End(xlUp)).Value
Me.cboMarge.List = .Range(.Cells(2, 3), .Cells(.Rows.Count, "C").End(xlUp)).Value
Me.cboPort.List = .Range(.Cells(2, 4), .Cells(.Rows.Count, "D").End(xlUp)).Value
End With
Me.cboMarge.Enabled = False
Me.txtPrixM.Enabled = False
Me.txtPrixVte.Enabled = False
Me.txtPrixVteHT.Enabled = False
'Définition des propriétés de la listview
With Me.LISTING
.Left = 50
.Width = 760
.HideColumnHeaders = False
.View = lvwReport
.FullRowSelect = True
With .ColumnHeaders
.Add , , "Catégorie", 100
.Add , , "Article", 100
.Add , , "Informations article", 165
.Add , , "Qté", 50
.Add , , "PU TTC", 60
.Add , , "Marge", 50
.Add , , "PU (margé)", 60
.Add , , "Port", 50
.Add , , "PVte TTC", 60
.Add , , "PVte HT", 60
End With
End With
'Remplissage de la listview
With Feuil2
Last = .Cells(.Rows.Count, "A").End(xlUp).Row
If Last >= 4 Then
Tb = .Range("A4:J" & Last)
With Me.LISTING
For y = 1 To UBound(Tb, 1)
.ListItems.Add y, , Tb(y, 1)
For i = 2 To 10
.ListItems(y).ListSubItems.Add , , Tb(y, i)
Next i
Next y
End With
End If
End With
'Remplissage des totaux
AjouteTotal
End Sub
'=== Rapatriement des données de la ligne cliquée de la listview
Private Sub LISTING_Click()
Dim i As Byte
Dim Tb
With Me.LISTING
If .ListItems.Count > 0 Then
Tb = Split(LST)
Indx = .SelectedItem.Index
Me.cboCategorie = .ListItems(Indx)
For i = 1 To UBound(Tb)
Me.Controls(Tb(i)) = .ListItems(Indx).SubItems(i)
Next i
End If
End With
End Sub
'=== Ajout ou modification des données saisies dans la listview
Private Sub Liste_Click()
Dim Tb
Dim i As Byte
If Not Vide Then
Tb = Split(LST)
Modif = True
With Me.LISTING
If Indx = 0 Then
'Ajout
.ListItems.Add , , Me.Controls(Tb(0)).Value
For i = 1 To UBound(Tb)
.ListItems(.ListItems.Count).ListSubItems.Add , , Me.Controls(Tb(i)).Value
Next i
Else
'Modification
.ListItems(Indx).Text = Me.Controls(Tb(0)).Value
For i = 1 To UBound(Tb)
.ListItems(Indx).SubItems(i) = Me.Controls(Tb(i)).Value
Next i
End If
RAZ
Me.txtTPU = TotPA
End With
'Actualisation des totaux
AjouteTotal
Else
MsgBox "Remplir les données manquantes"
End If
End Sub
'=== Supprime la ligne de la listview
Private Sub Enleve_Click()
Dim Lx As Integer
If Indx > 0 Then
Modif = True
With LISTING.ListItems
For Lx = 1 To .Count
If .Item(Lx).Selected Then
.Remove Lx
Exit For
End If
Next Lx
End With
RAZ
End If
AjouteTotal
End Sub
'=== Au changement du PU, les autres controles sont mis à jour
Private Sub txtPrix_Change()
Dim Marge As Double
Select Case Valeur(Me.txtPrix.Value)
Case Is <= 20: Marge = 1.4
Case 21 To 49: Marge = 1.3
Case 50 To 79: Marge = 1.25
Case 80 To 119: Marge = 1.2
Case 120 To 149: Marge = 1.15
Case Is >= 150: Marge = 1.1
End Select
cboMarge.Value = Marge
Me.txtPrixM = Format(Valeur(Me.txtPrix) * Marge, "0.00")
Me.txtPrixM = Format(Valeur(Me.txtPrix) * Marge, "0.00")
Me.txtPrixVte = Format(Valeur(Me.txtPrixM) + Valeur(Me.cboPort), "0.00")
Me.txtPrixVteHT = Format(Valeur(txtPrixVte) / (1 + Valeur(TauxTVA)), "0.00")
End Sub
'=== Recalcule du PV en fonction du port
Private Sub cboPort_Change()
Me.txtPrixVte = Format(Valeur(Me.txtPrixM) + Valeur(Me.cboPort), "0.00")
'Me.txtPrixVteHT = Format(Valeur(txtPrixVte) / (1 + TauxTVA), "0.00")
End Sub
'=== Recalcul du PVHT
Private Sub txtPrixVte_Change()
Me.txtPrixVteHT = Format(Valeur(txtPrixVte) / (1 + TauxTVA), "0.00")
End Sub
'=== Enregistrement sur la feuille Feuil2
Private Sub Enregistrer_Click()
Dim Bl As Byte, i As Byte
Dim LastLig As Long
Dim Lg As Integer
Bl = 3 'pour la première ligne d'écriture
With Feuil2
LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
If LastLig >= 4 Then
.Range("A4:J" & LastLig).ClearContents 'POURQUOI CETTE PLAGE?????????
.Range("N4:Q4").ClearContents
End If
If Me.LISTING.ListItems.Count > 0 Then
For Lg = 1 To Me.LISTING.ListItems.Count
.Cells(Lg + Bl, 1) = Me.LISTING.ListItems(Lg).Text 'Categorie
For i = 1 To 9
.Cells(Lg + Bl, i + 1) = Me.LISTING.ListItems(Lg).ListSubItems(i)
Next i
Next Lg
.Range("N4") = Valeur(Me.txtTPU)
.Range("O4") = Valeur(Me.TMarge)
.Range("P4") = Valeur(Me.TPVte)
.Range("Q4") = Valeur(Me.TPVteHT)
End If
Modif = False
End With
Unload Me
End Sub
'=== Fermeture de l'userform
Private Sub Annuler_Click()
If Modif Then
If MsgBox("Modifications non enregistrées" & vbNewLine & "Voulez vous annuler ces modifications?", vbYesNo + vbDefaultButton2) = vbYes Then Unload Me
Else
Unload Me
End If
End Sub
'=== Vidage des champs de saisie
Private Sub RAZ()
Dim i As Byte
Dim Tb
Tb = Split(LST)
For i = 0 To UBound(Tb)
Me.Controls(Tb(i)).Value = ""
Next i
Indx = 0
End Sub
'=== Fonction de contrôle si l'un des champs de saisie est vide
Private Function Vide() As Boolean
Dim i As Byte
Dim Tb
Tb = Split(LST)
For i = 0 To UBound(Tb)
If Me.Controls(Tb(i)).Value = "" Then
Vide = True
Exit Function
End If
Next i
End Function
'=== Fonction de transformation d'un nombre en format texte vers un un double
Private Function Valeur(ByVal Str As String) As Double
Valeur = Val(Replace(Str, ",", "."))
End Function
'=== Procédure de recalcul des totaux
Private Sub AjouteTotal()
Dim Tb(1 To 7) As Double
Dim Lx As Integer
Dim i As Byte
With Me.LISTING.ListItems
If .Count > 0 Then
For Lx = 1 To .Count
With .Item(Lx)
'Tb(1):Qté,Tb(2):PU, Tb(3):Marge,Tb(4):PUMargé, Tb(5): Port, Tb(6):PV, Tb(7): PVHT
For i = 1 To 7
Tb(i) = Tb(i) + Valeur(.SubItems(i + 2))
Next i
End With
Next Lx
End If
End With
Me.txtTPU = Format(Tb(2), "0.00")
Me.TMarge = Format(Tb(4) - Tb(2), "0.00")
Me.TPVte = Format(Tb(6), "0.00")
Me.TPVteHT = Format(Tb(7), "0.00")
TotPA = Tb(1) * Tb(4)
TotPV = Tb(1) * Tb(6)
End Sub |
Partager