Forum Clubic

Aide Macro Excel - Visual Basic

Je voudrai créer une macro dans Excel 2000 qui permette de sélectionner une ligne d’une feuille appellée “Maintenance” et la déplacer automatiquement à la fin d’une autre feuille appelée “Archive” (après sélection de la ligne concernée et utilisation du raccourci CTRL/q).

En utilisant le gestionnaire de macro, voilà ce que j’obtiens :

Sub Macro1()

’ Macro1 Macro
’ Macro enregistrée le 07/01/2005 par jlchapel

’ Touche de raccourci du clavier: Ctrl+q

Selection.Cut
Sheets(“Archive”).Select
ActiveCell.SpecialCells(xlLastCell).Select
Range(“A4”).Select
ActiveSheet.Paste
Sheets(“Maintenance”).Select
Selection.Delete Shift:=xlUp
End Sub

Le problème, c’est qu’à chaque fois que je fais CTRL/q sur une ligne sélectionnée de la feuille “Maintenance”, elle est déplacée dans la feuille “Archive” mais toujours à la ligne 4.
Pourtant, lors de l’enregistrement de la macro, je fais :

  • “CTRL/FIN” pour aller à la fin de la feuille
  • “Flèche vers le bas” pour aller à la ligne suivante
  • “Home” pour venir en début de cette ligne.

Mais cette combinaison de touche est traduite en Visual Basic par “sélectionner la cellule A4” !!! Pourtant, dans un vieux Excel, quand on utilisait une flèche de déplacement dans l’enregistrement d’une macro, c’était bien traduit par un déplacement sans coordonnées fixes.

Comment je peux modifier manuellement cette macro pour lui dire d’aller au début de la dernière ligne vide avant de faire le “copier” ?

Merci de votre aide.

A premiere vue la ligne Range(“A4”).Select est simplement à supprimer
Je fais un exercice de test et je confirme (ou infirme)
A+

:stuck_out_tongue:
Chez moi cela tourne. Pour plus de suretè je copie ci-dessous la macro que j’obtiens:
Selection.Cut
Sheets(“Archive”).Select
ActiveCell.SpecialCells(xlLastCell).Select
ActiveSheet.Paste
Sheets(“Maintenance”).Select
Selection.Delete Shift:=xlUp
End Sub
:slight_smile:

Dans mon exemple, la feuille “Archive” contient 11 colonnes (de A à K).
Donc, la fonction “ActiveCell.SpecialCells(xlLastCell).Select” positionne le curseur sur la cellule L de la dernière ligne utilisée.
Quand la fonction “ActiveSheet.Paste” s’exécute, cela donne “Erreur d’exécution 1004 - cette sélection n’est pas valide”.
En vérité, il faut que le curseur vienne se positionner en colonne A de la première ligne vide en fin de document (ligne N+1 ; N=dernière ligne active).
Voilà le problème …

Je revois le problème mais en première approximation est-ce que la selection de départ porte bien sur la ligne entière ?

Oui, je sélectionne une ligne entière de la première feuille, et je veux pouvoir la déplacer entièrement à la fin de la deuxième feuille en utilisant CTRL/Q.

Ce message n’était pas conforme aux règles d’utilisation du nouveau forum :

Oui, je sélectionne une ligne entière de la première feuille, et je veux pouvoir la déplacer entièrement à la fin de la deuxième feuille en utilisant CTRL/Q.

:stuck_out_tongue:
il me semble que ceci fonctionne
Sub Macro1()
n = 0
Selection.Cut
Sheets(“Archive”).Select
Do While n < 1000
n = n + 1
If Cells(n, 1) = “” Then
Exit Do
End If
Loop
Cells(n, 1).Select
ActiveSheet.Paste
Sheets(“Maintenance”).Select
Selection.Delete Shift:=xlUp
End Sub
Le chiffre de 1000 est le nombre maximum de ligne que tu penses avoir en archive (à modifier eventuellement)
Je ne suis pas très fier de la méthode utilisèe pour trouver la dernière ligne de Archive mais pour l’instant je n’ai rien trouvè d’autre
:slight_smile:

ça marche … merci …

Remarque en passant:

La méthode ActiveCell.SpecialCells(xlLastCell).Select est à utiliser avec parcimonie. J’ai eu plein de problèmes avec. Déjà, si le fichier évolue dans le temps, la position de xlLastCell n’est raffraichit qu’à la ré-ouverture du fichier. Un peu lourd.
De plus, quoi qu’il advienne elle renvoie la position de la feuille active même si on l’applique sur un Range d’une autre feuille.
Donc, le Do While n’est peut être pas esthètique mais au moins il fonctionne (j’avais du faire quelque chose de similaire).

:jap: cairotes
en plus je partage totalement ta nostalgie du z80
:slight_smile: