XL 2016 calcul en colonne BS qui ne se met pas à jour

halecs93

XLDnaute Impliqué
Bonjour à tout le monde,

Je poursuis mon avancée (merci laurent950) dans la construction d'un planning.

En cliquant glissant sur une ligne quelconque, un userform s'affiche. On y entre du texte (texbox1) qui va, en cliquant sur le bouton de commande, s'afficher dans les cellules qui ont fusionné.

En colonne BS, le nombre de cellules qui ont été fusionné se transforment en heure(s).

Deux soucis que je n'arrive pas à résoudre :

1) sur une même ligne, si je fusionne deux plages différentes de cellules, le total en BS ne prend en compte que la dernière manipulation. Or, je voudrais que l'ensemble des cellules fusionnées sur cette ligne soit prise en compte.

2) en double cliquant sur des cellules précédement fusionnées, elle reviennent à leur état initial. Malheureusement, là encore la cellule en BS ne se met pas à jour.


Un grand merci
 

Pièces jointes

  • PLANNING exceldownloads.xlsm
    159.9 KB · Affichages: 6
Solution
Bonsoir @halecs93

Correctif ci-dessous :

Target.UnMerge = On défusionne puis on recompte.

VB:
Dim FormatageLigne5 As Variant ' Variable pour stocker le formatage de la ligne 5

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Then
        ' Vérifie si la sélection contient plus d'une cellule
        On Error Resume Next
        Dim isHorizontal As Boolean
        isHorizontal = False
   
        ' Vérifie si la sélection est horizontale
        If Target.Rows.Count = 1 Then
            isHorizontal = True
        End If
   
        ' Fusionne uniquement si la sélection est horizontale et dans la plage E:BQ
        If isHorizontal And Target.Column >= 5 And Target.Column <= 68 Then...

laurent950

XLDnaute Accro
Bonsoir @halecs93

Correctif ci-dessous :

Target.UnMerge = On défusionne puis on recompte.

VB:
Dim FormatageLigne5 As Variant ' Variable pour stocker le formatage de la ligne 5

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Then
        ' Vérifie si la sélection contient plus d'une cellule
        On Error Resume Next
        Dim isHorizontal As Boolean
        isHorizontal = False
   
        ' Vérifie si la sélection est horizontale
        If Target.Rows.Count = 1 Then
            isHorizontal = True
        End If
   
        ' Fusionne uniquement si la sélection est horizontale et dans la plage E:BQ
        If isHorizontal And Target.Column >= 5 And Target.Column <= 68 Then
            Target.Merge
       
            ' Ouvre UserForm1
            UserForm1.Show
        End If
   
        On Error GoTo 0
   
        Target.Value = UserForm1.TextBox1.Value
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = CLng(UserForm1.TextBox1.Tag) ' Rouge
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
   
        ' Centre le contenu en hauteur et en largeur
        With Target
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
   
'    Compte le nombre de cellules fusionnées dans la sélection
        CompteCellsFusionnéParLigne Range(Cells(Target.Row, 5), Cells(Target.Row, 69)), Target
       
        ' Sauvegarde le formatage de la ligne 5 lors de la première sélection
        If Target.Row = 5 Then
            FormatageLigne5 = Target.EntireRow.Cells(1).EntireRow.Copy
        End If
    End If
End Sub

Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' Cette macro se déclenche lorsque vous double-cliquez sur une cellule
 
    If Target.MergeCells And Target.Column >= 5 And Target.Column <= 68 Then
        ' Vérifie si la cellule est fusionnée et dans la plage E:BQ
        On Error Resume Next
     
        ' Rétablir l'alignement par défaut
        With Target
            .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlBottom
        End With
     
        Target.Interior.Color = xlNone
        Target.Value = Empty
       
        ' Stocker le formatage de la ligne 5 pour la plage fusionnée
        Dim FormatageLigne5 As Range
        Set FormatageLigne5 = Me.Cells(5, Target.Column).Resize(1, Target.Columns.Count)
     
        ' Appliquer le formatage de la ligne 5 à la plage fusionnée
        FormatageLigne5.Copy
        Target.PasteSpecial Paste:=xlPasteFormats
     
        Application.CutCopyMode = False ' Effacer le presse-papiers
     
        Target.UnMerge

'    Compte le nombre de cellules fusionnées dans la sélection
        CompteCellsFusionnéParLigne Range(Cells(Target.Row, 5), Cells(Target.Row, 69)), Target
       
        On Error GoTo 0
    End If
    ' Annuler le déclenchement du UserForm par défaut
    Cancel = True
End Sub

Private Sub CommandButton2_Click()
    Unload Me ' Fermer l'UserForm
End Sub

Sub CompteCellsFusionnéParLigne(ByVal Rng As Range, ByVal Target As Range)
        ' Compte le nombre de cellules fusionnées dans la sélection
        Dim MergedCount As Integer
        MergedCount = 0
   
        ' Parcourez les cellules de la colonne 5 à la colonne 69 de la ligne 411
            For Each Cell In Rng
                If Cell.MergeCells Then
                    ' Si la cellule est fusionnée, augmentez le compteur de 1
                        MergedCount = MergedCount + 1
                End If
            Next Cell
       
        ' Écrire le nombre d'heures dans la colonne BS
        If MergedCount > 0 Then
            Dim Hours As Double
            Hours = MergedCount * 15 / 60 ' Convertit les 15 minutes en heures (15/60)
       
            ' Insère le nombre d'heures sous forme décimale en divisant par 24
            Me.Cells(Target.Row, "BS").Value = Empty
            Me.Cells(Target.Row, "BS").Value = Hours / 24
        End If
End Sub

Je vous propose de notifié cette discussion à résolu ci celle-ci est correct.

Vous Pouvez Ouvrir deux discussion une pour chaque problème !
1 ) Il semble que la fermeture de l'userform ne fonctionne pas !
Bonton Fermer
2 ) puis la plage de la ligne 5 a 69 pour le calcul des horaires n'est pas bornée !
La colonne BQ est la colonne N°69 et pas 68
VB:
' Fusionne uniquement si la sélection est horizontale et dans la plage E:BQ
  La colonne BQ est la colonne N°69
        If isHorizontal And Target.Column >= 5 And Target.Column <= 68 Then
            Target.Merge
   
            ' Ouvre UserForm1
            UserForm1.Show
        End If
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 209
Messages
2 086 266
Membres
103 168
dernier inscrit
isidore33