Insertion ligne en VBA + Copier/Coller

Bonjour à tous,

Je rencontre un problème pour insérer une ligne en VBA et réaliser un copier coller...

Ci-après le code en question qui rencontre une erreur 1004 avec une notion de déplacement de cellules d'un tableau...

Sub CopierColler()

 Application.ScreenUpdating = False
    'Copier Coller Phase chantier

    Sheets("Planning Travaux").Activate
    Range("8:10").Copy
    Range("8:8").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

    '
    Range("A8").PasteSpecial Paste:=xlPasteFormat, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False
    Range("8:10").ClearContents
    Range("B8") = "NOM DU CHANTIER"
    Range("B9") = "Phase 1"
    Range("B10") = "Phase 2"
    Range("B8").Select
  Application.ScreenUpdating = True

End Sub

Mon code fonctionnait jusqu'à ce que je définisse une mise en forme de tableau. Cependant, je n'arrive pas à déceler en quoi et si c'est effectivement le probleme...

Pouvez vous m'éclairer?

Merci d'avance,

Rémi

Bonsoir Moka,

Si tu as fait une mise en forme de tableau, ça change tout

Essaye ça

Sub Test()
  Dim LigTab As Long, Ind As Integer
  ' Avec la feuilles concernée
  With ThisWorkbook.Sheets("Feuil1")
    ' Avec l'objet tableau concerné
    With .Range("Tableau 1")
      ' Boucle pour 3 lignes
      For Ind = 1 To 3
        ' Ajouter une ligne en fin de tableau
        .ListObject.ListRows.Add , AlwaysInsert:=True
        ' Récupérer le numéro de la dernière ligne vide
        LigTab = .End(xlDown).Offset(1, 0).Row
        ' Inscrire les éléments sleon l'indice
        If Ind = 1 Then
          Range("B" & LigTab) = "NOM DU CHANTIER"
        ElseIf Ind = 2 Then
          Range("B" & LigTab + 1) = "Phase 1"
        Else
          Range("B" & LigTab + 2) = "Phase 2"
        End If
      Next Ind
    End With
  End With
End Sub

A+

Bonjour BrunoM45,

Merci pour ton retour, j'ai bien pris en compte ta réponse pour laquelle je te remercie. J'avais commencé à bidouiller avec le .ListObject mais sans succès.

Apres adaptation pour coller à mon fichier, ton code devient :

Sub Test()
  Dim LigTab As Long, Ind As Integer
  ' Avec la feuilles concernée
  With ThisWorkbook.Sheets("Planning Travaux")
    ' Avec l'objet tableau concerné
    With .Range("Tableau1")
      ' Boucle pour 3 lignes
      For Ind = 1 To 3
        ' Ajouter une ligne en fin de tableau
        .ListObject.ListRows.Add , AlwaysInsert:=True
        ' Récupérer le numéro de la dernière ligne vide
        LigTab = .End(xlDown).Offset(1, 0).Row
        ' Inscrire les éléments sleon l'indice
        If Ind = 1 Then
          Range("B" & LigTab) = "NOM DU CHANTIER"
        ElseIf Ind = 2 Then
          Range("B" & LigTab) = "Phase 1"
        Else
          Range("B" & LigTab) = "Phase 2"
        End If
      Next Ind
    End With
  End With
End Sub

Petit problème, de taille , l'insertion ne doit pas être effectuée en fin de tableau mais au dessus de la ligne 8.

En effet j'ai une ligne en bas de tableau pour faire des totaux d'effectif...

De plus, je souhaite que les éléments ajouter par le biais de la macro soit positionnés en partie haute du tableau.

La difficulté pour moi est de contraindre l'insertion au dessus de la ligne 8. J'aurai également souhaité conserver la mise en forme des 3 lignes précédentes d'ou à la base mon copier/Coller...

Pour plus de précision, en PJ mon fichier

Merci

J'ai trouvé comment intégrer mes nouvelles lignes en Ligne 8. J'ai corrigé la ligne d'ajout d'une ligne selon code suivant :

.ListObject.ListRows.Add 2, AlwaysInsert:=True

Bonjour à tous

Dans un tableau structuré on n'utilise jamais une ligne normale pour totaliser : on active la ligne des totaux du tableau

Par ailleurs, de même qu'on donne des noms signifiants aux classeurs et aux onglets, on le fait pour les tableaux, Tableau1 ne voulant rien dire

A noter également qu'un tableau structuré ne doit contenir aucune ligne vide et qu'il est donc inutile de lea recherche si on veut ajouter à la fin du tableau.

Une Sub générique à appeler, après avoir contrôlé que y, nb et Tabl sont cohérents si issus d'inpubox par exemple

