Insertion de lignes dans un tableau en tenant compte des semaines

Bonjour

Pour vos dates, il faut aussi vérifier le format de date dans les paramètres windows.

- Nom définitif du 1er onglet : Prévisionnel 2024
- Uniquement 2 feuilles, la seconde étant : Calendrier

Sur cette base, voici le code pour compléter les infos dans les colonnes X et suivantes :
- Faites un click droite sur l'onglet Previsionnel
- Choisir l'option "visualiser le code"
- Collez le code ci-dessous dans la fenêtre

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim coul
Dim ref As String
Dim i As Integer

If Target.Count > 1 Or Target.Row <= 4 Then Exit Sub

If Not Intersect(Target, Range("Q" & Target.Row & ":V" & Target.Row)) Is Nothing Then

    With Range(Cells(Target.Row, 24), Cells(Target.Row, 500))
        .ClearContents
        .Interior.Color = xlNone
        .UnMerge
    End With

    If WorksheetFunction.CountA(Range("Q" & Target.Row & ":V" & Target.Row)) = 6 Then

        coul = Range("B" & Target.Row).Interior.Color
        ref = Range("D" & Target.Row).Value & " - " & Range("F" & Target.Row).Value & " - " & Format(Range("V" & Target.Row), "dd/mm")

        For i = 1 To Range("T" & Target.Row) / 0.5
            Cells(Target.Row, i + 23).Interior.Color = coul
        Next i

        Cells(Target.Row, 24) = ref
        With Range(Cells(Target.Row, 24), Cells(Target.Row, i + 22))
            .Merge
            .HorizontalAlignment = xlCenter
        End With
    End If
End If
End Sub

Une fois fait, les infos et couleur seront adaptées en fonction de vos changements entre les colonnes Q et V
Conditions : toutes les cellules entre les colonnes entre Q et V doivent être complétées

Faites quelques tests

Crdlt

C'est pas mal du tout !

Problème sur :

  ref = Range("D" & Target.Row).Value & " - " & Range("F" & Target.Row).Value & " - " & Format(Range("V" & Target.Row), "dd/mm")

Je dois prendre les infos de la colonne C et non D.
De plus, uniquement les 4 derniers caractères
Exemple : 2024_05_548 => 548 uniquement

J'ai insérer d'autre lignes mais le tri ne se répercute pas sur les autres colonnes à partir de X
Obligé de réactualiser chaque lignes en modifiant une info sur les colonnes Q à V

Est-il possible d'effectuer une actualisation globale automatiquement ?

Je dois prendre les infos de la colonne C et non D.

Oups ok. remplacez la ligne par celle ci-dessous (attention il vous faudra toujours avoir 3 chiffres à la fin des données en colonne C)

ref = Right(Range("C" & Target.Row).Value, 3) & " - " & Range("F" & Target.Row).Value & " - " & Format(Range("V" & Target.Row), "dd/mm")

J'ai insérer d'autre lignes mais le tri ne se répercute pas sur les autres colonnes à partir de X
Obligé de réactualiser chaque lignes en modifiant une info sur les colonnes Q à V

Une solution simple serait d'éviter la colonne vide W. Soit vous la supprimeriez ou vous mettez une info en W2 et w3 par exemple
Qu'en pensez-vous ?

Bonjour Dan,

Code intégré, par contre il est vrai qu'il est possible d'avoir plus de 3 chiffres.
Peut-on modifier le code en demandant de prendre les chiffres après le dernier tiré : "_"

J'ai supprimé la colonne vide. Le J 0,5 commence à la colonne W désormais.
Je suppose qu'il faut faire évoluer le code, je change 24 par 23 uniquement ?

Merci

Bonjour Laurent

Oui, 24 par 23 et les 23 par 22

Face à votre dernier post, il est préférable que je vous donne le code complet. Remplacez ce que je vus ai donné par celui ci-dessous
J'ai crée 3 variables refdem, refpart et refdate pour définir la variable ref vu la longueur de l'instruction pour refdem qui doit reprendre le numéro de demande
Je pense que ce sera plus clair à lire pour vous

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim coul
Dim ref As String, refdem As String, refpart As String, refdate As String
Dim i As Integer

If Target.Count > 1 Or Target.Row <= 4 Then Exit Sub

