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

vgendron

XLDnaute Barbatruc
Hello

Effectivement.. tes macros sont très lourdes et pas du tout optimisées
exemple de la macro que lances à chaque fois que tu selectionnes une cellule dans la feuille "2022"
il vaudrait mieux lancer cette macro uniquement lorsqu'il y a un changement de valeur dans une cellule
ca donnerait cette macro simplifiée
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False 'on désactive le refresh
Application.EnableEvents = False 'on désactive les évènements.. sinon.. cettte macro sera appelée en boucle==> plantage
Application.Calculation = xlCalculationManual

With ActiveSheet 'dans la feuille active
    LastCol = .Cells(5, .Columns.Count).End(xlToLeft).Column 'dernière colonne non vide de la ligne 5
    For j = 7 To LastCol 'pour chaque colonne de G à LastCol
        Nombre = Application.WorksheetFunction.CountIf(.Cells(6, j).Resize(5, 1), 0) 'on compte le nombre de 0 sur les 5 lignes
        .Cells(21, j) = IIf(Nombre <> 0, "Vacances", "") 'on met vacances ou rien selon le résultat
        .Columns(j).AutoFit 'on ajuste la largeur de la colonne
    Next j
End With
Application.Calculation = xlCalculationAutomatic 'on réactive
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

en ce qui concerne ta question: c'est toujours sur la feuille "2022" ?
tu souhaites inserer 5 lignes dans le tableau ?
 

Léraud Florian

XLDnaute Junior
Bonjour et merci de votre réponse =)

J'ai pris note de votre conseil et j'ai créé une macro pour lancer l'actualisation de la feuille 2022.

Merci pour votre programme qui met beaucoup moins de temps ^^

Oui en fait je veux, dans la feuille 2022, pouvoir choisir un "nouveau chantier" et si oui, alors il copie les cellules F11 jusqu'à F15 en dessous afin de pouvoir rentrer un nouveau chantier.
 

Phil69970

XLDnaute Barbatruc
Bonjour @Léraud Florian , @vgendron

Dans la même idée d'optimisation

Tu peux remplacer toute ta macro "chantier" (Module 13) par :

