XL 2019 Erreur 438 sur un specialPaste

Cheyenne_2021

XLDnaute Junior
Ce que je cherche à faire :

Dans un onglet, chaque ligne entière avec le statut « ASUPP », la copier et la coller dans un autre onglet . Et le « coller » ne fonctionne pas. J'ai une erreur 438 sur mon Paste.



J’ai essaye de faire des set comme quelqu’un l’a conseillé sur ce forum, mais ça ne marche pas toujours. Ca marche avec le with mais je n’ai pas réussi à le faire fonctionner pour le Paste.

Voici ma macro :

Sub Supprimer_ASUPP()

Dim r As Integer ' indice des lignes dans le tableau T_suivi_DI

Dim sup As Integer ' indice des lignes dans le tableau des tw supprimés

Dim F_src As Worksheet

Dim F_cbl As Worksheet

Dim T_src As ListObject

Dim T_cbl As ListObject



Call Deverrouiller_feuille(ActiveWorkbook.Worksheets("1- Suivi des DI & avis n+1"))



Application.Calculation = xlCalculationManual

Application.ScreenUpdating = False



Di_Ligne = Range("T_suiviDi").Rows.Count

Set F_src = Worksheets("1- Suivi des DI & avis n+1")

Set F_cbl = Worksheets("7-TW supprimés")

Set T_src = F_src.ListObjects("T_SuiviDi")

Set T_cbl = F_cbl.ListObjects("T_SUPP") ' =Worksheets("7-TW supprimés").ListObject("T_SUPP")



'For r = 1 To Di_Ligne

For r = 16 To 26

col_statut = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").ListColumns("Statut").Index

col_num = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").ListColumns("NumL").Index



If Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").DataBodyRange(r, col_statut).Value = "ASUPP" Then

Num_S = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").DataBodyRange(r, col_num).Value



Worksheets("1- Suivi des DI & avis n+1").Range("T_SuiviDi").Rows(r).Copy



With F_cbl

derniere_ligne = Range("T_SUPP").Rows.Count

.Select

.Range("T_SUPP").Rows(derniere_ligne).Select



MsgBox ("ligne suiviDI : " & r)

MsgBox ("derniere ligne T_SUPP : " & derniere_ligne)

MsgBox ("nUML : " & Num_S)

' Selection.ListObject("T_SUPP").ListRows.Add (derniere_ligne)

.Range("T_SUPP").ListObject.ListRows.Add (derniere_ligne)

'Selection.EntireRow.Insert Shift:=xlUp

'T_cbl.ListRows(derniere_ligne).PasteSpecial Paste:=xlPasteValues, Paste:=xlPasteFormats

Worksheets("7-TW supprimés").Range("T_SUPP").ListObject.ListRows(derniere_ligne).PasteSpecial Paste:=xlPasteValues, Paste:=xlPasteFormats : Erreur 438

' Worksheets("7-TW supprimés").Range("T_SUPP").PasteSpecial Paste:=xlPasteValues, Paste:=xlPasteFormats

' T_cbl.PasteSpecial

End With

End If

Next

Application.ScreenUpdating = True

Application.Calculation = xlCalculationAutomatic



Call Verouiller_feuille(ActiveWorkbook.Worksheets("1- Suivi des DI & avis n+1"))

End Sub



Je me mélange aussi les pinceaux : J’utilise maintenant beaucoup les tableaux structurés, donc j’essaye d’utiliser les ListObjects mais parfois Range marche mieux et je ne sais pas pourquoi.

Pourriez-vous m’expliquer la différence entre :
  • .cells(L,c).entirerow.copy
  • .Range(« tableau »).Rows(l).copy
Merci,

PS : Je ne peux pas mettre mon fichier, il est trop lourd.
 

fanch55