If Not Intersect(Target, Range("Q" & Target.Row & ":V" & Target.Row)) Is Nothing Then

    With Range(Cells(Target.Row, 23), Cells(Target.Row, 500))
        .ClearContents
        .Interior.Color = xlNone
        .UnMerge
    End With

    If WorksheetFunction.CountA(Range("Q" & Target.Row & ":V" & Target.Row)) = 6 Then

        coul = Range("B" & Target.Row).Interior.Color
        refdem = Right(Range("C" & Target.Row).Value, Len(Range("C" & Target.Row).Value) - InStrRev(Range("C" & Target.Row).Value, "_")) 'ref essai
        refpart = Range("F" & Target.Row).Value 'ref piece
        refdate = Format(Range("V" & Target.Row), "dd/mm") 'refdate

        ref = refdem & " - " & refpart & " - " & refdate

        For i = 1 To Range("T" & Target.Row).Value / 0.5
            Cells(Target.Row, i + 22).Interior.Color = coul
        Next i

        Cells(Target.Row, 23).Value = ref
        With Range(Cells(Target.Row, 23), Cells(Target.Row, i + 21))
            .Merge
            .HorizontalAlignment = xlCenter
        End With
    End If
End If
End Sub

Faites un test.

Sinon je trouve que votre fichier est bien pensé et bien présenté !

Cordialement

NB : si terminé pensez à

Merci Dan,

Si j'insère plusieurs lignes, il me réactualise pas les lignes existantes.
Je suis obligé de réactualiser ligne par ligne pour les mettre à jour. C'est plutôt problématique

capture

Si j'insère plusieurs lignes, il me réactualise pas les lignes existantes

Ok mais je ne sais pas comment fonctionnez. Là j'ai supposé que vous ajoutiez ligne par ligne. Vous copiez d'un autre tableau ?
Expliquez-moi ce que vous faites lorsque vous écrivez "plusieurs lignes" parce que au vu de votre userform vous n'ajoutez que ligne par ligne
Ensuite il vous faut compléter entre Q et V ligne par ligne aussi je suppose

Les personnes ajoutent une ligne ou plusieurs lignes à la fois.
Elles peuvent être planifiées longtemps à l'avance comme elles peuvent être insérées durant la semaine en cours.
C'est pour cela que je souhaitais avoir un tri automatique des semaines.

