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
|
Option Explicit
Const LIGNELETTRES = 5 ' A-D B-C se trouvent en ligne 5 actuellement
Const LIGNE1ERARTICLE = 11 ' Position du 1er article sur la feuille RENS
Const NBLIGNESSUPPR = 1000 ' Nombre de lignes à supprimer avant le nouvel affichage
Private Sub CommandButtonRemplir_Click()
' Supprimer les produits qui ont disparus (éventuellement renommés)
SupprimerProduitsObsoletes
' Ajouter les nouveaux produits ou ceux qui ont changé de nom (dans ce dernier cas, l'ancien nom a été supprimé avant)
AjouterProduitsNouveaux
'' Mettre à jour les quantités correspondant aux codes utilisés
MettreAJour
'' Supprimer les références qui n'ont plus de valeur
SupprimerReferences
Range("A1").Select
End Sub
Public Function ChercherCode(ByVal NumLigne As Integer, ByVal NumFeuilleSource As Integer) As String
Dim FeuilleSource As Worksheet
Dim Colonne As Integer
Set FeuilleSource = Worksheets(NumFeuilleSource)
Colonne = 1
Do
Colonne = Colonne + 1
Loop Until UCase(FeuilleSource.Cells(LIGNELETTRES, Colonne).Value) = "CODE" Or Colonne = 255
If Colonne = 255 Then
MsgBox "La dernière colonne du tableau SOURCE doit posséder le libellé CODE", vbCritical, "Erreur"
End
Else
ChercherCode = FeuilleSource.Cells(NumLigne, Colonne).Value
End If
End Function
Public Sub SupprimerProduitsObsoletes()
Dim FeuilleRENS As Worksheet
Dim LigneRens As Integer
Dim NumFeuilleSource As Integer
Set FeuilleRENS = Worksheets("RENS")
LigneRens = LIGNE1ERARTICLE
Do
If FeuilleRENS.Range("A" & LigneRens).Value <> "" Then
If Not RetrouverArticle(LigneRens) Then
Do
FeuilleRENS.Rows(LigneRens & ":" & LigneRens).Delete Shift:=xlUp
Loop Until FeuilleRENS.Range("A" & LigneRens).Value <> "" Or FeuilleRENS.Range("B" & LigneRens).Value = ""
Else
LigneRens = LigneRens + 1
End If
Else
LigneRens = LigneRens + 1
End If
Loop Until FeuilleRENS.Range("B" & LigneRens).Value = ""
End Sub
Public Function RetrouverArticle(ByVal LigneRens As Integer) As Boolean
Dim NumFeuilleSource As Integer
Dim FeuilleRENS As Worksheet
Dim FeuilleSource As Worksheet
Dim Bool_Trouve As Boolean
NumFeuilleSource = 1
Set FeuilleRENS = Worksheets("RENS")
Bool_Trouve = False
Do
Set FeuilleSource = Worksheets(NumFeuilleSource)
' On considère que l'on prend le nom générique du produit en A5
If UCase(FeuilleRENS.Range("A" & LigneRens).Value) = UCase(FeuilleSource.Range("A" & LIGNELETTRES).Value) Then
Bool_Trouve = True
End If
NumFeuilleSource = NumFeuilleSource + 1 ' traitement de la feuille suivante
Loop Until Worksheets(NumFeuilleSource).Name = "RENS" Or Bool_Trouve = True ' jusqu'à la feuille RENS (attention à l'orthographe)
RetrouverArticle = Bool_Trouve
End Function
Public Sub AjouterProduitsNouveaux()
Dim NumFeuilleSource As Integer
Dim FeuilleSource As Worksheet
Dim FeuilleRENS As Worksheet
Dim LigneRens As Integer
NumFeuilleSource = 1
Set FeuilleRENS = Worksheets("RENS")
Do
Set FeuilleSource = Worksheets(NumFeuilleSource)
' on cherche le produit de la feuille source sur toutes les lignes de la feuille RENS
LigneRens = LIGNE1ERARTICLE - 1
Do
LigneRens = LigneRens + 1
Loop Until UCase(FeuilleRENS.Range("A" & LigneRens).Value) = UCase(FeuilleSource.Range("A" & LIGNELETTRES).Value) Or FeuilleRENS.Range("B" & LigneRens).Value = ""
If UCase(FeuilleRENS.Range("A" & LigneRens).Value) <> UCase(FeuilleSource.Range("A" & LIGNELETTRES).Value) Then
' nouveau produit
' On recopie la trame
FeuilleRENS.Rows("1:3").Select
Selection.Copy
Range("A" & LigneRens).Select
ActiveSheet.Paste
Application.CutCopyMode = False
FeuilleRENS.Range("A" & LigneRens).Value = FeuilleSource.Range("A" & LIGNELETTRES).Value
End If
NumFeuilleSource = NumFeuilleSource + 1 ' traitement de la feuille suivante
Loop Until Worksheets(NumFeuilleSource).Name = "RENS" ' jusqu'à la feuille RENS (attention à l'orthographe)
End Sub
Public Sub MettreAJour()
Dim FeuilleSource As Worksheet
Dim FeuilleRENS As Worksheet
Dim LigneSource As Integer
Dim ColonneSource As Integer
Dim LigneRens As Integer
Dim NumFeuilleSource As Integer
Dim CodeProduit As String
Dim Produit As String
Dim RangeTrouve As Range
Dim LigneDebutProduit As Integer
Dim LigneFinProduit As Integer
Set FeuilleRENS = Worksheets("RENS")
NumFeuilleSource = 1
' Traitement d'une feuille SOURCE à chaque tour de boucle
Do
Set FeuilleSource = Worksheets(NumFeuilleSource)
ColonneSource = 3
Do
' on regarde si on trouve des lettres sur la ligne n°LIGNELETTRES
If FeuilleSource.Cells(LIGNELETTRES, ColonneSource).Value <> "" Then
LigneSource = LIGNELETTRES
Do
LigneSource = LigneSource + 1
Loop Until FeuilleSource.Cells(LigneSource, ColonneSource).Value <> "" Or FeuilleSource.Cells(LigneSource, 1).Value = ""
' Si on a trouvé une valeur, on la sauvegarde dans la feuille RENS
CodeProduit = ChercherCode(LigneSource, NumFeuilleSource)
If CodeProduit <> "" Then
Set RangeTrouve = FeuilleRENS.Columns(3).Cells.Find(what:=CodeProduit, LookAt:=xlWhole)
If Not (RangeTrouve Is Nothing) Then
' le code existe déjà
' mémorise Tronçon qui a éventuellement changé
RangeTrouve.Offset(0, -1).Value = FeuilleSource.Cells(LIGNELETTRES, ColonneSource).Value
' mémorise référence du produit
RangeTrouve.Offset(0, 1).Value = FeuilleSource.Cells(LigneSource, 1).Value
' mémorise Qté
RangeTrouve.Offset(0, 2).Value = FeuilleSource.Cells(LigneSource, ColonneSource).Value
If Left(RangeTrouve.Offset(0, 3).Value, 1) <> "¤" Then
RangeTrouve.Offset(0, 3).Value = "¤" + RangeTrouve.Offset(0, 3).Value
End If
Else
' le code est nouveau
Produit = FeuilleSource.Range("A" & LIGNELETTRES).Value
Set RangeTrouve = FeuilleRENS.Columns(1).Cells.Find(what:=Produit, LookAt:=xlWhole)
' Le produit qui correspond à la nouvelle référence se trouve sur une ligne libre
If FeuilleRENS.Range("C" & RangeTrouve.Row).Value = "" Then
LigneRens = RangeTrouve.Row
' ou bien la ligne suivante est libre
ElseIf FeuilleRENS.Range("C" & RangeTrouve.Row + 1).Value = "" And FeuilleRENS.Range("E" & RangeTrouve.Row + 1).Value = "" Then
LigneRens = RangeTrouve.Row + 1
Else
' ou bien il faut créer une nouvelle ligne
LigneRens = RangeTrouve.Row + 1
Rows(RangeTrouve.Row + 1 & ":" & RangeTrouve.Row + 1).Insert Shift:=xlDown
' Si l'insertion a lieu sur la ligne de sous-total alors il faut refaire la formule
If UCase(FeuilleRENS.Range("B" & LigneRens).Value) <> "SOUS TOTAL" And UCase(FeuilleRENS.Range("B" & LigneRens).Value) <> "SOUS-TOTAL" Then
FeuilleRENS.Range("E" & LigneRens + 1).Formula = "=SUM(E" & LigneRens - 1 & ":E" & LigneRens & ")"
End If
End If
' mémorise Tronçon
FeuilleRENS.Range("B" & LigneRens).Value = FeuilleSource.Cells(LIGNELETTRES, ColonneSource).Value
' mémorise code produit
FeuilleRENS.Range("C" & LigneRens).Value = CodeProduit
' mémorise référence du produit
FeuilleRENS.Range("D" & LigneRens).Value = FeuilleSource.Cells(LigneSource, 1).Value
' mémorise Qté
FeuilleRENS.Range("E" & LigneRens).Value = FeuilleSource.Cells(LigneSource, ColonneSource).Value
If FeuilleRENS.Range("F" & LigneRens).Value <> "¤" Then
FeuilleRENS.Range("F" & LigneRens).Value = "¤" + FeuilleRENS.Range("F" & LigneRens).Value
End If
End If
End If
End If
ColonneSource = ColonneSource + 1
Loop Until FeuilleSource.Cells(LIGNELETTRES, ColonneSource).Value = ""
NumFeuilleSource = NumFeuilleSource + 1 ' traitement de la feuille suivante
LigneRens = LigneRens + 2
Loop Until Worksheets(NumFeuilleSource).Name = "RENS" ' jusqu'à la feuille RENS (attention à l'orthographe)
End Sub
Public Sub SupprimerReferences()
Dim FeuilleRENS As Worksheet
Dim LigneRens As Integer
Dim NomProduit As String
Set FeuilleRENS = Worksheets("RENS")
LigneRens = LIGNE1ERARTICLE
While FeuilleRENS.Range("B" & LigneRens).Value <> ""
If Left(FeuilleRENS.Range("F" & LigneRens).Value, 1) <> "¤" Then
If UCase(FeuilleRENS.Range("B" & LigneRens).Value) <> "SOUS TOTAL" And UCase(FeuilleRENS.Range("B" & LigneRens).Value) <> "SOUS-TOTAL" Then
' il faut supprimer la ligne mais en prenant des précautions
NomProduit = FeuilleRENS.Range("A" & LigneRens).Value
FeuilleRENS.Rows(LigneRens & ":" & LigneRens).Delete Shift:=xlUp
If NomProduit <> "" Then
If UCase(FeuilleRENS.Range("B" & LigneRens).Value) <> "SOUS TOTAL" And UCase(FeuilleRENS.Range("B" & LigneRens).Value) <> "SOUS-TOTAL" Then
FeuilleRENS.Range("A" & LigneRens).Value = NomProduit
Else
FeuilleRENS.Rows(LigneRens & ":" & LigneRens).Delete Shift:=xlUp
End If
End If
LigneRens = LigneRens - 1
End If
Else
FeuilleRENS.Range("F" & LigneRens).Value = Right(FeuilleRENS.Range("F" & LigneRens).Value, Len(FeuilleRENS.Range("F" & LigneRens).Value) - 1)
End If
LigneRens = LigneRens + 1
Wend
End Sub |
Partager