VB:
Sub Chantier()
'Dim A$, B$, D$, Semaine$, Chantier$ '==> c'est équivalemnt à la ligne ci dessous
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
        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(11, Semaine + 6) = "- " & B       '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(12, Semaine + 6) = BE             '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(13, Semaine + 6) = Fab            '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(14, Semaine + 6) = Fini           '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                Cells(15, Semaine + 6) = Pose           '  + 6 car il y a 6 colonnes avant les colonnes des semaines
                AutoColumnLength Cells(11, 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 If
End With
End Sub

Avec nos 2 codes d'optimisation cela devient plus digeste.;)

Pour ta question il nous manque des précisions

@Phil69970
 

Léraud Florian

XLDnaute Junior
Bonjour Phil69970,

Ton programme est incroyable (enfin pour moi qui suis débutant ^^)

C'est mon PC et moi-même qui vous remercions pour cette optimisation 😁

Cells(11, Semaine + 6) = "- " & B ' + 6 car il y a 6 colonnes avant les colonnes des semaines
Cells(12, Semaine + 6) = BE ' + 6 car il y a 6 colonnes avant les colonnes des semaines
Cells(13, Semaine + 6) = Fab ' + 6 car il y a 6 colonnes avant les colonnes des semaines
Cells(14, Semaine + 6) = Fini ' + 6 car il y a 6 colonnes avant les colonnes des semaines
Cells(15, Semaine + 6) = Pose ' + 6 car il y a 6 colonnes avant les colonnes des semaines
AutoColumnLength Cells(11, Semaine + 6) ' + 6 car il y a 6 colonnes avant les colonnes des semaines

Si j'ai compris, on fait +6 parce que je commence la colonne Semaine à la colonne F ?

Merci encore pour ce travail de qualité 😉
 

Phil69970

XLDnaute Barbatruc
Le fil

Et tu peux remplacer toute ta macro "ResetChantier" (Module 13) par :
VB:
Sub ResetChantier()
Dim Semaine$
With Sheets("2022")
    Semaine = InputBox("Quelle semaine voulez-vous supprimer ?", vbOKCancel)
                   
    Cells(11, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(12, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(13, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(14, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(15, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines

End With

End Sub

Si j'ai compris, on fait +6 parce que je commence la colonne Semaine à la colonne F ?

Colonne 6 = Colonne F
Colonne 7 = Début des semaines
1657013700782.png


Si tu es à la semaine 1 par exemple tu es donc à la colonne 6 (F) + 1 (N° de la semaine choisi) donc colonne 7 ==> G

Est ce que je t'ai perdu ? 🤣

Ton fichier commence à devenir digeste ;)

@Phil69970
 

Léraud Florian

XLDnaute Junior
Pour les précisions à propos de ma question :

Je voudrai quelque chose comme le montre l'image ci-dessous :

1657013732210.png

Lorsqu'un chantier est déjà crée (ex : chantier "- p" de la semaine 1) mais que ce n'est pas le seul de la semaine, un msgbox apparait (si on clique sur la macro correspondante que je n'est pas encore crée) nous demandant si on veut rajouter un chantier
- Si oui, alors les cellules comprises entre F11et F15 sont dupliquées en bas (mais en décalant les cellules en dessous afin de ne pas les écraser)
-Si non, alors rien ne se passe

J'espère que ces petites précisions sont plus claires ^^

Merci à vous =)
 

vgendron

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

Pièces jointes

  • Planning avancé.xlsm
    478.3 KB · Affichages: 6

Léraud Florian

XLDnaute Junior
VB:
Sub ResetChantier()
Dim Semaine$
With Sheets("2022")
    Semaine = InputBox("Quelle semaine voulez-vous supprimer ?", vbOKCancel)
                  
    Cells(11, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(12, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(13, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(14, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines
    Cells(15, Semaine + 6).ClearContents    ' + 6 car il y a 6 colonnes avant les colonnes des semaines

End With

End Sub

C'est fou le gain de temps gagné 😙

Merci d'optimiser mon programme, c'est très gentil à vous et surtout très appréciable 😁

Colonne 6 = Colonne F
Colonne 7 = Début des semaines
Regarde la pièce jointe 1144430

Si tu es à la semaine 1 par exemple tu es donc à la colonne 6 (F) + 1 (N° de la semaine choisi) donc colonne 7 ==> G

Est ce que je t'ai perdu ? 🤣

Comment je peux me perdre avec autant de pédagogie ? 😋
Votre explication est très claire et vos lignes de codes vont m'être très utiles pour m'en inspirer par la suite 😉

Merci à vous
 

Phil69970

XLDnaute Barbatruc
Le fil

Il te restes à optimiser tes 12 modules identiques de 1000 lignes en un seul module d'une cinquantaine de lignes !!!!! 🤣
Idem pour tes MFC 🤣
Et les mises à jour de ton fichier vont devenir 100 fois plus rapide :oops:qu'avant et ton fichier va perdre 30 % de son volume voir plus surtout après nettoyage des MFC :oops:

1657014728909.png


@Phil69970
 

Léraud Florian

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

Super @vgendron, c'est exactement ce que je voulais 😄

En plus avec ton amélioration, c'est nettement plus agréable =)

Merci pour ton investissement 😉
 

Léraud Florian

XLDnaute Junior
Le fil

Il te restes à optimiser tes 12 modules identiques en un seul module d'une cinquantaine de lignes !!!!! 🤣
Idem pour tes MFC 🤣
Et les mises à jour de ton fichier vont devenir 100 fois plus rapide :oops:qu'avant et ton fichier va perdre 30 % de son volume voir plus surtout après nettoyage des MFC :oops:

Regarde la pièce jointe 1144433

@Phil69970

Alors je m'y met tout de suite ^^ avec la structure de vos codes je vais pouvoir optimiser tout cela =)

Merci beaucoup 😁
 

Léraud Florian

XLDnaute Junior
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
Et du coup les cellules rajoutées peuvent être prise en compte dans le total ?

Par exemple pour les "heures restantes du BE", si je rajoute un chantier, est ce que la formule peut s'adapter en prenant en compte ce nouveau chantier ?
 

vgendron

XLDnaute Barbatruc
Je regarde

en attendant, une autre optimisation
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"
VB:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Offset(0, -1) <> "Semaine" Then Exit Sub
Application.EnableEvents = False
ligne = Target.Row
Colonne = Target.Column
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
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
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 898
Messages
2 114 009
Membres
112 072
dernier inscrit
Onyx