Ce tri s'effectue parfaitement, mais la partie qui commence de la colonne W n'est plus associée avec la ligne concernée (ex : capture d'écran précédent message).
Elle reste au même endroit alors que le tri a décalé la ligne auparavant renseignée.
A chaque fois, il faut que je retourne sur chaque ligne dans une des cellules entre Q et V puis entrer dans une cellule et appuyer sur entrée pour actualiser.

N'est-il pas possible de faire une réactualisation auto comme pour le tri et après celui-ci en simulant une entrée dans une cellule (ex: en R) puis faire "entrée" ou tout simplement recopier la cellule sur elle même et pour chaque ligne créées ?

Il est peut-être bien pensé, mais il y a encore des axes d'améliorations.
Malheureusement, j'ai des idées mais pas les connaissances en VBA (la formation est demandée)

Pour info : chaque ligne = un rapport
Une fois le rapport terminé, la ligne concernée est systématiquement masquée pour ce retrouver plus facilement

Ce tri s'effectue parfaitement, mais la partie qui commence de la colonne W n'est plus associée avec la ligne concernée (ex : capture d'écran précédent message).
Elle reste au même endroit alors que le tri a décalé la ligne auparavant renseignée.
A chaque fois, il faut que je retourne sur chaque ligne dans une des cellules entre Q et V puis entrer dans une cellule et appuyer sur entrée pour actualiser.

Lorsque je vous ai proposé de supprimer la colonne W c'était justement pour que la fonction Tri prennent automatiquement toutes les colonnes.
Donc là quelle est la sélection que vous faites en cas de tri ?
Si vous ne prenez pas les colonnes W et suivantes dans votre tri, alors la suppression de la colonne vide W ne servait à rien.

N'est-il pas possible de faire une réactualisation auto comme pour le tri et après celui-ci en simulant une entrée dans une cellule (ex: en R) puis faire "entrée" ou tout simplement recopier la cellule sur elle même et pour chaque ligne créées ?

Si vous faites un double click puis entrée dans une des colonnes Q à V (c'est comme si vous recopiez la cellule sur elle-même) et là le code va s'exécuter. Mais faire une simulation après un tri, non

J'avais bien compris que de supprimer la colonne vide W était pour que l'ensemble des colonnes de la feuille suivent le tri effectué par la colonne Semaine.
Malheureusement ce n'est pas le cas ou alors c'est peut-être moi qui est raté un codage ou autre

Sur le tableau de l'année 2023 (sans macro et sans VBA) je suis à 750 rapports environ.
Il fallait que je trouve une solution pour automatiser celui de 2024 car c'est plus possible de continuer manuellement d'autant que nous avons augmenter en effectif vu la quantité de rapports futurs.

Je me vois pas taper ligne par ligne et faire des doubles clic pour actualiser les informations qui démarrent de la colonne W.
D'autant que les informations rentrées sont effectuées par différentes personnes et que je ne suis pas systématiquement prévenu de ce qui est rentrée au fur et à mesure

Je me vois pas taper ligne par ligne et faire des doubles clic pour actualiser les informations qui démarrent de la colonne W.

Ok je comprends très bien le souci. Dans ce cas, on peut d'une part laisser le code actuel en place et faire un autre qui serait activé par un bouton sur votre feuille

Ce deuxième code ferait en gros presque identique à celui que vous avez actuellement à la différence qu'il agirait sur toutes les lignes du tableau des colonnes W et suivante.

Votre avis ?

Si ok, on pourrait aussi remettre la colonne W vide comme vous l'aviez avant si vous voulez

On conserve la colonne W avec J-0.5

Votre proposition est intéressante. De toute manière, c'est moi qui indique systématiquement les renseignements dans les colonnes allant de Q à V.

Votre proposition est intéressante. De toute manière, c'est moi qui indique systématiquement les renseignements dans les colonnes allant de Q à V.

Ok.

- allez dans VBA
- dans le menu Insertion, choisissez "Insérer un module"
- collez le code ci-dessous

Option explicit
Sub planning()
Dim coul
Dim ref As String, refdem As String, refpart As String, refdate As String
Dim i As Integer, j As Integer

For i = 5 To Cells(Rows.Count, 2).End(xlUp).Row
    With Range(Cells(i, 23), Cells(i, 500))
        .ClearContents
        .Interior.Color = xlNone
        .UnMerge
    End With

    If WorksheetFunction.CountA(Range("Q" & i & ":V" & i)) = 6 Then
        coul = Range("B" & i).Interior.Color

        refdem = Right(Range("C" & i).Value, Len(Range("C" & i).Value) - InStrRev(Range("C" & i).Value, "_")) 'ref essai
        refpart = Range("F" & i).Value 'ref piece
        refdate = Format(Range("V" & i), "dd/mm") 'refdate

        ref = refdem & " - " & refpart & " - " & refdate
        For j = 1 To Range("T" & i) / 0.5
            Cells(i, j + 22).Interior.Color = coul
        Next j

        Cells(i, 23) = ref
        With Range(Cells(i, 23), Cells(i, j + 21))
            .Merge
            .HorizontalAlignment = xlCenter
        End With
    End If
Next i
End sub

- associez ce code à votre nouveau bouton
Les deux codes se ressemblent mais en fonction de votre utilisation le mieux est d'en faire deux séparés.
Si besoin, on pourrait aussi mettre le code de votre feuille Provisio. dans le module. A voir si vous voyez un intérêt ou pas

Au final avec les deux code vous aurez le choix d'actualiser une ligne sur changement entre colonne Q et V ou la totalité de la feuille en cliquant sur le bouton

Bonjour,

Cela fonctionne

Les utilisateurs insèrent des lignes, ce qui déprotège et reprotège : OK
De mon côté, si je veux effectuer la macro "mise à jour", je suis obligé de déprotéger sinon "erreur d'exécution 1004".
Donc pour remplir les colonnes de Q à V je déprotège : Pas de souci, c'est normal
Par contre, est-il possible de reprotéger la feuille automatiquement une fois la macro de mise à jour effectuée.
J'ai essayé d'intégrer ceci dans le code de la macro 2 mais ne vois pas à quel niveau l'inclure
'Protéger la feuille
Feuil1.Protect

Une autre info,
Si après quelques temps, une personne décide de changer la semaine d'un contrôle (colonne B) alors que la ligne est déjà intégrée.
Dans ce cas, il peux changer directement le n° de la semaine, par contre, je n'ai pas le moyen de rééffectuer le tri directement.
Il l'effectuera seulement à la prochaine création de ligne

Peut-on utiliser la dernière macro créée "mise à jour "pour effectuer le tri sur la totalité des lignes ?

Merci

Bonjour

Par contre, est-il possible de reprotéger la feuille automatiquement une fois la macro de mise à jour effectuée.

Je ne vois pas de macro "mise à jour" dans votre fichier

Si après quelques temps, une personne décide de changer la semaine d'un contrôle (colonne B) alors que la ligne est déjà intégrée.
Dans ce cas, il peux changer directement le n° de la semaine, par contre, je n'ai pas le moyen de rééffectuer le tri directement.
Il l'effectuera seulement à la prochaine création de ligne

Là si c'est le cas il faut modifier le code mais cela veut aussi dire qu'à chaque changement que vous allez effectuez dans cette colonne, le code va s'exécuter...
A réfléchir mais pourquoi ne le faire avec l'USF ?

exemple : on ajoute un bouton Modifier qui va alimenter une combobox qui liste les numéros d'essai. En choisissant dans la liste on rapatrie toutes les infos de la ligne dans les textbox de l'USF. De là on permet d'uniquement changer le num de semaine

Dan,

"mise à jour" c'est le nom du nouveau bouton (nouveau module) que j'ai créé et associé à votre dernier code.

Si on peux le faire dans l'USF, ce n'est que mieux !

"mise à jour" c'est le nom du nouveau bouton (nouveau module) que j'ai créé et associé à votre dernier code.

Ok. Alors vous devez mettre au début du code juste avant le for i=5 ....--> Feuil1.unprotect
A la fin avant le END SUB, vous reprotégez --> Feuil1.protect

Si on peux le faire dans l'USF, ce n'est que mieux !

Ok. Vous êtes d'accord avec le concept de l'exemple ?

Bonjour Dan,

Parfait, cela fonctionne,

Ok. Vous êtes d'accord avec le concept de l'exemple ?

Parfaitement d'accord.
Merci

Bonjour,

Faites ceci :

1. Ajoutez un bouton Modification sur votre USF
2. Ajoutez une combobox en haut à droite (ou ailleurs si vous voulez)

Sur votre fichier l'usf ressemble à ceci

presse papier02

3. Pour ce faire remplacez tous les codes dans l'USF par ceux dans le fichier joint

16codes-usf.txt (3.89 Ko)

Pour l'explication,

- A l'ouverture de l'USF, la combobox n'est pas disponible.
- Si vous cliquez sur le bouton Modification :
--> cela rend toutes les Textbox indisponibles sauf la Boxsemaine
--> le nom du bouton Ajouter change pour "Modifier la ligne"
--> La combobox1 est chargée des rapports d'essais existants (colonne E) et vous permet de choisir celui pour lequel la semaine doit être modifiée
--> une fois le choix fait dans la combobox1, le code rapatrie tous les infos de la ligne dans les textbox

Il vous reste à changer le numéro de semaine dans la Boxsesemaine et valider par le bouton "Modifier la ligne"

Faites quelques tests

--> cela rend toutes les Textbox indisponibles sauf la Boxsemaine

Peut-on changer la colonne de la combobox car c'est la C (n° DEM) que nous avons besoin et non la E.

J'ai essayé de changer le code
en passant de ça :

    lig = WorksheetFunction.Match(ComboBox1.Value, .Range("E5:E" & Range("E" & Rows.Count).End(xlUp).Row).Value, 0) + 4

a ça:

    lig = WorksheetFunction.Match(ComboBox1.Value, .Range("C5:C" & Range("C" & Rows.Count).End(xlUp).Row).Value, 0) + 4

Mais aucun changement

1er pt : Sinon, j'ai fais un essai, il duplique la ligne en intégrant le changement mais ne supprime pas l'ancienne ligne.

2ème pt : Lors d'une demande de modification, est-il possible d'avoir accès à l'ensemble des champs et pas qu'avoir la possibilité de changer la ligne "semaine" ?

3ème pt : Est-il possible que la combobox puisse faire apparaître uniquement les lignes non masqués sachant que les lignes masquées seront systématiquement celles dont la colonne A (Etat de la DEM) soit en "Annulée" soit en "Terminée" et donc plus la nécessité de les modifier (voir colonne R) ?

Sinon, le principe est pas mal du tout.

Rechercher des sujets similaires à "insertion lignes tableau tenant compte semaines"