Résolu Copier des lignes automatiquement, sous condition...

  • Auteur de la discussion jprieux
  • Date de début

jprieux

Nouveau membre
Bonjour,
Me revoilà avec une question de "nioubi" : Dans une formulaire créer sous Excel, je souhaite copier une ligne particulière lorsque l'utilisateur coche une case.
Pour ça, pas de problème, même si mon code n'est pas très "propre", ça fonctionne :

[cpp]
Sub plus1()
'
' Ajoute un additif
'

'
Rows("41:41").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("I40:AC40").Select
Selection.Copy
Range("I41").Select
ActiveSheet.Paste
Range("I40:L40").Select
Application.CutCopyMode = True
Selection.Copy
Range("I41:L41").Select
ActiveSheet.Paste
Range("U40:X40").Select
Application.CutCopyMode = True
Selection.Copy
Range("U41:X41").Select
ActiveSheet.Paste
End Sub
[/cpp]

Maintenant, le vrai problème, c'est que en fonction de lignes qui auraient pu être insérées par cette même méthodes, mais plus haut dans le formulaire (par exemple au niveau de la Row 34), je ne vais plus copier la ligne que je souhaitais, qui se trouvait être la Row41, mais qui est maintenant en 42. :fou:

Donc, ma question est : comment puis-je copier une ligne, quelque soit sa position dans la feuille Excel ?

Il y en a qui vont peut être trouver ça simple (et tant mieux parce qu'ils vont pouvoir m'aider), mais moi je bloque.

D'avance, merci à tous les contributeurs !
 

zeb

Modérateur
Non, non, non et non :fou: :fou: :fou: :fou:
(voilà, je suis tout énervé maintenant ... :( )

...................

Salut JP,

Je n'aime pas voir un Selection suivre un Select dans vos codes. C'est une perte de temps pour le développeur et pour l'utilisateur de vos développements.

De plus, il me semble inadmissible qu'un programme (oui, bon, une macro, ça peut être un peu moins qu'un programme, mais c'est par principe) remplisse le presse-papier. Et si avant de lancer la macro j'y avais copié des trucs importants ? :o
Donc on se sert du paramètre Destination de la méthode Copy.

Ça donne :
Code:
Rows("41:41").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Range("I40:AC40").Copy Destination:=Range("I41")
Range("I40:L40").Copy Destination:=Range("I41:L41")
Range("U40:X40").Copy Destination:=Range("U41:X41")
C'est quand même plus clair, non ?
(En plus, comme ça, on voit tout de suite qu'il y a un chtit problème, les zones se recoupent ;) )

Bon, maintenant, toutes ces adresses en dur, ce n'est pas terrible.

On peut toujours créer les adresses avec des "I" & n & ":AC" & n, mais le mieux est encore de se servir de Cells. Range("I40") devient alors Cells(40, 9). Au lieu de chaînes de caractères, on a des coordonnées numériques, ça va être plus simple.

On refait le code :
Code:
Rows(41).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Range(Cells(40, 9); Cells(40, 29)).Copy Destination:=Cells(41, 9)
Range(Cells(40, 9), Cells(40, 12)).Copy Destination:=Cells(41, 9)
Range(Cells(40, 21), Cells(40, 24).Copy Destination:=Cells(41, 21)
Voilà. Il n'y a plus que des nombres. :)
Pas la peine de définir une plage pour la destination, une cellule unique suffit (la première en haut à gauche).

Bon, ce bout de programme ne fonctionne que pour la ligne 41. Ben pour la ligne n, c'est très facile :
Code:
Rows(n).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Range(Cells(n-1, 9); Cells(n-1, 29)).Copy Destination:=Cells(n, 9)
Range(Cells(n-1, 9), Cells(n-1, 12)).Copy Destination:=Cells(n, 9)
Range(Cells(n-1, 21), Cells(n-1, 24).Copy Destination:=Cells(n, 21)

Ça t'aide ?
 

jprieux

Nouveau membre
MERCI !

Effectivement, j'ai une sale manie avec mes selection suivi de select, mais ça vient de l'habitude de l'enregistreur de macro ... mea culpa ! :whistle:

Par contre, je me permettrais de corriger un petit oubli de parenthèse dans ton code :
[cpp]
Rows(n).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Range(Cells(n - 1, 9), Cells(n - 1, 29)).Copy Destination:=Cells(n, 9)
Range(Cells(n - 1, 9), Cells(n - 1, 12)).Copy Destination:=Cells(n, 9)
Range(Cells(n - 1, 21), Cells(n - 1, 24)).Copy Destination:=Cells(n, 21)
[/cpp]

Donc, ça marche super, SAUF QUE (et oui, il fallait bien un sauf...) mon problème est que ce n'est pas toujours la ligne 41, mais que je ne sais pas à l'avance quelle ligne ce sera (puisqu'elle peut être décalée en fonction des modifications sur les lignes supérieures).

Comprends-tu mon angoisse ?

Merci d'avance, ô maître (oui je sais, j'en fais trop).
 

zeb

Modérateur
Meilleure réponse
Celui-là pour te faire passer tes sales manies : [:zeb:4]
Celui-là pour tes corrections : :sarcastic: (une parenthèse, mais un point-virgule qui traîne, aussi)
Ces deux-là pour ton "ô maître" : :lol: :lol:

------------------------------------------------------

Et comment veux-tu qu'en VBA, on puisse deviner quelle ligne n utiliser ?

Echappons-nous en peu de VBA, pour discuter d'Excel. Sais-tu que les cellules d'un classeur peuvent avoir des noms ? Ceux-ci doivent être uniques pour un même classeur. Ainsi peut-on nommer la cellule B12 de la feuille 2 par le doux sobriquet de "SOMME_TOTALE". Ce n'est qu'un exemple. :o

Revenons à nos moutons.
Vous devez être connecté pour voir les images.

Et si tu nommais une cellule particulière du coté de la ligne 41 pour t'y référer ensuite !
 

jprieux

Nouveau membre
Et oui, arrêter de cloisonner Excel et VBA ... Ah ! si évident qu'il suffisait d'y penser...
Encore merci !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 129
Messages
6 717 853
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut