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
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
 

Léraud Florian

XLDnaute Junior
Rebonjour à vous =)

Je n'avais pas remarqué hier mais j'ai un petit soucis avec le programme :/ En fait il ne me prend pas en compte la ligne "Heures pose / Semaine sur chantier" dans le calcul final.

Par exemple, si j'ai 8 de pose, il ne me les déduis pas du total. Je pense que cela vient des lignes de codes ci-dessous mais après avoir essayé de modifier les lignes, cela ne marche toujours pas 😅

VB:
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

Est-ce que vous auriez une idée ?

Merci d'avance =)
 

Léraud Florian

XLDnaute Junior
Hello
le pb ne vient pas du code, mais de la syntaxe de tes entetes de lignes et donc de la formule

les 5 derniières lignes, sont écrites avec la structure:
"Heures XX restantes / Semaine " ==> avec un espace à la fin après Semaine: SAUF sur la dernière ligne
les 5 lignes "insérées" sont écrites avec la structure:
"Heures XX / Semaine sur chantier"

la formule utilisée compare les intitulés pour savoir s'il faut prendre la valeur de la colone en compte
pour ca, la formule remplace "restantes " par "" et ajoute "sur chantier" sur les 5 dernières lignes


la présence ou absence d'un espace sur une des lignes fait que la formule conclue qu'il s"agit de deux lignes différentes
"Heures pose restantes / Semaine" (pas d'espace à la fin) est transformée en
"Heures pose / Semainesur chantier" ==>manque un espace
pour etre comparée à "Heures pose / Semaine sur chantier" ==> la c'est KO:
pS: je te fais grace du s manquant à restantes

alors que "Heures BE restantes / Semaine " (avec un espace à la fin) est transformée en
"Heures BE / Semaine sur chantier" pour etre comparée à "Heures BE / Semaine sur chantier"==> OK

pour résumer: tu as un espace manquant en fin de cellule G20

mais comme je n'ai jamais compris l'interet de mettre des espaces en fin de chaine, je traite le pb à l'envers. en enlevant tous les espaces de fin de cellules dans les lignes 17 à 19, et j'ai modifié la formule

donc;. en PJ, le pb est corrigé
Ah d'accord, je ne comprenais pas ce que faisait cette ligne de code mais après ton explication, je comprends mieux 😁. Je ne savais pas que c'était de cette façon que les entêtes étaient comparés.

Je ne pensais pas qu'un espace pouvait faire autant de dégât ^^ mais oui, l'espace prend de "l'espace" (sans mauvais jeu de mot) et donc il faut bien le prendre en compte.

Merci de votre aide et pour vos explications 🙂
 

Léraud Florian

XLDnaute Junior
Bonjour à tous,

Désolé de revenir encore et encore 😅

Tout fonctionne comme je le veux mais juste un petit détail qui me gêne. Lorsqu'on met un "0" pour une seule cellule (ex: I9), le mot "vacances" apparait alors que ce n'est pas une semaine de vacance.

VB:
Nombre = Application.WorksheetFunction.CountIf(.Range(2, j).Resize(5, 1), 0)

Je ne comprends pas pourquoi sachant que cette ligne compte le nombre de 0 des cellules comprises entre G et BF des lignes 6 à 9 (il faut 4 "0" pour que "vacances" apparait et non 1 seul).

Je sais pas si j'ai été très clair ^^

Merci d'avance =)
 

Léraud Florian

XLDnaute Junior
bonjour

dans le code, Nombre est bien le nombre de 0 sur les 4 lignes..==> ca peut donc etre 0 1 2 3 ou 4

la ligne du dessous qui met le mot vacances regarde si Nombre<>0==> pour 1 2 3 et 4 le mot vacances est mis

si tu ne veux vacances QUE pour le cas ou il y a 4 fois 0.. il faut corriger la ligne par
VB:
.Range(LastLine + 1, j) = IIf(Nombre = 4, "Vacances", "")

Super c'est bon merci à toi 😁
 

Discussions similaires

Statistiques des forums

Discussions
312 370
Messages
2 087 678
Membres
103 635
dernier inscrit
aime nguessanj