XL 2016 Problème 1004, déplacement d'une cellule de votre feuille de calcul

APPRENTI:)

XLDnaute Nouveau
Bonjour à tous,

Je vous explique mon problème.

J'ai une macro 'Bilan' qui doit transférer une ligne d'un onglet à un autre. Cette macro transfert également des dossiers qui y sont associés.

Tout fonctionnait bien, cependant depuis que j'ai fait évoluer mon tableau, je me suis aperçu qu'un message d'erreur apparaissait et je n'arrive pas à solutionner ce problème bien que le sujet soit largement traité sur le net.

je vous joins mon fichier excel.
Lorsque vous sélectionnez la ligne et appuyez sur le bouton BILAN, le message d'erreur apparaît et donc la macro ne se déroule plus entièrement.

je précise que mes connaissances en VBA sont très limitées

Merci à vous !!! passez une très bonne journée!!
 

Pièces jointes

  • Base de Données Planning test.xlsm
    90.5 KB · Affichages: 17

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Apprenti,
Auriez vous transformer votre tableau en tableau structuré ?
Car le message d'erreur dit :
1.jpg

Quand avec l'enregistreur de macro on supprime une ligne, on obtient :
VB:
Selection.ListObject.ListRows(5).Delete
et non pas comme dans votre code :
Code:
Cells(lig, 1).Resize(500).Delete xlUp 'supprime la ligne
Donc je pense que l'erreur est apparue lorsque vous avez transformer la plage en Tableau Structuré.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Je pense qu'au début vous n'aviez que des plages de cellules et que votre macro marchait bien.
Puis vous avez sélectionnez votre plage et fait Insertion/Tableau :
1.jpg

Mais un tableau n'est pas une plage avec des couleurs, c'est aussi tout un système très puissant de calcul :
et je pense, mais ce n'est que supputations, que vos problèmes ont commencés à ce moment .
 

APPRENTI:)

XLDnaute Nouveau
D'accord, je comprends.
je ne serais dire si c'est à se moment la.

Je pensais que cela pouvait venir des différents liens que mon tableau a avec d'autres tableaux.

Je me suis aperçu que lorsque que je réduis la ligne à supprimer non pas à 500 mais à 1, ce qui correspond à la 1er Cellule, le message d'erreur disparaît.
Capture.PNG

Dans cette fameuse 2e colonne, j'ai une donnée de rapport d'avancement de tache qui provient d'autres fichiers excel.

voila ou j'e suis dans ma réflexion....
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour le fil,
@soan,
Le but n'était pas d'optimiser le ligne de code mais de comprendre pourquoi cela buggué.
Après moult essais, il s'avère qu'il n'est pas permis en VBA d'utiliser cette ligne :
VB:
Cells(lig, 1).Resize(500).Delete xlUp
Le tableau étant un tableau structuré, son "resize" est géré directement par XL et n'est pas accessible en VBA par cette manière.
Il suffit d'utiliser ça pour faire disparaître l'erreur :
Code:
Cells(lig, 1).Delete xlUp
... c'était juste pour comprendre le pourquoi de l'erreur. :)
 

soan

XLDnaute Barbatruc
Inactif
@sylvanu

Même si le but n'était pas d'optimiser la ligne de code, j'ai voulu
indiquer qu'il est inutile de mettre lig dans cette instruction :

Rows(lig & ":" & lig).Delete Shift:=xlUp

car quand c'est le même lig de part et d'autre du signe ":",
c'est donc juste pour une seule ligne ➯ on peut simplifier
en : Rows(lig).Delete 3


lig n'apparaît qu'une seule fois, et c'est quand même
plus court, pas vrai ? ;)


soan
 

soan

XLDnaute Barbatruc
Inactif
Bonjour APPRENTI,

Ooops, j'avais abrégé Rows(lig & ":" & lig).Delete Shift:=xlUp
en : Rows(lig).Delete Shift:=xlUp ou Rows(lig).Delete 3

mais comme on supprime la ligne entière, le xlUp est inutile !
donc ça devient tout simplement : Rows(lig).Delete

En fait, c'est utile d'utiliser Shift:=xlUp uniquement pour une plage limitée
de cellules
; exemple :
[F5:M5].Delete Shift:=xlUp ou [F5:M5].Delete 3

et aussi, en même temps, s'il y a quelque chose d'autre à gauche ou
à droite qui ne doit pas être « remonté » ; pour le même exemple,
c'est les colonnes A:E à gauche, et par exemple N:R à droite.

Note bien que s'il n'y a rien à gauche ni à droite de la plage « remontée »,
alors Rows(5).Delete aura le même résultat que [F5:M5].Delete 3

Pour ton exemple Cells(lig, 1).Delete xlUp ou Cells(lig, 1).Delete 3 : c'est en
colonne A ➯ si tu n'as rien à droite, ni en colonne B, ni plus à droite, alors
Rows(lig).Delete aura le même résultat ; c'est seulement s'il y a quelque
chose en B ou plus à droite qui ne doit pas être remonté en même temps
que tes données en A que c'est utile d'utiliser Cells(lig, 1).Delete 3 au lieu de
Rows(lig).Delete.


Note aussi que sur la feuille de calcul :

* Rows(lig).Delete est l'équivalent de supprimer la ligne lig (évident)

* Cells(lig, 1).Delete 3 est l'équivalent de : sélectionner la cellule qui est
en colonne A et en ligne lig ; puis : onglet Accueil, groupe Cellules,
commande Supprimer / Supprimer les cellules...


soan
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16