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