Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Une bizarrerie dans un copié-collé

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

Je voudrais copier le contenu de 3 colonnes contiguës et le coller ailleurs.

Je déclare 2 plages, à savoir celle des éléments à copier et la cellule à partir de laquelle on collera ces éléments :
VB:
Set plage1 = [TableauFamilles1].Rows(1).Offset(, -1).Resize(nblgnTF, 3) 'tableau "TableauFamilles1" et les 2 colonnes qui l'encadrent

Set plage2 = [TableauFamilles2].Rows(1).Offset(, -1) 'première cellule de la colonne immédiatement à gauche du tableau "TableauFamilles2"
Si j’écris ça :
VB:
Worksheets("BD").plage1.Copy Destination:=Worksheets("BD").plage2
... ça ne marche pas.

Alors que si j’écris ça :
VB:
Worksheets("BD").[TableauFamilles1].Rows(1).Offset(, -1).Resize(nblgnTF, 3).Copy Destination:=Worksheets("BD").[TableauFamilles2].Rows(1).Offset(, -1)
... ça marche.

Quelqu’un(e) dans le forum pourrait m’expliquer pourquoi ?
Merci d’avance.
 
Re : Une bizarrerie dans un copié-collé

bonjour à tous_________________________________________EDITION: Salut job75 😉


Magic_Docteur
Cela fonctionne avec ces modifs
(j'ai ajouté la macro a qui serait ma façon de faire pour recopier le tableau)
Pourquoi renommes-tu le tableau2 (la taille ne change pas non ?)
Code:
Sub a()
Dim tableau1 As Range, adr$
Set tableau1 = Union([TableauFamilles1].Offset(, 1), [TableauFamilles1], [TableauFamilles1].Offset(, -1))
adr = [TableauFamilles2].Address
tableau1.Copy [TableauFamilles2].Item(1).Offset(, -1)
Range(adr).Name = "TableauFamilles2"
End Sub
Code:
Sub SauvegardeTableauFamilles1()
'Sauvegarde du tableau "TableauFamilles1" (et des 2 colonnes qui l'encadrent) après toute modification dans celui-ci
Application.ScreenUpdating = False
Dim nblgnTF1 As Byte, plage As Range, cel1 As Range, cel2 As Range, ad1 As String, ad2 As String
nblgnTF1 = [TableauFamilles1].Rows.Count 'nombre de lignes du tableau "TableauFamilles1"
Set plage = [TableauFamilles1].Item(1).Offset(, -1).Resize(nblgnTF1, 3) 'tableau "TableauFamilles1" et les 2 colonnes qui l'encadrent
Set cel1 = [TableauFamilles2].Item(1).Offset(, -1) '1ère cellule de la colonne immédiatement à gauche du tableau "TableauFamilles2"
Set cel2 = [TableauFamilles2].Item(nblgnTF1).Offset(, 1) 'dernière cellule de la colonne immédiatement à droite du tableau "TableauFamilles2" après sauvegarde
ad1 = cel1.Offset(, 1).Address 'adresse de la 1ère cellule du tableau "TableauFamilles2"
ad2 = cel2.Offset(, -1).Address 'adresse de la dernière cellule du tableau "TableauFamilles2" après sauvegarde

'**************************************** MARCHE AVEC CETTE SYNTAXE ****************************************
plage.Copy Destination:=cel1 'on sauvegarde le tableau "TableauFamilles1" et les 2 colonnes qui l'encadrent

'******************************************* MARCHE ! *******************************************
'Worksheets("BD").[TableauFamilles1].Rows(1).Offset(, -1).Resize(nblgnTF1, 3).Copy Destination:=Worksheets("BD").[TableauFamilles2].Rows(1).Offset(, -1)

Range(ad1 & ":" & ad2).Name = "TableauFamilles2" 'on renomme, avec le même nom, le tableau "TableauFamilles2" redimensionné
[CR50].Select
Application.ScreenUpdating = True
End Sub

PS:
j'ai installé LibreOffice (version portable) pour pouvoir lire les *.xlsm ou *.xlsx
mais c'est plus simple (tant que je suis pas sur mon pc) si je tombe sur des *.xls dans les fils que je lis sur XLD
😉
 
Dernière édition:
Re : Une bizarrerie dans un copié-collé

Bonjour Magic_Doctor, Jean-Marie,

Quelqu’un(e) dans le forum pourrait m’expliquer pourquoi ?

plage1 et plage2 sont des variables objet (Range).

Elles ont été parfaitement définies, donc il est inutile - et interdit - de mentionner devant la feuille à laquelle elles appartiennent.