Sub Ajout_lignes(ByVal y As Long, ByVal nb As Long, ByVal Tabl As String)
'Ajout N lignes à tableau
'y est la ligne Excel au dessus de laquelle on veut insérer
'nb est le nombre de lignes
'Tabl est le nom du Tableau
Dim Lo As ListObject
Set Lo = Range(Tabl).ListObject
    Application.ScreenUpdating = False
    With Lo
        y = y - .Range.Row
        For i = 1 To nb
            .ListRows.Add (y)
        Next i
    End With
End Sub

Re

On peut utiliser aussi la fonction générique sans précision de ligne pour ajouter à la fin

Sub Ajout_lignes2(ByVal nb As Long, ByVal Tabl As String, Optional ByVal y As Long)
'Ajout N lignes à tableau
'nb est le nombre de lignes à ajouter
'Tabl est le nom du Tableau
'y est la ligne Excel au dessus de laquelle on veut insérer. Optionnel si en fin du tableau
Dim Lo As ListObject
Set Lo = Range(Tabl).ListObject
    Application.ScreenUpdating = False
    With Lo
        If Not y = 0 Then 'Is Nothing Then
            y = y - .Range.Row
            For i = 1 To nb
                .ListRows.Add (y)
            Next i
        Else
            For i = 1 To nb
                .ListRows.Add
            Next i
        End If
    End With
End Sub

Bonjour 78chris,

Merci pour tes retours. Je m'excuse par avance j'ai beaucoup de lacunes en VBA d'ou mes incertitudes et questions surement idiotes...

J'ai renommé mon tableau en "Planning".

J'ai activé la ligne des totaux.

Pour en revenir à tes propositions, j'ai utilisé la première en effectuant les corrections proposées :

Sub Ajout_lignes(ByVal y As Long, ByVal nb As Long, ByVal Tabl As String)
'Ajout N lignes à tableau
'y est la ligne Excel au dessus de laquelle on veut insérer
'nb est le nombre de lignes
'Tabl est le nom du Tableau
Dim Lo As ListObject
Set Lo = Range(Tabl).ListObject
    Application.ScreenUpdating = False
    With Lo
        y = y - .Range.Row
        For i = 1 To nb
            .ListRows.Add (y)
        Next i
    End With
End Sub

Dans mon cas, les variables y et nb sont plutôt des constantes :

y=2 et nb=3

J'ai ma petite idée par la suite pour les utiliser avec InputBox...

J'ai le résultat escompté à savoir la création de 3 lignes vierges au dessus de la ligne 8 en zappant l'étape

y = y - .Range.Row

qui me génère une erreur. Je ne comprends pas ce que renvoi : .Range.Row et le pourquoi de cette ligne.

Enfin, j'aimerais connaitre les commandes utilisables pour la gestion des formats de cellules.

Est ce que quelqu'un à un lien vers un tuto sur la manipulation de tableau?

Est il possible d'utiliser directement? :

With Range("B11:H11")
    .Interior.Color = RGB (r ,g ,b )
    .Value = "TEST"
End With

Merci d'avance

RE

Ceci testé sur le classeur que tu avais joint fonctionne

Sub testAjout()
y = 8
nb = 3
Tabl = "Tableau1"
Call Ajout_lignes1(y, nb, Tabl)
End Sub
Sub Ajout_lignes1(ByVal y As Long, ByVal nb As Long, ByVal Tabl As String)
'Ajout N lignes à tableau
'y est la ligne Excel au dessus de laquelle on veut insérer
'nb est le nombre de lignes à ajouter
'Tabl est le nom du Tableau
Dim Lo As ListObject
Set Lo = Range(Tabl).ListObject
    Application.ScreenUpdating = False
    With Lo
        y = y - .Range.Row
        For i = 1 To nb
            .ListRows.Add (y)
        Next i
    End With
End Sub

Donc ton classeur actuel doit être différent

8 étant une ligne Excel et le tableau ne démarrant pas toujours en ligne 1 de l'onglet,

y = y - .Range.Row

permet de tenir compte d ela position du tableau (.Range.Row donnant la ligne Excel de sa 1ère ligne)

Pour modifier une Plage correspondant à la ligne 11 Excel

Set Lo = Range("Tableau1").ListObject
y = 11
With Lo
    y = y - .Range.Row
    With .DataBodyRange.Range(Cells(y, 1), Cells(y, 7))
        .Interior.Color = RGB(r, g, b)
        .Value = "TEST"
    End With
End With

Mais dans nombre de cas on peut se référer à la ligne du tableau et non la ligne Excel (ligne ajoutée par exemple)

Merci à tous,

J'ai pu venir à bout de ce que je souhaitais faire grâce à vos retours!

Je poursuit mes améliorations et n'hésiterais pas à solliciter ce forum si problème.

Vous êtes au top!

Bon dimanche

Rechercher des sujets similaires à "insertion ligne vba copier coller"