Microsoft 365 Insérer des lignes dans un tableau en décalant celles du dessous

Léraud Florian

XLDnaute Junior
Bonjour Bonjour =)

J'aimerai savoir s'il est possible de copier des cellules d'un tableau pour ensuite les coller en dessous mais en décalant les lignes situées au dessous.

J'aimerai copier les cellules comprises entre F11 et F15 et les coller juste en dessous avec une ligne d'écart et en gardant les lignes inférieures. J'arrive à les copier et coller avec le code ci-dessous mais il écrase les informations du dessous :/

VB:
Sub copie_decal()

Dim i As Integer
Dim A As String

Dim plage As Range, nb_copie As Long
A = MsgBox("Voulez-vous saisir un nouveau chantier ?", vbYesNo + vbQuestion)
If A = vbYes Then
nb_copie = 1
Set plage = Range("F11:F16")
For i = 1 To nb_copie
    plage.Copy plage.Offset(plage.Rows.Count * i, 0)
    Cells(plage.Rows.Count * (i + 1) + i, 1).Value = Cells(plage.Rows.Count, 1)
Next i
End If
End Sub

PS : je sais que mes lignes de codes pourraient en faire vomir certains car très lourdes ^^

Mon fichier en PJ

Merci d'avance =)
 

Pièces jointes

  • Planning avancé.xlsm
    494.6 KB · Affichages: 15
Solution
Hello @Phil69970

je me permet de reprendre ta macro telle quelle pour l'intégrer dans le fichier ci joint
@Léraud Florian
j'ai aussi mis le code de ta fonction "copie décal" pour insérer les lignes dans ton tableau
comme il s'agit d'un tableau struturé, j'en ai profité pour corriger le code de l'évènement change de la feuille 2022 pour que Vacances soit toujours mis à la dernière ligne

Léraud Florian

XLDnaute Junior
toutes les macros 'identiques" dans le code des différentes feuilles peuvent etre supprimées et remplacées par ce code unique dans le code du "ThisWorkbook"
Merci de ton remarquable travail qui me fait gagner énormément de place ^^

Petite question, qu'est ce qu'est vraiment le "ThisWorkbook"
J'ai trouvé ça mais ça ne m'aide pas beaucoup ^^ : Renvoie un objet Workbook qui représente le workbook dans lequel le code de macro actuel est en cours d’exécution. En lecture seule.

Reedit : Problème résolu, cela venait de moi ^^

Cependant, j'ai un petit soucis, il me met incompatibilité de type avec ligne lorsqu'on lance la macro pour savoir si c'est une semaine de vacance et qu'on clique sur non :

1657020798916.png
 
Dernière édition:

Léraud Florian

XLDnaute Junior
une remarque.. on est d'accord que le jour où un salarié part (julien par exemple) et qu'il est remplacé par stéphane.. plus aucune de tes macros congés ne fonctionne...
je pense qu'une modification profonde de tes macros est indispensable
Oui effectivement, tu as tout à fait raison, c'est l'un des soucis.
Mais je voulais déjà faire un brouillon 'fait maison' afin d'avoir au moins l'idée globale 🙂
 

vgendron

XLDnaute Barbatruc
je n'ai pas encore revu la formule, mais j'ai simplifié les macros de saisie de congés et reset congés
==> j'ai supprimé tous les modules qui sont devenus inutiles
il faut que tu réaffectes TOUS tes boutons à ces deux macro (je l'ai fait pour les mois de janvier et février pour le test)

principe:
selon le bouton sur lequel tu cliques, la macro récupère (dans le texte du bouton) le numéro de la semaine
et donc. trouve le numéro de ligne à traiter
selon le salarié, la macro trouve quelle colonne il occupe

ensuite. y a plus qu'à mettre les infos souhaitées

idem pour la macro reset: selon le texte du bouton, elle trouve sur quelles lignes il faut intervenir
je te laisse regarder le code: j'y ai mis des commentaires
 

Pièces jointes

  • Planning avancé.xlsm
    269.6 KB · Affichages: 8

vgendron

XLDnaute Barbatruc
Cependant, j'ai un petit soucis, il me met incompatibilité de type avec ligne lorsqu'on lance la macro pour savoir si c'est une semaine de vacance et qu'on clique sur non :

oui j'ai vu le problème aussi, c'est quand tu cliques sur la colonne A==> target.offset(0,-1) n'existe pas. donc. il aime pas
j'ai corrigé dans la version que je viens de poster
 

Léraud Florian

XLDnaute Junior
je n'ai pas encore revu la formule, mais j'ai simplifié les macros de saisie de congés et reset congés
==> j'ai supprimé tous les modules qui sont devenus inutiles
il faut que tu réaffectes TOUS tes boutons à ces deux macro (je l'ai fait pour les mois de janvier et février pour le test)
Je vais le redire encore une fois mais....merci beaucoup pour tout cela, c'est vraiment sympas de prendre votre temps pour regarder mon programme 😁

J'ai réaffecté toutes les macros et cela marche nickel 👍

Je t'avoue que (même avec les commentaires très bien détaillés d'ailleurs 😉) je ne comprends pas tout 😅 fin du moins je n'aurai jamais eu l'idée de faire comme cela ^^

Merci à vous !
 

Léraud Florian

XLDnaute Junior
oui j'ai vu le problème aussi, c'est quand tu cliques sur la colonne A==> target.offset(0,-1) n'existe pas. donc. il aime pas
j'ai corrigé dans la version que je viens de poster
J'ai essayé de rajouter votre nouveau code dans le "ThisWorkbook" mais je ne peux plus sélectionner les cases concernées (en fait il ne m'affiche plus le msgbox).

