Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure hab.

Cide

XLDnaute Nouveau
J’ai une feuille Excel où je suis souvent amené à recopier des cellules

Aussi plutôt que de faire
1) Clic Droit Copier
2) Clic Droit collé

Je souhaiterais avoir une macro qui me permettrait de faire la même chose en cliquant juste une fois sur la macro à copier, puis ensuite sur la cellule de destination.

Faire une macro pour recopier la cellule B4 en B7, c’est à la porté de tout le monde
Mais faire une macro pour recopier une CellueX vers une CelluleY ? c’est plus difficile !

Merci pour votre aide

A+
 

Pièces jointes

  • CopieCellulesXY.xlsm
    8.4 KB · Affichages: 34
  • CopieCellulesXY.xlsm
    8.4 KB · Affichages: 39
  • CopieCellulesXY.xlsm
    8.4 KB · Affichages: 37
Dernière édition:

Cide

XLDnaute Nouveau
Re : Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure

Bonsoir Roger

J'étais donc en train d'essayer ta version, elle me semblait bien fonctionner
J'ai eu le temps de constater que l'on pouvait retourner en arrière
Comme je voulais essayer de comprendre, j'ai été dans la feuille masquée
mais du coup la macro ne fonctionne plus ???

J'ai essayé de rouvrir à nouveau le classeur
Mais c'est pareil, la macro fonctionne plus
et la fenêtre n'est plus masquée dès l'ouverture
Je n'ai jamais utilisé ce masquage de fenêtre

J'ai voulu retélécharger ta solution, mais je constate que tu l'a supprimée car tu l'as dit défectueuse
Et bien à bientôt j'espère et bonne nuit à toi aussi
 

ROGER2327

XLDnaute Barbatruc
Re : Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure

Re...


Désolé pour ce contretemps. Voici un nouvel essai restreignant la procédure aux colonnes N à AB.
J'espère que c'est, sinon mieux, au moins moins pire...
Chez moi, que la feuille de sauvegarde soit masquée ou visible n'a pas d'importance.​


Bonne journée.


ℝOGER2327
#7447


Lundi 9 Gidouille 141 (Sainte Outre, psychiatre - fête Suprême Quarte)
5 Messidor An CCXXII, 0,1104h - mulet
2014-W26-1T00:15:54Z
 

Pièces jointes

  • CopieCellulesXY(2).xlsm
    21.3 KB · Affichages: 32

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure

Bonsoir Cgi, Roger2327,

Une version v4.3 qui tente (en bien moins sioux que ROGER2327) d'introduire une tentative partielle de retour en arrière.
On ne revient que sur la formule pas sur le format.
La correction se lance par les touches Ctrl+k.
On peut faire l'essai, dans le fichier joint, sur les deux cellules en jaune.

Je regarderai les modifications que tu as faites qu'à partir de demain soir...

Bonne nuit à tous,
 

Pièces jointes

  • Cide-Copier-coller v4.3.xlsm
    29.8 KB · Affichages: 28
Dernière édition:

Cide

XLDnaute Nouveau
Re : Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure

Bonjour Roger2327, Mapomme, à Tous


Reger
Je viens de tester cette toute dernière solution
Le fonctionnement semble tout à fait correct
Mais je ne vois pas en quoi l'autre était défectueuse....

que la feuille de sauvegarde soit masquée ou visible n'a pas d'importance.
Oui c'est vrai, Je ne sais pas ce que j'ai fait hier, il devait être trop tard !
Cependant je ne vois pas à quoi te sert cette feuille cachée
Je ne vois rien dans ta macro qui s'y reporte ???

En tout cas ce retour en arrière fonctionne très bien, que ce soit pour la valeur ou le format.

Comme pour la macro de Mapomme, je me suis essayé à augmenter la sécurité de l'opération
et j'ai remplacé
Code:
Cible.Areas(1).Copy Destination:=Cible.Areas(2)
par
Code:
If Cible.Areas(2) = "" Then Cible.Areas(1).Copy Destination:=Cible.Areas(2)
Cela m'évite d'écraser une cellule pleine
Je ne sais pas si mon code est correct ?
Mais cela semble bien fonctionner, a voir dans le temps ??

