Copie depuis une sélection multiple
Vous
avez déjà probablement constaté que, dans Excel, on ne peut pas opérer une
sélection multiple, puis la copier pour aller la coller ailleurs. La macro que
nous vous proposons aujourd’hui, due à Kevin Jones, résout ce problème,
au moins en partie. Pour illustrer l’utilisation de cette macro, nous allons
reprendre l’exercice présenté dans l’article précédent, mais nous aurions pu
prendre n’importe quel autre tableau Excel.
Comme
nous pouvons le voir dans la copie d’écran, nous avons sélectionné le bloc E1:E6 puis, en maintenant la touche [Ctrl]
enfoncée, le bloc A2:B3. Nous avons
alors exécuté la macro PressePapiers puis cliqué en A8. Nous avons enfin utilisé [Ctrl]-v
pour coller le résultat en A8.
Cette
macro permet donc de copier une sélection multiple !
Remarque – Nous notons une
originalité dans le résultat. Les données provenant du bloc A2:B3 sont
recollées en une seule colonne. Cela peut intéresser les personnes souhaitant
ramener en une colonne unique des données provenant de plusieurs blocs, chacun
pouvant être bidimensionnel.
En
revanche, on ne peut hélas pas recoller tout cela en respectant les positions
relatives des blocs originaux ! A moins qu’un lecteur particulièrement
créatif de ce blog ne trouve la solution…
2 Commentaire(s):
Bonjour,
Ci-joint une tentative (avec des limites) sans faire appel aux ID d'application, ni aux API Windows, du VBA Excel pur !
CONVENTION IMPORTANTE : dans la sélection multiple rajouter EN DERNIER la cellule de destination, puis lancer la macro.
Le principe consiste à détermine une plage-cadre, un rectangle, encadrant complètement la sélection multiple. On copie cette plage cadre sur la destination, matérialisée par la dernière cellule sélectionnée puis, sur la plage copiée, on vide les cellules non concernées par la copie.
Attention ! cette technique est destructrice si la zone destination contient déjà des informations.
Remarque 1 : la macro n'est valable que pour une copie sur la feuille active.
---------------------------------------------------------------------------
Sub copie_multiplages()
Dim zone As Range
Dim copie As Range
Dim glmin As Long
Dim glmax As Long
Dim gcmin As Long
Dim gcmax As Long
Dim cellule As Range
Dim dl As Integer
Dim dc As Integer
glmin = 16000000
gcmin = 16384
' Détermination des cellules haut/gauche et bas/droite de la plage-cadre
' glmin et glmax sont les n°s de lignes extrêmes
' gcmin et gcmax sont les n°s de colonnes extrêmes
For Each zone In Selection.Areas
With zone
If .Address <> ActiveCell.Address Then
With .Columns(1)
If .Cells(.Cells.Count).Row > glmax Then glmax = .Cells(.Cells.Count).Row
If .Cells(1).Row < glmin Then glmin = .Cells(1).Row
End With
With .Rows(1)
If .Cells(.Cells.Count).Column > gcmax Then gcmax = .Cells(.Cells.Count).Column
If .Cells(1).Column < gcmin Then gcmin = .Cells(1).Column
End With
End If
End With
Next zone
' copie effective de la plage cadre vers la destination (Activecell)
' la plage destination est un objet Range nommé "copie"
Range(Cells(glmin, gcmin), Cells(glmax, gcmax)).Copy Destination:=ActiveCell
Set copie = Range(ActiveCell, ActiveCell.Offset(glmax - glmin, gcmax - gcmin))
' Calcul des décalages Ligne/colonne entre la plage-cadre et la copie
dl = ActiveCell.Row - glmin
dc = ActiveCell.Column - gcmin
' Vidage des cellules hors sélection
For Each cellule In copie.Cells
If Application.Intersect(Selection, cellule.Offset(-dl, -dc)) Is Nothing Then cellule.Clear
Next cellule
End Sub
------------------------------------------------------------------------------
By cduigou, sur 9:41 AM
Excellent suggestion !
Cela fonctionne très bien.
Il y a une différence cependant avec ce que j'avais proposé : vous mettez aussi dans le presse-papiers le formatage (police, style, cadres...) des cellules concernées.
Mais il faut en effet bien faire attention à mettre en dernier dans la sélection multiple la cellule de destination !
By Hervé Thiriez, sur 10:19 AM
Enregistrer un commentaire
<< Accueil