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
| Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Const CoefCM As Double = 1.5
Const ColorCoefSet As Byte = 10
Dim iOffset As Integer
Dim iMaxCol As Integer, icol As Integer
Dim iCM As Integer
Dim Plage As Range, Cel As Range, CellOff As Range
Dim CellInTabBase As Range, CellInCMx As Range, CellCMx As Range
Dim iColQuotaCM As Integer, icolCMRepart As Integer
Dim iColQuotaTD As Integer, icolTDRepart As Integer
Dim CellInTDx As Range, CellTDx As Range
Dim TotalCM As Double
'On vérifie qu'au moins une cellule modifiées se trouve bien dans le tableau
Set CellInTabBase = Intersect(Target, Feuil1.Range("Tab_Base"))
If Not CellInTabBase Is Nothing Then
'Une pertie des cellules modifiées se trouve dans le tableau Tab_Base
'On pointe les cellule de la colonne Td
Set Plage = Feuil1.Range("Tab_Base[TD]").Offset(, 1)
'On vérifie que CM1 existe
If Plage.Offset(-1).Resize(1, 1).Value = "CM1" Then
'On pointe la colonne contenant les totaux CM et TD
iColQuotaCM = Feuil1.Range("Tab_Base[TOTAL HCM converties en HTD (coeff : 1,5)]").Column
iColQuotaTD = Feuil1.Range("Tab_Base[TOTAL HTD]").Column
'Idem CM et TD répartis
icolCMRepart = Feuil1.Range("Tab_Base[CM répartis]").Column
icolTDRepart = Feuil1.Range("Tab_Base[TD répartis]").Column
'On recherche le nombre de colonne CM à tester
iMaxCol = Feuil1.ListObjects("Tab_Base").ListColumns.Count - (Plage.Column - 1)
'On boucle sur les colonnes CM
For iCM = 1 To Int(iMaxCol / 2)
'On regarde si les celules modifiées du tableau correspondent à une colonne CM
Set CellInCMx = Intersect(CellInTabBase, Feuil1.Range("Tab_Base[CM" & CStr(iCM) & "]"))
If Not CellInCMx Is Nothing Then
'Au moins une cellule d'une colonne CM a était modifiée
'On boucle sur ces cellules
For Each CellCMx In CellInCMx
'On majore l'horaire
'On applique le coef (sans déclencher Change)
Application.EnableEvents = False
CellCMx.Value = CellCMx.Value * CoefCM
Application.EnableEvents = True
'On teste si le quota est dépassé
If Feuil1.Cells(CellCMx.Row, iColQuotaCM).Value < Feuil1.Cells(CellCMx.Row, icolCMRepart).Value Then
'Dépassement
CellCMx.Interior.ColorIndex = 3
Else
'Pas de dépassement
'On retire un éventuel fond rouge (en cas d'erreur de saisie, évite d'avoir à modifier manuellement la couleur de fond)
CellCMx.Interior.ColorIndex = xlNone
End If
' 'On vérifie le non dépassement du quotat de cette ligne si on ajoute la majoration aux CM déjà Répartis
' If Feuil1.Cells(CellCMx.Row, iColQuotaCM).Value < (CellCMx.Value * (CoefCM - 1) + Feuil1.Cells(CellCMx.Row, icolCMRepart).Value) Then
' 'Dépassement du quotat d'heure
' '...Action
' CellCMx.Interior.ColorIndex = 3
' Else
' 'On retire un éventuel fond rouge (en cas d'erreur de saisie, évite d'avoir à modifier manuellement la couleur de fond)
' CellCMx.Interior.ColorIndex = xlNone
' 'On applique le coef (sans déclencher Change)
' Application.EnableEvents = False
' CellCMx.Value = CellCMx.Value * CoefCM
' Application.EnableEvents = True
' End If
Next
End If
'Idem Pour TD
'ITD n'existe pas, ici on utilise iCM puisque CM et TD on le même indice
Set CellInTDx = Intersect(CellInTabBase, Feuil1.Range("Tab_Base[TD" & CStr(iCM) & "]"))
If Not CellInTDx Is Nothing Then
'Au moins une cellule d'une colonne TD a était modifiée
'On boucle sur ces cellules
For Each CellTDx In CellInTDx
'On vérifie le non dépassement du quotat de cette ligne
'If Feuil1.Cells(cellTDx,iColQuotaCM)<Feuil1.Cells(cellTDx,icolRepart) then
'Ici il faut aller chercher la valeur du quotat
'If Feuil1.Cells(CellTDx.Row, iColQuotaCM).Value < (CellTDx.Value) Then
If Feuil1.Cells(CellTDx.Row, iColQuotaTD).Value < Feuil1.Cells(CellTDx.Row, icolTDRepart) Then
'Dépassement du quotat d'heure
CellTDx.Interior.ColorIndex = 3
Else
'On retire un éventuel fond rouge (en cas d'erreur de saisie, évite d'avoir à modifier manuellement la couleur de fond)
CellTDx.Interior.ColorIndex = xlNone
'On empêche VB de générer un évement Change qui ferait de nouveau appel à cette procédure... boucle infinie
Application.EnableEvents = False
CellTDx.Value = CellTDx.Value
Application.EnableEvents = True
End If
Next
End If
Next
End If
End If
End Sub |
Partager