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 !
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
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.
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...
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 ?
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 !
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...
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...
[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...
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