Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Christian0258

XLDnaute Accro
Bonjour à tout le forum,

Je souhaiterais, à nouveau, votre aide pour adapter un code de job75.

Ce code fonctionne sur d'autres fichiers, mais je n'arrive pas à l'adapter à mon fichier...

voir fichier.

Merci pour le temps que vous voudrez bien vouloir m'accorder.
Bien amicalement,
Christian
 

Pièces jointes

  • Incrémenter feuille congés.xlsm
    25.4 KB · Affichages: 22

job75

XLDnaute Barbatruc
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Bonsoir Christian,

Si tu connais le fil où j'ai créé cette macro ça ne doit pas être bien difficile d'adapter.

Sinon pas envie de me casser la tête à la déchiffrer.

A+
 

job75

XLDnaute Barbatruc
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Bonjour Christian, le forum,

J'étais très occupé hier soir et ce matin, mais j'ai trouvé un peu de temps.

Le code de la feuille "Planning" :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [C13].CurrentRegion) Is Nothing Then Exit Sub
Dim a, fer As Range, numero&, nom$, F As Worksheet, P As Range, sup As Range, i&, t, ub%, n&, rest()
a = Array("CA", "RTT", "CA/HP", "CA/FR", "(CA)", "(RTT)", "(CA/HP)", "(CA/FR)") 'liste à adapter
Set fer = [Feries]
numero = Application.Max(Sheets("Congés").[A:A]) + 1 'nécessaire pour la MFC
nom = Target
Application.ScreenUpdating = False
Set F = Workbooks.Add.Sheets(1) 'nouveau document
F.Parent.Date1904 = ThisWorkbook.Date1904 'calendrier
F.[A1].Resize(, 31) = [F11].Resize(, 31).Value 'adapter éventuellement
F.[A2].Resize(, 31) = Target(16, 4).Resize(, 31).Value 'adapter éventuellement
Set P = F.UsedRange
'---suppression des week-ends et jours fériés---
Set sup = Nothing
For i = 1 To 31
  If Weekday(P(1, i), 2) > 5 Or Application.CountIf(fer, P(1, i)) _
    Then Set sup = Union(P(1, i), IIf(sup Is Nothing, P(1, i), sup))
Next i
If Not sup Is Nothing Then sup.EntireColumn.Delete
'---analyse des congés---
t = P.Value2 'matrice, plus rapide
ub = UBound(t, 2)
For i = 1 To ub
  If IsNumeric(Application.Match(t(2, i), a, 0)) Then
    n = n + 1
    ReDim Preserve rest(1 To 5, 1 To n)
    rest(1, n) = numero
    rest(2, n) = nom
    rest(3, n) = t(1, i)
    Do
      i = i + 1
      If i > ub Then Exit Do
    Loop While t(2, i) = t(2, i - 1)
    i = i - 1
    rest(4, n) = t(1, i)
    rest(5, n) = t(2, i)
  End If
Next i
F.Parent.Close False 'suppression du nouveau document
'---restitution---
If n Then
  With Sheets("Congés")
    i = .Range("A" & .Rows.Count).End(xlUp)(2).Row
    .Cells(i, 1).Resize(n, 5) = Application.Transpose(rest) 'maximum 65536 lignes
    .Cells(i, 6).Resize(n) = "=RC[-2]-RC[-3]+1"
    .Cells(i, 7).Resize(n) = "=NETWORKDAYS(RC[-4],RC[-3],Feries)"
    .Activate
  End With
End If
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Incrémenter feuille congés(1).xlsm
    31.6 KB · Affichages: 12

Christian0258

XLDnaute Accro
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Bonjour le forum, job75,

Je rentre, et je trouve ce travail de job75.

Que dire...un grand merci, pour ce gros et beau boulot....

Encore merci, salut l'artiste.

Bien à toi,
Christian
 

job75

XLDnaute Barbatruc
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Re,

C'est curieux que je n'y ai pas pensé sur l'autre fil.

