Saisie "réciproques"
Bonjour à tous,
Je souhaite développer une application mais suis bloqué sur une action dont je ne connais pas la faisabilité.
Le principe est de mentionner la même donnée dans deux cellules en n'utilisant que celles-ci. C'est la dernière inscription qui est retenue.
Exemple :
Soit la case A1 de la feuille_1 et la case B1 de la feuille_2.
Quand j'inscris par exemple 50 dans la case A1 de la feuille_1, la case B1 de la feuille_2 reprend automatiquement le même montant soit 50.
Ensuite quand j'inscris dans la case B1 de la feuille_2 par exemple 60, cela est reporté automatiquement dans la case A1 de la feuille_1 à la place des 50 inscrits initialement.
C'est donc la dernière donnée validée dans l'une des cases qui s'inscrit dans les deux cases.
Pensez-vous que c'est possible ? Si oui comment faire ?
Merci beaucoup
Marc
Merci beaucoup Timothé.
J'essaie et te tiens au courant.
Ça m'aide énormément.
Merci encore
Merci beaucoup Timothé. Cela fonctionne parfaitement et c'est exactement ce que je voulais.
Si je peux me permettre, pour que ce fichier soit utilisé par d'autres personnes, puis-je utiliser la sauvegarde en .XLSX ou dois-je utiliser .XLSM ?
Car j'ai du mal à sauvegarder les macros qui sont systématiquement désactivées quand je change d'ordinateur lorsque le fichier est en .xlsx. A moins que je doive faire une autre manipulation pour tout sauvegarder.
Merci beaucoup en tout cas pour la résolution de mon problème. C'était très gentil de ta part.
Marc
Bonjour, si tu enregistres un classeur utilisant les macros, il te faut le format .xlsm (Prenant en charge les macros, .xslx il me semble qu'il ne sauvegarde pas les macros) ou .xls (Microsoft Excel 97-2003) si vous utilisez des PC avec une version Excel de cette période.
Je joint la page d'assistance Office (Microsoft Excel) qui décrit les formats de sauvegarde :
Classeur Excel (.xlsx)
Format de classeur par défaut, de type XML pour Microsoft Excel 2008 pour Mac, Microsoft Excel pour Mac 2011, Excel 2007 et Excel 2010 pour Windows. Impossible de stocker du code macro VBA ou des feuilles macro Excel 4.0.
Classeur Excel 97-2004 (.xls)
Compatible avec les versions Excel 98 à Excel 2004 pour Mac et Excel 97 à Excel 2003 pour Windows. Préserver du code macro VBA et des feuilles macro Excel 4.0. Les macros VBA ne s'exécutent pas dans Excel 2008.
Classeur Excel prenant en charge les macros (.xlsm)
Format de classeur de type XML Microsoft Excel 2008 pour Mac, Microsoft Excel pour Mac 2011, Excel 2007 et Excel 2010 pour Windows qui préserve le code de macro VBA et les feuilles de macro Excel 4.0. Les macros VBA ne s'exécutent pas dans Excel 2008.
Quelle réactivité !
Merci Timothé. Je regarde et m'imprègne de cela.
Suite à ta réponse, j'ai rajouté dans la formule plusieurs lignes identiques correspondant à d'autres cellules sur d'autres feuilles et tout fonctionne très bien.
Merci encore de ta précieuse aide et bonne journée
Marc
Bonjour Timothé,
J'ai fait des essais simples et tout a fonctionné. Alors je l'ai mis en place sur l'application que j'essaie de faire.
Quand j'ai fini j'ai voulu faire des essais de vérification. Ça a marché dans un sens. J'ai voulu le faire dans l'autre. Cela fonctionne également mais cela prend plus de temps. Ensuite quand je clique sur une cellule le programme tourne dans le vide.
J'ai fait des copies d'écran (en pdf joint) avec les deux feuilles que je mettais en place et les codes y afférents.
Qu'ai je raté ?
Merci si tu peux jeté un coup d’œil et bonne journée.
Marc
Je pense qu'Excel apprécie moyennement de devoir faire énormément de procédures à chaque changement de cellules, il fait un copier coller des cellules concerné à haque changement de cellules. Après je ne sais pas trop comment réduire ce code vu qu'il n'y a pas une suite direct de cellules (ça m'est arrivé en aidant un utilisateur sur l'automatisation des informations d'un tableau en étiquettes et Excel effectuait son travail mais l'écran se figeait pendant plusieurs secondes (au moins 10), le temps que le programme traite 400 étiquettes de 5 cellules, soit 2 000 cellules (+mise en forme, redimensionnement, etc))
Du coup il faut peut être envisager de changer la condition pour la modification du contenu des cellules, par exemple, seulement au changement de feuille (lorsqu'on change de feuille Excel effectue le copier/coller des cellules. Déjà le ralentissement ne se ferait ressentir qu'à ce moment, ce qui serait moins génant.
Je ne suis même pas sur que placer les valeurs copiées dans un tableau variable diminuerait le ralentissement ...
Je vais continuer à regarder.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Range("A1").Copy Destination:=Worksheets("Feuil1").Range("B1")
ActiveSheet.Range("A2").Copy Destination:=Worksheets("Feuil1").Range("C2")
ActiveSheet.Range("A3").Copy Destination:=Worksheets("Feuil1").Range("D3")
ActiveSheet.Range("A4").Copy Destination:=Worksheets("Feuil1").Range("E4")
ActiveSheet.Range("A5").Copy Destination:=Worksheets("Feuil1").Range("F5")
ActiveSheet.Range("A6").Copy Destination:=Worksheets("Feuil1").Range("G6")
ActiveSheet.Range("A7").Copy Destination:=Worksheets("Feuil1").Range("H7")
ActiveSheet.Range("A8").Copy Destination:=Worksheets("Feuil1").Range("I8")
ActiveSheet.Range("A9").Copy Destination:=Worksheets("Feuil1").Range("J9")
ActiveSheet.Range("B1").Copy Destination:=Worksheets("Feuil1").Range("A1")
ActiveSheet.Range("C2").Copy Destination:=Worksheets("Feuil1").Range("A2")
ActiveSheet.Range("D3").Copy Destination:=Worksheets("Feuil1").Range("A3")
ActiveSheet.Range("E4").Copy Destination:=Worksheets("Feuil1").Range("A4")
ActiveSheet.Range("F5").Copy Destination:=Worksheets("Feuil1").Range("A5")
ActiveSheet.Range("G6").Copy Destination:=Worksheets("Feuil1").Range("A6")
ActiveSheet.Range("H7").Copy Destination:=Worksheets("Feuil1").Range("A7")
ActiveSheet.Range("I8").Copy Destination:=Worksheets("Feuil1").Range("A8")
ActiveSheet.Range("J9").Copy Destination:=Worksheets("Feuil1").Range("A9")
End SubJe n'ai pas plus de ralentissement que ça avec un code de ce genre sur les deux feuilles (sablier une demi seconde). Peut être est-ce le nombre de feuilles ouvertes, j'avoue que niveau ralentissement dossier ...
J'ai cru lire enregistrement, vous aviez juste enregistrer votre fichier ou une macro ?
Bonjour,
Quand j'inscris par exemple 50 dans la case A1 de la feuille_1, la case B1 de la feuille_2 reprend automatiquement le même montant soit 50.
Ensuite quand j'inscris dans la case B1 de la feuille_2 par exemple 60, cela est reporté automatiquement dans la case A1 de la feuille_1 à la place des 50 inscrits initialement.
Voici une version rapide (sans utiliser SelectionChange et sans risque de désactiver tous les événements) :
Dans un module, ajoute :
Global desactiver_eventDans la Feuil1, ajoute :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And desactiver_event = Empty Then
desactiver_event = True
Sheets("Feuil2").Range("B1") = Range("A1")
desactiver_event = Empty
End If
End SubDans la Feuil2, ajoute :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$1" And desactiver_event = Empty Then
desactiver_event = True
Sheets("Feuil1").Range("A1") = Range("B1")
desactiver_event = Empty
End If
End SubLa démo :
Cordialement,
Bonjour,
Ah ben non, pas assez rapide, sebastien a répondu.
eric
Merci Timothé d'avoir pris du temps.
En fait je me demande si j'ai bien enregistré les macros et correctement.
N'ayant jamais fait cela peut-être qu'elles portent le même nom et se neutralisent ou s'additionnent en boucle.
J'ai enregistré le fichier sous XLSM mais j'ignore où trouver le détail des macros et comment je les ai enregistrées. C'est peut-être là que ça coince.
Marc
Merci Sébastien et Eric pour vos interventions.
Sébastien, j'ai le sentiment que la formule est plus longue que celle de Timothé. Y a t-il une sécurité en plus ou y a t-il un moyen d'aller plus vite à l'écriture ?
Merci et bonne soirée
Marc
Sébastien, j'ai le sentiment que la formule est plus longue que celle de Timothé. Y a t-il une sécurité en plus ou y a t-il un moyen d'aller plus vite à l'écriture ?
C'est plus long mais c'est surtout très différent ...
J'ai utilisé Worksheet_Change au lieu de Worksheet_SelectionChange, ça agit donc lorsque tu modifies une cellule et non pas à chaque fois que tu changes de sélection.
Et ça vérifie aussi que c'est la bonne cellule qui est modifiée pour effectuer la saisie sur l'autre feuille seulement quand c'est nécessaire.
C'est une solution très "rapide" (télécharge le fichier démo de mon message pour t'en rendre compte).
Bonjour delacour,
La différence principale c'est que le code de Sébastien ne s'effectue plus à chaque changement de sélection ("clic" de souris sur une autre cellule), de ce fait la mise à jour n'est plus aussi contraignante que l'ancienne. Le changement ne s'opère que lorsque le contenu d'une cellule est changée.
Pour mieux comprendre, avec le code que je vous avais passé, à chaque changement de cellule, Excel effectuait le changement sur chaque cellule concernée (Il effectue tout le code de la macro). Sébastien a changé la condition de déclenchement de la macro et il a ajouté un test pour vérifier quelle cellule a changé et effectuer le changement que pour la cellule correspondante sur l'autre feuille.
Imaginez votre code comme une série de boutons protégés par un couvercles et avec un indicateur coloré au dessus, qu'est ce qui est le plus rapide ? Ouvrir tous les couvercles à chaque fois qu'il y a un changement et appuyer sur chaque bouton ? Ou vérifier si l'indicateur coloré (lampe,LED,...) d'un bouton à changer de couleur et lever un seul couvercle pour appuyer sur un seul bouton ?
en reprenant la méthode de Sébastien vous devriez avoir un code de ce genre
Dans un module à part :
Global desactiver_event
'Variable déclarée en globale qui permet d'activer ou désactiver le code en faisant passer son contenu de True à Empty dans le code de la feuilleSur la feuille concernée :
'Déclaration de la macro "évenenment"
Private Sub Worksheet_Change(ByVal Target As Range)
'Si la cible est la cellule A1 et que la variable désactiver l'événement n'est pas active (est vide), alors :
If Target.Address = "$A$1" And desactiver_event = Empty Then
'On désactive l'événement
desactiver_event = True
'On met le contenu de A1 dans B1 sur la Feuil2
Sheets("Feuil2").Range("B1") = Range("A1")
'On réactive l'événement (variable redevient vide)
desactiver_event = Empty
'Fin du Si
End If
'Et ainsi de suite pour chaque cas
If Target.Address = "$A$2" And desactiver_event = Empty Then
desactiver_event = True
Sheets("Feuil2").Range("B2") = Range("A2")
desactiver_event = Empty
End If
If Target.Address = "$A$3" And desactiver_event = Empty Then
desactiver_event = True
Sheets("Feuil2").Range("B3") = Range("A3")
desactiver_event = Empty
End If
End SubFaut vraiment que j'arrète de faire le prof, ça me va très mal ^^
Si j'ai mal interprété Sébastien, n'hésite pas à me corriger
Bonjour Timothé
Contrairement à ce que tu penses, tu es un bon prof. J'ai tout compris.
Ça ne veut pas dire que tout fonctionne chez moi.
Plutôt que des mots, voici un fichier. A chaque fois il me dit qu'il faut débloguer alors que les sommes sont bien modifiées dans les cases.
Si cela ne marche pas dans mon fichier "normal" c'est peut-être parce qu'il y a trop de calculs dans la feuille. Il y a beaucoup de formule avec SI ( ET(....; SI (ET... Faisant référence à des données figurant sur d'autres feuilles.
Peut-être est-ce cela qui ralentit les calculs de la feuille. Comme je ne sais quels sont les calculs qu'il fait en premier, ceux qu'il fait ou ne fait pas quand on modifie une variable...
Peut-être devrais-je faire les calculs sur une autre feuille pour alléger celle comportant des macros, et ne mettre sur le reste de la feuille que des reports des calculs faits ailleurs.
Cela peut-il avoir une incidence ? Je n'ai pas pu envoyer mon fichier de travail car il est de 600 k et je ne peux pas le télécharger.
Merci
Marc
Bonjour Marc,
le code est le bon, vous avez juste omis de placer la ligne de code déclarant la variable desactiver_event dans un module (Global, pour qu'elle puisse être utilisée dans plusieurs feuilles, modules, macros et surtout en dehors de la "page" VBA où elle est déclarée :
Global desactiver_event
Excel vous insultait, en tout bien, tout honneur, parceque vous lui demandiez d'utiliser une variable non déclarée, Excel peut "deviner" certaines choses mais il a ses limites (on peut effectuer une tache sans en comprendre l'intégralité, mais on sera moins efficace : "Là j'appuie sur ce bouton et ça fonctionne. Pourquoi ? Je ne sais pas, ça a toujours fonctionné comme ça..."
Désolé de la réponse tardive, j'ai été absent tout le week end.
Un extrait du cours en liens situé en dessous pour expliquer la différence entre les différentes déclarations de variables
Pour pouvoir utiliser une variable dans toutes les procédures d'un module, il suffit de la déclarer en début de module. De plus, cela permet de conserver la valeur de la variable jusqu'à la fermeture du classeur.
Dim var1 As Integer
Sub procedure1()
' => Utilisation de var1 possible
End Sub
Sub procedure2()
' => Utilisation de var1 possible
End Sub
Même principe pour utiliser une variable dans tous les modules, à la différence près que Dim est remplacé par Global :
Global var1 As Integer
Super, Merci Timothé.
Je vais revoir cela de près. Les modules sont vides et j'ai inscrit les codes directement sur une feuille. Bien que ces modules soient vides il faut les désactiver. Et comme j'avais fait des essais je vois que j'en ai 9 ! Si c'est bien cela, pas étonnant que tout patine dans la choucroute !
En tout cas j'ai surtout compris que je dois travailler les bases du cours VBA. Je vais m'y afférer et te remercie de m'en avoir fait prendre conscience.
Merci beaucoup aussi pour ta patience.
Marc
Le module va te permettre d'écrire une macro en dehors de ta feuille et de l'appeller quand tu le souhaites en inscrivant son nom dans le code sur la ou les feuilles de ton choix (si elle est déclarée convenablement).
Cela s'avère très pratique si tu as besoin d'utiliser une macro plusieurs fois dans ton code, surtout si la procédure est longue (avec une bonne utilisation des macros, tu passes d'un code de 10 lignes répétés dans 3 étapes de ton code, à 3 lignes pour annoncer au code de faire cette macro dans ces 3 cas, tu passes de 30 lignes sur la même feuille, à 3 lignes sur la feuille + 10 lignes de la macro dans un module.
Le code est plus lisible et si tu donnes un nom représentatif à ta macro, tu retrouves immédiatement sa fonction et ce qu'elle fait quand tu te relis.
Après lorsqu'un module n'est pas utilisé, vous pouvez le supprimer. (Si vous avez besoin d'en créer un, clic droit sur la ligne VBAProjectTruc -> insertion -> module; situé en haut de la liste des feuilles et des modules, à gauche)
Merci Timothé,
C'est très clair. Très bon prof !
Je mets en application.
Bonne journée
Marc