Si j'enlève les deux lignes :

VB:
If Target.Count > 1 Then Exit Sub
If Target.Column = 1 Then Exit Sub

Cela marche mais on reviens on au même problème que précédemment =/

Est-ce votre cas aussi ?

Merci d'avance =)
 

vgendron

XLDnaute Barbatruc
Si j'enlève les deux lignes :

le problème vient de la cellule fusionnée qui contient le numéro de semaine: elle est considérée comme une plage de 9 colonnes..donc le code n'est pas executé

remplace le code par celui ci

VB:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

If Range("B" & Target.Row) <> "Semaine" Then Exit Sub
Application.EnableEvents = False
ligne = Target.Row
colonne = 3
A = MsgBox("Est-ce une semaine de vacances ?", vbYesNo, "Vacances")
            
If A = vbYes Then

    Cells(ligne + 6, colonne).Resize(1, 9) = 0
    Cells(ligne + 23, colonne) = 7
Else
    formule = "=MAX(0,C" & ligne + 3 & "-$C$" & ligne + 23 & "*8-C" & ligne + 5 & "*8)"
    Cells(ligne + 6, colonne).Resize(1, 9).Formula = formule
    
    Do
        B = InputBox("Combien de four fériés (entre 0 et5) ?", vbQuestion)
        
        If B = "" Then B = -1
        If Not IsNumeric(B) Then B = -1
        
    Loop Until CDbl(B) >= 0 And CDbl(B) <= 5
    
    Range("C" & ligne + 23) = CDbl(B)
    
End If

Application.EnableEvents = True
End Sub
 

vgendron

XLDnaute Barbatruc
pour le fun, une V3 qui permet la saisie des congés via un formulaire
pour le lancer: bouton "Sasie de congés via formulaire" sur la feuille 2022

cela m'a permis de voir un problème dans tes feuilles
tes semaines ne sont pas forcément sur la bonne feuille
exemple de la semaine 5: cette année, elle a commencé le 31 Janvier==> elle appartient donc au mois de janvier

la règle que j'ai utilisée: la semaine 1 de l'année commence au 1er lundi de l'année
ex en 2022: 1 et 2 janvier étaient des samedi et dimanche
le 1er lundi de l'année est le 03/01/2022==> la semaine 1 est donc du 03 au 09 janvier, semaine 2: 10 au 16.....
 

Pièces jointes

  • Planning avancé V3.xlsm
    287.1 KB · Affichages: 5

vgendron

XLDnaute Barbatruc
en V4, avec la dernière macro qui restait à simplifier

question:
la macro "copie_decal" te sert à insérer des lignes dans le tableua de la feuille 2022

mais du coup.. ca te sert à quoi? pour une meme semaine, tu peux avoir plusieurs chantiers?

la macro Chantier tu permet d'ajouter un chantier sur une semaine : MAIS
1) elle ne vérifie pas si tu n'est pas en train d'écraser un chantier existant
2) elle ne permet de mettre un chantier QUE sur les premières lignes (11 à 15)
du coup ca te sert à quoi d'insérer des lignes (avec la macro copie_decal) si tu ne peux jamais y mettre de chantier??==> je m'attend à ce que tu nous dises que tu aimerais pouvoir enregistrer un chantier sur ces nouvelles lignes==> à quelles conditions?

la macro ResetChantier: de la même manière que pour la macro précédente, tu ne peux effacer QUE sur les lignes 11 à 15
 

Pièces jointes

  • Planning avancé V4.xlsm
    281.3 KB · Affichages: 10

Léraud Florian

XLDnaute Junior
pour le fun, une V3 qui permet la saisie des congés via un formulaire
pour le lancer: bouton "Sasie de congés via formulaire" sur la feuille 2022