Ceci est bien plus simple, plus besoin d'un document auxiliaire :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [C13].CurrentRegion) Is Nothing Then Exit Sub
Dim a, fer As Range, numero&, nom$, horaires, conges, i&, t(), ub%, n&, rest()
a = Array("CA", "RTT", "CA/HP", "CA/FR", "(CA)", "(RTT)", "(CA/HP)", "(CA/FR)") 'à adapter
Set fer = [Feries]
numero = Application.Max(Sheets("Congés").[A:A]) + 1 'nécessaire pour la MFC
nom = Target
horaires = [F11].Resize(, 31).Value2 'adapter éventuellement
conges = Target(16, 4).Resize(, 31) 'adapter éventuellement
'---tableau de base sans week-ends et jours fériés---
ub = 0
ReDim t(1 To 2, 1 To 31)
For i = 1 To 31
  If Weekday(horaires(1, i), 2) < 6 And Application.CountIf(fer, horaires(1, i)) = 0 _
    Then ub = ub + 1: t(1, ub) = horaires(1, i): t(2, ub) = conges(1, i)
Next i
'---analyse des congés---
For i = 1 To ub
  If IsNumeric(Application.Match(t(2, i), a, 0)) Then
    n = n + 1
    ReDim Preserve rest(1 To 5, 1 To n)
    rest(1, n) = numero
    rest(2, n) = nom
    rest(3, n) = t(1, i)
    Do
      i = i + 1
      If i > ub Then Exit Do
    Loop While t(2, i) = t(2, i - 1)
    i = i - 1
    rest(4, n) = t(1, i)
    rest(5, n) = t(2, i)
  End If
Next i
'---restitution---
If n Then
  With Sheets("Congés")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    i = .Range("A" & .Rows.Count).End(xlUp)(2).Row
    .Cells(i, 1).Resize(n, 5) = Application.Transpose(rest) 'maximum 65536 lignes
    .Cells(i, 6).Resize(n) = "=RC[-2]-RC[-3]+1"
    .Cells(i, 7).Resize(n) = "=NETWORKDAYS(RC[-4],RC[-3],Feries)"
    .Activate
  End With
End If
End Sub
Et le visuel est bien meilleur, pas de saut d'écran.

Edit : ajouté If .FilterMode Then .ShowAllData 'si la feuille est filtrée

Fichier (2).

A+
 

Pièces jointes

  • Incrémenter feuille congés(2).xlsm
    31.2 KB · Affichages: 13
Dernière édition:

Christian0258

XLDnaute Accro
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Re, le forum, job75,

Merci, job75, pour cette version encore plus affinée.

Dis moi, si je clique plusieurs fois sur le même nom, j'ai autant de fois les congés qui "s'empilent"....

