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
| Option Explicit
'Procédure qui permet de remplir la colonne A en fonction de son formalisme.
'Utilise la fonction "MardiProchain" qui renvoi le prochain Mardi par rapport à la date placée en paramètre.
'Permet ainsi de remplir la colonne A avec le prochain Mardi ouvré.
Sub remplir_ColA()
'Déclaration des variables
Dim oRng As Range
Dim nb_sem As Integer
Dim i As Integer
Dim oDate As Date
Dim oBool As Boolean
Dim oFerie As Range
Dim oStart As Integer
'Avec la feuille "UPCAPO"
With Worksheets("UPCAPO")
'On set "oRng" sur la première cellule non vide de la colonne A
Set oRng = .Cells(Rows.Count, 1).End(xlUp)
'Affiche une InputBox permettant de définir le nombre de semaines que l'on souhaite remplir
'Si la valeur insérée n'est pas numérique => gère l'erreur et sort de la procédure
On Error GoTo MauvaisType
nb_sem = CInt(InputBox("Nombre de semaines à remplir :", "Remplissage de la colonne A", 10))
'Si le nombre de semaine insérée est suppérieure à 0
If nb_sem > 0 Then
'On vérifie la ligne atteinte par oRng
If oRng.Row = 6 Then
'Si cette valeur est 6 (ce qui représente la cellule fusionnée "Précédents points APO disponibles sous : V/Outils/APO/archive :..."
'Alors cela signfie qu'aucune valeur n'est présente en colonne A
'On set alors oDate à la date du jour
oDate = Date
'Et oStart à 2 (permettant de définir l'offet et de placer la première valeur en A10
oStart = 2
Else
'Si oRng est différent de 6, on a donc des valeurs dans la colonne A
'On vérifie que la dernière valeur est bien une date
If IsDate(oRng) Then
'Si c'est une date, on la prend comme référence et on la plce dans oDate
oDate = CDate(oRng)
'Et on n'aura donc pas d'offset
oStart = 0
Else
'Si la valeur n'est pas une date, on affiche un message d'erreur et on sort de la procédure.
MsgBox "La dernière valeur de la colonne A n'est pas une date."
Exit Sub
End If
End If
'On boucle de i = oStart + 1 à oStrat + nb_sem
For i = oStart + 1 To oStart + nb_sem
'On set oBool à False
oBool = False
'Et on boucle tant que oBool n'est pas à True
Do Until oBool
'Va dans la fonction "MardiProchain" avec le paramètre oDate.
'Et on écrase oDate avec la valeur que retourne la fonction.
'Celle-ci permet de définir le prochain Mardi par rapport à la date placée en paramètre.
oDate = MardiProchain(oDate)
'On cherche sur les valeurs "Jours_fériés" si on trouve la date renvoyée par la fonction "MardiProchain"
Set oFerie = Range("Jours_fériés").Find(oDate, LookIn:=xlValues, LookAt:=xlWhole)
'Si on ne trouve rien, cela signifie que le prochain Mardi n'est pas férié
If oFerie Is Nothing Then
'On passe donc oBool à True pour sortir de la boucle.
'On pourrait aussi mettre "Exit Do". Ceci éviterait de déclarer la variable oBool. Pas pensé avant ^^
oBool = True
End If
'Et si jamais on a trouvé une valeur pour le Mardi prochain férié, il faut mettre oFerie à Nothing
Set oFerie = Nothing
Loop
'Dès que l'on sort de la boucle, cela signifie que le prochain Mardi trouvé n'est pas férié.
'Ainsi on place cette valeur dans oRng avec un décalage de i lignes.
oRng.Offset(i, 0) = oDate
Next i
End If
Exit Sub
End With
MauvaisType:
MsgBox "La valeur saisie doit être numérique.", vbCritical
End Sub
'Fontion qui retourne le prochain Mardi par rapport à la date placée en paramètre.
Public Function MardiProchain(oDate As Date) As Date
If Weekday(oDate, vbMonday) = 1 Then
MardiProchain = oDate + (2 - Weekday(oDate, vbMonday))
Else
MardiProchain = oDate + (7 - Weekday(oDate, vbMonday)) + 2
End If
End Function
'Fonction qui recopie toutes les lignes qui ont un statut "En cours"
'Recopie les colonnes A à G de la feuille "UPCAPO" => sur les colonnes A à G de la feuille "Feuil1"
Sub recopier()
'Déclaration des variables
Dim oRng As Range
Dim i As Long
Dim nb_action As Long
Dim oDest As Range
'Avec la feuille "UPCAPO"
With Worksheets("UPCAPO")
'On définie nb_action comme étant le numéro de la dernière ligne non-vide de la colonne G
nb_action = .Cells(Rows.Count, 7).End(xlUp).Row
'On définie oRng comme étant la première ligne non-vide de la colonne G
'/!\ ici, il est considéré qu'il n'y a pas d'action avec un statut nul. Toutes les actions doivent donc avec un statut en colonne G
Set oRng = .Cells(nb_action, 7).End(xlUp)
'On boucle de i = 0 au nombre d'actions que l'on trouve en colonne G (en respectant le point d'attention ci-dessus).
For i = 0 To nb_action - oRng.Row + 1
'Si la valeur de la ligne (colonne G) est "En cours" alors...
If oRng.Offset(i, 0) = "En cours" Then
'... avec la feuille "Feuil1"...
With Worksheets("Feuil1")
'... on set oDest comme étant la cellule de dessous de la dernière cellule non-vide (de la colonne A)
Set oDest = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
'Et on place sur les colonnes A à G de la feuille "Feuil1" les valeurs A à G de la feuille "UPCAPO"
oDest.Resize(1, 7).Value = Range(oRng.Offset(i, -6), oRng.Offset(i, 0)).Value
'On place en colonne H la date du jour + 20 jours ouvrés.
oDest.Offset(0, 7) = WorksheetFunction.WorkDay(Date, 20, Range("Jours_fériés"))
End With
End If
Next i
End With
End Sub |
Partager