cela m'a permis de voir un problème dans tes feuilles
tes semaines ne sont pas forcément sur la bonne feuille
exemple de la semaine 5: cette année, elle a commencé le 31 Janvier==> elle appartient donc au mois de janvier

la règle que j'ai utilisée: la semaine 1 de l'année commence au 1er lundi de l'année
ex en 2022: 1 et 2 janvier étaient des samedi et dimanche
le 1er lundi de l'année est le 03/01/2022==> la semaine 1 est donc du 03 au 09 janvier, semaine 2: 10 au 16.....
Oui je m'en suis rendu compte une fois fini 😅

En soit cela n'a pas d'importance sur le résultat final puisque les colonnes "Semaines" dans le tableau de la feuille "2022" peuvent être modifiés mais c'est vrai que pour les autres années, il faudra que je fasse plus attention =)

Merci pour tes nombreuses versions toujours aussi plaisantes à utiliser 😁
 

Léraud Florian

XLDnaute Junior
en V4, avec la dernière macro qui restait à simplifier

question:
la macro "copie_decal" te sert à insérer des lignes dans le tableua de la feuille 2022

mais du coup.. ca te sert à quoi? pour une meme semaine, tu peux avoir plusieurs chantiers?

la macro Chantier tu permet d'ajouter un chantier sur une semaine : MAIS
1) elle ne vérifie pas si tu n'est pas en train d'écraser un chantier existant
2) elle ne permet de mettre un chantier QUE sur les premières lignes (11 à 15)
du coup ca te sert à quoi d'insérer des lignes (avec la macro copie_decal) si tu ne peux jamais y mettre de chantier??==> je m'attend à ce que tu nous dises que tu aimerais pouvoir enregistrer un chantier sur ces nouvelles lignes==> à quelles conditions?

la macro ResetChantier: de la même manière que pour la macro précédente, tu ne peux effacer QUE sur les lignes 11 à 15
Effectivement, c'est le cas ^^ lorsque je demande un nouveau chantier, j'ai repris ton code de décalage de ligne et j'ai inséré celui de chantier dedans afin de pouvoir rentrer les informations du nouveau chantier.

VB:
Sub copie_decal()

Application.ScreenUpdating = False
Application.EnableEvents = False

Dim Tablo As ListObject

Dim A As String, B As String, D As String, Semaine As String, Chantier As String

With Sheets("2022") 'dans la feuille 2022

    A = MsgBox("Voulez-vouis saisir un nouveau chantier ?", vbYesNo + vbQuestion)

    If A = vbNo Then
        Close A
    Else
    
Set Tablo = ActiveSheet.ListObjects(1)
With Tablo
    lastCol = .ListColumns.Count
    LastLine = .ListRows.Count
    PointInsertion = LastLine - 4
    For i = 1 To 6
        .ListRows.Add PointInsertion
    Next i
    .Range(7, 1).Resize(5, 1).Copy Destination:=.Range(PointInsertion + 1, 1)
    DebFor = 11
    finfor = PointInsertion + 9
    formule = "=MAX(0,G6-sumif($F$11:$F$" & finfor & ",SUBSTITUTE([@Semaines],""restantes "","""") &""sur chantier"",G$11:G$" & finfor & "))"
    LastLine = .ListRows.Count
    .Range(LastLine - 3, 2).Resize(4, lastCol - 1).Formula = formule
    
    
     B = InputBox("Quel est le chantier ?", "Nom du chantier", "Nom du chantier")
      
        If B = "Nom du chantier" Or B = " " Or B = "" Then
            MsgBox "Veuillez entrez un nom de chantier", vbExclamation
        Else
            Semaine = InputBox("Quelle est la semaine concernée ?", vbOKCancel)
          
            If Semaine < 0 Or Semaine > 52 Then
                MsgBox "Veuillez entrer un nombre entre 1 et 52", vbExclamation
            Else
                BE = InputBox("Combien de temps de travail au BE ?", vbOKCancel)
                Fab = InputBox("Combien de temps de travail pour la fabrication ?", vbOKCancel)
                Fini = InputBox("Combien de temps de travail pour la finition ?", vbOKCancel)
                Pose = InputBox("Combien de temps de travail pour la pose ?", vbOKCancel)
              
                Cells(finfor - 4, Semaine + 6) = "- " & B       '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(finfor - 3, Semaine + 6) = BE             '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(finfor - 2, Semaine + 6) = Fab            '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(finfor - 1, Semaine + 6) = Fini           '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(finfor, Semaine + 6) = Pose            '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                AutoColumnLength Cells(finfor - 4, Semaine + 6) '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                MsgBox "Le chantier " & B & " est crée", vbInformation, "Nom du chantier"
                End If
                End If
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End If
End With
End Sub
 

Discussions similaires

Réponses
12
Affichages
537