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

vgendron

XLDnaute Barbatruc
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é
 

Pièces jointes

  • Planning avancé V4.xlsm
    283.1 KB · Affichages: 8

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

vgendron

XLDnaute Barbatruc
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", "")
 

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 104
Messages
2 085 335
Membres
102 865
dernier inscrit
FreyaSalander