Il peut être nécessaire de cliquer plusieurs fois sur un même nom (exemple pour une annulation ou un changement de dates de congés. Pour ces cas de figures, il serait bien d'écraser les précédentes données et non de les mettre à la suite...
Est-ce possible

Merci pour tout.
Bien à toi,
Christian
 

job75

XLDnaute Barbatruc
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Bonjour Christian,

Je ne pense pas que ce soit une bonne solution d'écraser un transfert de congés.

Alors qu'il suffit d'aller dans la feuille "Congés" pour supprimer toutes les lignes avec le même numéro.

C'est même pour cela que j'ai mis 2 couleurs pour la MFC.

Mais en effet il faut alors refaire une nouvelle numérotation avec cette macro dans la feuille "Congés" :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'renumérote la colonne A
If Intersect(Target, [A:A]) Is Nothing Or [A3] = "" Then Exit Sub
Dim P As Range, t(), i&, n&
If FilterMode Then ShowAllData
Set P = Range("A3", Range("A" & Rows.Count).End(xlUp))
ReDim t(1 To P.Rows.Count, 1 To 2) 'au moins 2 éléments
For i = 1 To UBound(t)
  If P(i) <> P(i - 1) Then n = n + 1
  t(i, 1) = n
Next
Application.EnableEvents = False: P = t: Application.EnableEvents = True
End Sub
Fichier (3).

Bonne journée.
 

Pièces jointes

  • Incrémenter feuille congés(3).xlsm
    34.7 KB · Affichages: 19

job75

XLDnaute Barbatruc
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Re,

Avec 2 boutons pour effacer :

Code:
Private Sub CommandButton1_Click() 'le dernier transfert
Application.EnableEvents = False
With Range("A3:A" & Rows.Count)
  .Replace Application.Max(.Cells), " "
  On Error Resume Next
  .SpecialCells(xlCellTypeConstants, 2).Resize(, 7).ClearContents
End With
Application.EnableEvents = True
End Sub

Private Sub CommandButton2_Click() 'tous les transferts
Range("A3:G" & Rows.Count).ClearContents
End Sub
Fichier (4).

A+
 

Pièces jointes

  • Incrémenter feuille congés(4).xlsm
    43.4 KB · Affichages: 13

Christian0258

XLDnaute Accro
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Re, le forum, job75,

Je n'avais pas fait attention, mais après plusieurs vérifs...les congés ne sont pas récupérés comme "prévu"...

voir explications fichier joint

Merci pour votre aide.
Bien amicalement,
Christian
 

Pièces jointes

  • Copie de Incrémenter feuille congés(5).xlsm
    39.3 KB · Affichages: 16

job75

XLDnaute Barbatruc
Re : Modifier cette macro pour incrémenter une feuille "Congés", macro de job75

Bonjour Christian,

En effet avec le Calendrier 1904 il faut faire une conversion pour le Weekday :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [C13].CurrentRegion) Is Nothing Then Exit Sub
Dim a, fer As Range, numero&, nom$, dates, conges, t(), i&, wd, ub%, n&, rest()
a = Array("CA", "RTT", "CA/HP", "CA/FR", "(CA)", "(RTT)", "(CA/HP)", "(CA/FR)") 'à adapter
Set fer = [Feries]
numero = Application.Max(Sheets("Congés").[A:A]) + 1 'nécessaire pour la MFC
nom = Target
dates = [F11].Resize(, 31).Value2 'adapter éventuellement
conges = Target(16, 4).Resize(, 31) 'adapter éventuellement
'---tableau de base sans week-ends et jours fériés---
ReDim t(1 To 2, 1 To 31)
For i = 1 To 31
  wd = Weekday(dates(1, i) + IIf(ThisWorkbook.Date1904, 1462, 0), 2)
  If wd < 6 And Application.CountIf(fer, dates(1, i)) = 0 _
    Then ub = ub + 1: t(1, ub) = dates(1, i): t(2, ub) = conges(1, i)
Next i
'---analyse des congés---
For i = 1 To ub
  If IsNumeric(Application.Match(Trim(t(2, i)), a, 0)) Then
    n = n + 1
    ReDim Preserve rest(1 To 5, 1 To n)
    rest(1, n) = numero
    rest(2, n) = nom
    rest(3, n) = t(1, i)
    Do
      i = i + 1
      If i > ub Then Exit Do
    Loop While t(2, i) = t(2, i - 1)
    i = i - 1
    rest(4, n) = t(1, i)
    rest(5, n) = t(2, i)
  End If
Next i
'---restitution---
If n Then
  With Sheets("Congés")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    i = .Range("A" & .Rows.Count).End(xlUp)(2).Row
    .Cells(i, 1).Resize(n, 5) = Application.Transpose(rest) 'maximum 65536 lignes
    .Cells(i, 6).Resize(n) = "=RC[-2]-RC[-3]+1"
    .Cells(i, 7).Resize(n) = "=NETWORKDAYS(RC[-4],RC[-3],Feries)"
    .Activate
  End With
End If
End Sub
Fichier (5).

A+
 

Pièces jointes

  • Incrémenter feuille congés(5).xlsm
    41.9 KB · Affichages: 23

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 210
Messages
2 107 299
Membres
109 796
dernier inscrit
aelgar