Je reviens à la touche contrôle que j'avais évoqué #07
Je ne vois pas dans la macro ou se joue le fait d'appuyer sur la touche contrôle pour valider la copie ???
Pour réduire ce risque encore, plutôt que d'appuyer sur la touche contrôle, serait-il possible d'appuyer sur un bouton ?

Peut-être que tu n'a pas remarqué cette question, ce n'est pas très essentielle
Mais j'aimerais bien savoir si cette validation par la touche "contrôle" peut être remplacée par une autre touche ou par un bouton
Cette touche de contrôle n'est pas événementielle ?

Mapomme

Je viens d'essayer ta nouvelle version avec son retour en arrière
certes le format est perdu, mais l'essentielle est quand même la valeur.

J'ai corrigé mon rajout de code, en fait il n'est pas besoin de rajouter 2 tests
le 2ème suffit
J'ai donc mis ce code
Code:
If ActiveCell = "" Then CelluleChoisie.Copy ActiveCell
Tu me diras ce que tu en pense, mais cela semble bien fonctionner ?

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure

(...)
Roger
Je viens de tester cette toute dernière solution
Le fonctionnement semble tout à fait correct
(...)
Tant mieux !​


(...)
Mais je ne vois pas en quoi l'autre était défectueuse....
(...)
Elle l'est en ce que (de mémoire) j'y avais recours à quelque chose comme :​
VB:
Intersect(Cible, Columns("N:AB")).Address
Or cette formulation renvoie des réponses différentes selon que l'on sélectionne des zones distantes ou contiguës.
Si on sélectionne "$P$3,$P$5" (par clic-P3 Ctrl + clic-P5) on obtient effectivement "$P$3,$P$5" ;
mais si on sélectionne "$P$3,$P$4" (par clic-P3 Ctrl + clic-P4) on obtient "$P$3:$P$4".

Dans le premier cas,​
VB:
x = Cible.Address = Intersect(Cible, Columns("N:AB")).Address
affecte x de la valeur True.
Dans le second cas, x prend la valeur False.
C'est certainement logique en Logique microsoftienne[SUP](*)[/SUP], mais c'est fâcheux en Logique logique !​


(...)
Cependant je ne vois pas à quoi te sert cette feuille cachée
Je ne vois rien dans ta macro qui s'y reporte ???
(...)
Elle est utilisée chaque fois qu'on fait appel à Sécurité. J'ai commenté chaque ligne du code dans le classeur joint pour vous permettre de comprendre comment je l'utilise. Si les explications ne sont pas assez claires, n'hésitez pas à le dire : commenter proprement un code n'est pas toujours facile !

Ceci dit, lorsqu'on l'affiche, on y trouve rien ou pas grand-chose : chaque fois que
VB:
Sécurité.UsedRange.Clear
est exécuté, la feuille est vidée. C'est volontaire, le but étant d'alourdir le classeur aussi peu qu'il se peut...​


(...)
Comme pour la macro de Mapomme, je me suis essayé à augmenter la sécurité de l'opération
et j'ai remplacé
Code:
Cible.Areas(1).Copy Destination:=Cible.Areas(2)
par
Code:
If Cible.Areas(2) = "" Then Cible.Areas(1).Copy Destination:=Cible.Areas(2)
Cela m'évite d'écraser une cellule pleine
Je ne sais pas si mon code est correct ?
Mais cela semble bien fonctionner, a voir dans le temps ??
(...)
S'il s'agit de n'écrire que dans des cellules vides, je préférerais​
VB:
If IsEmpty(Cible.Areas(2).Value) Then
En effet, si une formule renvoie "" (chaîne de longueur nulle), votre formulation autorisera son écrasement. À vous de décider si vous souhaitez ou non ce résultat.
Autre remarque, ce contrôle de contenu peut être effectué plus tôt : ça ne pourra qu'accélérer l'exécution.
Pour plus de détail, voir le classeur joint.​