XLDnaute Barbatruc
Bonjour,
Vous utilisez des tableaux structurés, essayez ce code :
VB:
Sub Supprimer_ASUPP()
Call Deverrouiller_feuille(ActiveWorkbook.Worksheets("1- Suivi des DI & avis n+1"))
    For r = [T_SuiviDi].Rows.Count To 1 Step -1 ' car on va détruire une ligne
        If [T_SuiviDi[Statut]].Rows(r) = "ASUPP" Then
            [T_SUPP].ListObject.ListRows.Add: L = [T_SUPP].ListObject.ListRows.Count
            [T_SuiviDi].Rows(r).Copy
            [T_SUPP].Rows(L).PasteSpecial Paste:=xlPasteValues
            [T_SUPP].Rows(L).PasteSpecial Paste:=xlFormats
            [T_SuiviDi].Rows(r).Delete
        End If
    Next
Call Verouiller_feuille(ActiveWorkbook.Worksheets("1- Suivi des DI & avis n+1"))

End Sub

Pourriez-vous m’expliquer la différence entre :
  • .cells(L,c).entirerow.copy
  • .Range(« tableau »).Rows(l).copy
entirerow : vous copiez la ligne entière même s'il y a d'autres données que les colonnes de votre tableau,
le L étant la ligne "physique" dans la feuille

range("tableau").rows(I).copy ou [tableau].rows(I).copy : vous copiez seulement les colonnes de la ligne i du tableau.
Le I étant l'index de cette ligne dans le tableau ( à ne pas confondre avec la ligne physique ).

Nota: dans votre cas les tableaux sont sur 2 feuilles différentes , mais ils auraient pu être sur la même feuille, d'où ne pas utiliser entirerow ....
Un tableau structuré peut être n'importe où dans une feuille

Pour illustrer l'exemple, fichier joint, cliquez sur l'image
 

Pièces jointes

  • Cheyenne.xlsm
    49.1 KB · Affichages: 5
Dernière édition:

Cheyenne_2021

XLDnaute Junior
Fanch55 :
D'abord merci.

ensuite j'ignorais totalement qu'on pouvait utiliser les crochets pour designer un tableau dans VBA, cela allège considérablement le code !

sur la ligne : [T_SUPP].Rows(derniere_ligne).PasteSpecial Paste = xlPasteValues, j'ai un 1004 la méthode pastespecial de la classe range a échoué

Je recopie la nouvelle macro : (Je ferai la suppression de la ligne plus tard)
For r = 16 To 26
col_statut = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").ListColumns("Statut").Index
col_num = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").ListColumns("NumL").Index

If [T_SuiviDi[statut]].Rows(r) = "ASUPP" Then
Num_S = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").DataBodyRange(r, col_num).Value
derniere_ligne = [T_SUPP].ListObject.ListRows.Count
[T_SUPP].ListObject.ListRows.Add
[T_SuiviDi].Rows(r).Copy
[T_SUPP].Rows(derniere_ligne).PasteSpecial Paste = xlPasteValues
[T_SUPP].Rows(derniere_ligne).PasteSpecial Paste = xlPasteFormats

End If
Next

Par contre, dans votre exemple, vous avez mis la macro attachée à la feuille , où se trouve les 2 tableaux, alors que moi je l'ai mis dans les modules. cela pourrait-il expliquer le 1004 ?
 

fanch55

XLDnaute Barbatruc
Bonjour,
Cela doit fonctionner également dans un module, car rien n'est adhérent à la feuille active .

[T_SUPP].ListObject.ListRows.Add : sans indication de position, la ligne est ajouté en fin de table
derniere_ligne = [T_SUPP].ListObject.ListRows.Count : récupère l'index de la dernière ligne, devrait donc être après le Add .

Num_S = Worksheets("1- Suivi des DI & avis n+1").ListObjects("T_SuiviDi").DataBodyRange(r, col_num).Value : Num_S= [T_SuiviDi[NumL]].Rows(r)
 

Discussions similaires

Réponses
9
Affichages
837

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 837
dernier inscrit
Ugo