Si plage1 et plage2 ont même dimension, ou si plage2 est une seule cellule, on écrit :

Code:
plage1.Copy plage2
C'est élémentaire.

A+
 
Re : Une bizarrerie dans un copié-collé

Re

Job75:
Puisque tu es dans les parages (et pas Magic Doctor), je me trompe ou le tableau2 ne change pas de taille, donc pourquoi en fin de code Magic_Doctor renomme son tableau2???
 
Re : Une bizarrerie dans un copié-collé

Bonjour Staple1600, job75,

Staple1600 me demande :
« Pourquoi renommes-tu le tableau2 (la taille ne change pas non ?) »
J’ai adressé un exemple minimaliste de mon application. Mais comme toute question mérite réponse, je vais tenter de développer mon raisonnement.
Le tableau « TableauFamilles1 » contient des noms de familles (chimiques). Chaque famille se distingue par une couleur qui lui est propre. La dimension du tableau peut varier suivant que l’on ajoute ou supprime une ou des familles. L’ordre des familles est établi par l’utilisateur suivant ses desiderata (« tri subjectif ») ; normalement, une fois établi, on n’y touche plus. En revanche, il peut être pratique de vouloir trier ces familles par ordre alphabétique ; mais à ce moment-là, après avoir ainsi trié le tableau, on perd définitivement le tri précédent (« tri subjectif »). Le tableau « TableauFamilles2 » mémorise précisément ce tri. Quand on veut le récupérer, après avoir fait un tri par ordre alphabétique, le tableau « TableauFamilles2 » (« tri subjectif ») se substituera alors au tableau « TableauFamilles1 » (tri par ordre alphabétique).
Évidemment, à chaque modification du tableau « TableauFamilles1 » trié « subjectivement », celui-ci est automatiquement mémorisé dans le tableau « TableauFamilles2 ».
Un petit exemple. Supposons qu’entre les familles « Huile » et « Réglisse » j’intercale une nouvelle famille : « Jus de Brocolis ». La dimension du tableau « TableauFamilles1 » aura augmenté. Je fais un tri par ordre alphabétique et ensuite je veux revenir au « tri subjectif » précédent. En conséquence, après avoir modifié le tableau « TableauFamilles1 » je le mémorise dans le « TableauFamilles2 », je n’aurai plus qu’à le récupérer quand, après avoir fait un tri par ordre alphabétique, je veux revenir au « tri subjectif ».
Ma question n’est pas fondamentale dans mon projet puisque j’obtiens bien le résultat désiré avec la 2ème solution. En revanche, je me demande toujours pourquoi la 1ère solution plante.

Job75 a encore une fois raison. Si je remplace :
VB:
Worksheets("BD").plage.Copy Destination:=Worksheets("BD").cel1 'on sauvegarde le tableau "TableauFamilles1" et les 2 colonnes qui l'encadrent
par :
VB:
plage.Copy Destination:=cel1 'on sauvegarde le tableau "TableauFamilles1" et les 2 colonnes qui l'encadrent
et bien là ça marche et je ne comprends pas pourquoi.
 
Re : Une bizarrerie dans un copié-collé

Re

Magic_Doctor
juste pour infos, j'avais fait la même modif que Job75 😉
(voir ta macro Sub SauvegardeTableauFamilles1 modifiée dans ce message)
Au fait, tu as essayé ma macro a ?
 
Dernière édition:
Re : Une bizarrerie dans un copié-collé

Re,

Pardon Staple1600, effectivement je n'avais pas vu que tu avais mis la même solution que job75 pour ma "lourde macro".
Voulant expliquer la logique de la macro, j'ai court-circuité ta macro "a".
Je viens de l'essayer. C'est simple : adoptée !! ¡Adiós la macro pesada!

Encore merci et bonne journée à tous.
 
Re : Une bizarrerie dans un copié-collé

Re

Si ton tableau1 change de taille, alors utilises plutôt ce code
Code:
Sub a2()
Dim tableau1 As Range, adr$
Set tableau1 = Union([TableauFamilles1].Offset(, 1), [TableauFamilles1], [TableauFamilles1].Offset(, -1))
adr = [TableauFamilles1].Offset(, 4).Address
tableau1.Copy [TableauFamilles2].Item(1).Offset(, -1)
Range(adr).Name = "TableauFamilles2"
End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
879
Réponses
1
Affichages
728
M
Réponses
4
Affichages
975
mimich_88
M
Réponses
5
Affichages
936
LeSaintKebab
L
Réponses
2
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…