(...)
Je reviens à la touche contrôle que j'avais évoqué #07
Je ne vois pas dans la macro ou se joue le fait d'appuyer sur la touche contrôle pour valider la copie ???
Pour réduire ce risque encore, plutôt que d'appuyer sur la touche contrôle, serait-il possible d'appuyer sur un bouton ?
Peut-être que tu n'a pas remarqué cette question, ce n'est pas très essentielle
Mais j'aimerais bien savoir si cette validation par la touche "contrôle" peut être remplacée par une autre touche ou par un bouton
Cette touche de contrôle n'est pas événementielle ?
La touche Ctrl permet la sélection de cellules multiples. Je ne sais pas faire autrement pour obtenir une sélection de cellules multiples.
Comme rien n'est impossible, on peut chercher un code adéquat. Mais je n'ai aucune proposition à faire pour l'instant. Surtout qu'il faudrait que la solution de contournement fût simple...



Bonne soirée.


ℝOGER2327
#7448


Lundi 9 Gidouille 141 (Sainte Outre, psychiatre - fête Suprême Quarte)
5 Messidor An CCXXII, 6,6736h - mulet
2014-W26-1T16:00:59Z


[SUP](*)[/SUP]Vous avez certainement remarqué que la Logique microsoftienne est à la Logique ce que la Justice militaire est à la Justice[SUP](**)[/SUP] : dans certaines circonstances, une cellule parfaitement vide, vierge et innocente sera suspectée de n'être pas vide et de contenir en douce un beau zéro...

[SUP](**)[/SUP]Ça marche également avec la Musique militaire et la Musique, les Mathématiques financières et les Mathématiques, et bien d'autres choses...

Déconnade terminée : checked.
 

Pièces jointes

  • Copier-coller non standard.xlsm
    24.8 KB · Affichages: 60
Dernière édition:

Cide

XLDnaute Nouveau
Re : Macro pour recopier une CelluleX vers une CelluleY sans passer par la procédure

Bonsoir Roger2327, Mapomme, à Tous


Merci Roger pour toutes ces explications très claires et détaillées
Pour moi c'est aussi important que la solution elle-même, car cela me permet de comprendre le code, même si c'est qu'en partie et de ainsi progresser dans la maitrise du VBA

J'ai particulièrement apprécié tout le détail mis sur le code dans la feuille Excel


En effet, si une formule renvoie "" (chaîne de longueur nulle), votre formulation autorisera son écrasement. À vous de décider si vous souhaitez ou non ce résultat.
Autre remarque, ce contrôle de contenu peut être effectué plus tôt : ça ne pourra qu'accélérer l'exécution.
Pour plus de détail, voir le classeur joint.

Merci, je ne connaissais pas ce code et je n'avais effectivement pas pensé à ce cas de figure

Maintenant que la macro est achevée, je vais l'implanter dans mon tableau.


MaPomme, je crois que tu n'est pas sur le Forum en ce moment
Outre la fin de ta tentative partielle de retour en arrière,
Je souhaiterais savoir pourquoi tu a mis ta macro au niveau du classeur et non sur une feuille

J'ai voulu transformer ta macro pour la mettre dans une seule feuille
Mais curieusement après plusieurs essais, pour que cela fonctionne, il m'a fallu mettre une partie dans la feuille et une partie dans le classeur ???

Le résultat est au rendez-vous, mais je ne comprends pas le pourquoi ?

Code:
Option Explicit

Private Sub Worksheet_Deactivate()
  If CliqueDroitCopierColler Then ActifInactif
  Application.DisplayStatusBar = InitDisplayStatusBar
End Sub

Private Sub Worksheet_Open()
  InitDisplayStatusBar = Application.DisplayStatusBar
  ActifInactif
End Sub

Private Sub Worksheet_BeforeClose(Cancel As Boolean)
  If CliqueDroitCopierColler Then ActifInactif
  Application.DisplayStatusBar = InitDisplayStatusBar
End Sub
Option Explicit


Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Target.Count = 1 And Not Intersect(Target, Range("N:AB")) Is Nothing Then
If CliqueDroitCopierColler Then
If CelluleChoisie Is Nothing Then
Set CelluleChoisie = ActiveCell
Application.StatusBar = "Copier/clique-droit Actif - coller"
Cancel = True
Else
OldFormula = ActiveCell.FormulaLocal
OldAddress = ActiveCell.Address(, , , True)
If ActiveCell = "" Then CelluleChoisie.Copy ActiveCell
Set CelluleChoisie = Nothing
Application.StatusBar = "Copier/clique-droit Actif - sélectionner"
Cancel = True
End If
Else
Application.StatusBar = False
End If
End If
End Sub


A+
 
Dernière édition:

Discussions similaires