Utilisation de Worksheet_change

Bonjour à tous.

Il y a quelques jours je suis venue vous demander de l'aider afin d'écrire une macro qui permet de copier des cellules d'une feuille à l'autre. Cette macro fonctionne très bien au clique d'un bouton. Or, je voudrais qu'elle s'exécute dès qu'une de mes cellules change. J'ai donc pensé à utiliser l'événement Worksheet_change mais je ne dois pas l'utiliser correctement car ça ne fonctionne pas....

Actuellement mon code ressemble à ça :

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim i%, j% 'défini les variables

        j = 1
        With Sheets("Valeurs")
             For i = 3 To 14
                If WorksheetFunction.CountBlank(.Range(.Cells(i, "AC"), Cells(i, "AK"))) < 9 Then ' vérifie si la cellule est vide, si oui passe à la suivante
                j = j + 1
                .Range(Cells(i, 25), Cells(i, 37)).Copy 'copie la cellule
                Sheets("BDD").Cells(j, 1).PasteSpecial xlValues 'colle la copie dans bdd
                Application.CutCopyMode = False
                End If
            Next
        End With
End Sub

Ce code était à la base dans un module et qui s'activait au clique bouton. Ce qui est délicat c'est que je travaille sur deux feuilles différentes. J'ai donc mis ce code dans la worksheet de ma feuille "valeurs", feuille à partir de laquelle je veux copier mes donner.

Merci d'avance pour votre aide !!!

Bonjour,

à tester :

ajouter

 Application.EnableEvents = True 

dans le

Private Sub Workbook_Open()

End Sub

Bonjour,

Merci de votre réponse. Mais ça ne marche pas :/

question bête mais sa arrive parfois ^^ :

vous avez mis le code dans un module ou sur la feuille directement ?

Pas bête du tout car je ne suis pas très douée, donc le pb peut venir de là...

A la base il était dans un module, pour que je puisse le lier au bouton.

Maintenant, je l'ai mis dans ma feuille "valeurs".

comme le code est directe dans la feuille en question il est donc inutile de mettre

with sheets("nomDeFeuille")

j'ai fait quelque test et quand j'utilise "with + nom de la feuille dans laquelle est situer le code " j'ai un erreur qui empèche l'exécution

et m'affiche "erreur d'exécution '-2147417848 (80010108)' "

donc essaye ton code en enlevant le "with"

Ca ne marche pas non plus.

En fait, les cellules que je veux récupérer contiennent une formule qui récupère la valeur d'autres cellules. Visiblement, votre code fonctionne si j'écris à la mains dans mes cellules de la feuille valeur. Mais ca ne fonctionne pas sinon.

Mon fichier est ici, ça sera peut être plus simple... https://www.cjoint.com/c/FFBioDEldBZ

Merci !!

Bonjour,

en faite je n'ai absolument rien modifier et cela fonctionne sur ma version ^^


j'ai du par contre activer les macro car elle étai toute déactiver

pour vérifier cela mettre un msgbox au début du code et faire une modification quelconque pour voir si le code est bien exécuter ou pas

Effectivement rien ne se passe non plus quand je rajoute un MsgBox.... Pourtant mes autres macros fonctionnent. Je ne comprends vraiment pas là...

aller dans "l'onglet développeur" puis "sécurité macro" et activer toute les macros puis reteste =) (sous excel 2007) mais vous pouvez touver la manip rapidement pour votre version

J'ai trouvé la manip (idem que sur votre version).

Mais ça ne fonctionne toujours pas

Alors la je sais pas trop comment vous aider vu que chez moi sa fonctionne très bien (sans aucune modif), je regarde sa et si je trouve une information utile je le posterai ici ^^

Ca marche, merci !!!

Une verif cependant. Ce qui fonctionne chez vous c'est bien l'écriture automatique dans la feuille nommée "BDD" lorsqu'on écrit dans la feuille nommée "fiche_releve" ?

Bonjour,

Tu pouvais mettre ton fichier directement sur le site, vu son poids...

Si tu mets en place une procédure Change dans ta feuille Valeurs, c'est pour qu'elle réagisse à un changement dans cette feuille...

La première question à se poser est : qu'est-ce que tu changes qui doit déclencher la macro ?

De façon à contrôler l'exécution, d'abord... Ce que tu ne fais pas... mais tu te préoccupes de tester une plage de cellule pour copier une ligne s'il y a des valeurs dans une partie de cette ligne...

Tout cela n'est pas très clairement défini !

On constate que toute cette plage est sous formules : donc ce n'est de cette plage que viendra un déclenchement de procédure Change !!! D'où est donc censé venir le changement déclencheur ?

C'est la première questioon à laquelle il faut répondre.

Par ailleurs ton code, mélange de procédures manuelles et de code enregistré n'est pas vraiment satisfaisant !

Quelque commentaires :

Un bon point pour la déclaration des variables, un autre pour l'utilisation de With... End With, mais tu peux apprendre que lorsque tu te trouves dans un module d'objet (dédié à cet objet), tu peux utiliser le mot-clé Me pour désigner ledit objet. Me sera la feuille dans un module de feuille, le classeur dans ThisWorkbook, le Userform dans un module de Userform.

L'utilisation de fonctions de feuille de calcul en VBA, si elle peut parfois s'avérer pratique n'est pas forcément ce qu'il y a de mieux : je dirais que c'est plutôt un pis-aller... Il y a lieu de parier qu'une boucle sur tes 9 colonnes avec sortie dès qu'une valeur est rencontrée (moyen purement VBA) serait plus rapide ! D'autant que si les cellules ne peuvent être servies que dans l'ordre, un test sur la première serait suffisant...

La syntaxe de la méthode Cells prévoit son utilisation avec des nombres (numéro de ligne, numéro de colonne)... Cela marche bien sûr la plupart du temps avec des lettres de colonnes mais ce n'est pas la syntaxe prévue et tu risqueras de chercher le jour où ça ne marchera pas... Je passe sur Sheets qui englobe d'autres objets que Worksheets (il est bon de ne pas l'oublier non plus).

Le copier-coller valeurs est une méthode à laquelle tu es astreinte en manuel, mais pas en VBA : plage2.Value = plage1.Value permet le même résultat sans transiter par le presse-papier (éventuellement passage par une variable pour fiabiliser l'opération...)

Quand à CutCopyMode = False, tout droit sorti de l'enregistreur, si tu es capable de me dire le pourquoi de cette commande et quels sont ses effets... ? (car si tu le savais, tu ne l'utiliserais jamais dans les cas où l'enregistreur te la reproduit !)

Cordialement.

oui c'est bien sa qui fonctionne chez moi (je n'est tester que sa en même temps)


mettre sa au début de la méthode c'est mieux pour les yeux :p

Application.ScreenUpdating = False

heu......... non désolé j'ai mal lu ton message

j'écris bien dans la feuille "valeurs"

@MFerrand

Merci de ta réponse. Je dois dire que cela fait à peine une semaine que je fais du VBA et je suis loin, très loin, de comprendre toutes les subtilités du langage...

J'imagine que pour un habitué, mes bous de codes ne ressemblent pas à grand chose, mais j'avoue que lorsque j'obtiens une macro qui fais ce que je veux, je ne me pose pas vraiment plus de questions... Une partie de mon code m'a d'ailleurs été soufflée par un autre habitué du forum. (dont la fonction CutCopyMode .... dont j'ignore l'utilité)

Quand à ce que je souhaite faire, j'ai effectivement constaté que le fait que rien ne se passe avec ma commande Worksheet_change vient du fait que dans la feuille ou je souhaite récupérer mes valeurs je n'écrits pas manuellement mais je récupère les données avec une formule. J'ai donc essayé de déplacer cette macro dans la feuille "fiche_releves" ou j'écris à la main. Mais sans succès.

Si tu es disposé à m'éclairer, ça sera avec grand plaisir que j'écouterai tes conseils.

Pour expliquer plus en détails ce que je souhaite faire...

Je voudrais écrire manuellement des valeurs dans la feuille "fiche_releve" et je voudrais qu'elles s'écrivent en même temps dans la feuille "BDD" qui devra me servir de base de donnée (seules ces valeurs là seront enregistrées à la fermeture du fichier).

J'ai crée la feuille valeurs afin d'ordonner les valeurs de la feuille "fiche_releve" que je souhaite récupérer... (elle me servira aussi par la suite à tracer des graphique en reprenant les valeurs stockées dans la feuille "BBD".

Si tu as une idée, un conseil, n'hésite pas. Merci.

@minanse

Avec les explications de MFerrand, il semble logique du coup que cela ne fonctionne pas pour faire ce que j'attend exactement.

Il faudrait que tu circonscrives les emplacements où tu écris dans fiche_releves, qui doivent lancer une opération de transfert entre Valeurs et BDD...

Je pensais bien que tu étais débutante, et je dois dire que j'ai été un peu chercher la "petite bête" mais ce n'est pas inutile pour assimiler la bonne syntaxe...

En tout cas, l'explication du fameux CutCopyMode reproduite à partir de code enregistré par tous ceux qui n'en connaissent pas la signification mérite un détour (utile pour apprendre).

Cette commande à pour effet de vider le presse-papier !

Pourquoi l'enregistreur l'enregistre-t-il ?

Si tu as observé ce qui se passe quand tu fais une copie manuellement dans Excel (la zone copiée s'entoure d'un pourtour scintillant)

dès que tu passes à une autre action le scintillement cesse. S'il s'agissait d'un faux mouvement avant de coller, tu es obligée de copier à nouveau car le presse-papier a été vidé. Il se vide facilement quand tu travailles !

Et donc si tu opères semblablement en enregistrant du code, l'enregistreur enregistrera qu'à un moment tu as vidé le presse-papier !

Ce sont les mouvements enregistrés qui l'ont provoqué, et qui le provoqueront de la même façon en s'exécutant à nouveau !

Autrement dit, en le laissant tu doubles une opération déjà accomplie !

A quoi cela peut-il servir alors ?

Deux utilités clairement répertoriées : si tu fais un copier-coller par macro et qu'immédiatement derrière tu fermes le classeur, tu auras un message te demandant si tu veux conserver le contenu du presse-papier, cette commande permet alors de l'éviter.

Et aspect esthétique : après un copier-coller tu redonnes la main à l'utilisateur et lequel se trouve juste face à la zone copiée qui continue de scintiller. Il est élégant de lui ôter ce scintillement...

Autrement dit, quand la commande est utile, elle n'est jamais mise par l'enregistreur, et vice-versa !

MFerrand a écrit :

Il faudrait que tu circonscrives les emplacements où tu écris dans fiche_releves, qui doivent lancer une opération de transfert entre Valeurs et BDD...

Que veux-tu dire par là exactement ?

D'accord, merci pour l'explication du CutCopyMode. J'avais bien remarqué le contour pointillé qui s'affiche lorsque le CutCopyMode n'est pas désactivé. Mais justement, ça m'arrangeait bien de ne plus le voir. A terme mon fichier excel est destiné à d'autres personnes pour qui je dois simplifier au maximum les entrées de valeurs et les opérations à effectuer pour obtenir les résultats souhaités...

La plage dans laquelle tu écris, qui doit être prise en compte pour intervenir... Il est toujours souhaitable de la délimiter, d'autant plus que tu ne peux maîtriser l'opération qu'à partir de cette plage.

A quoi devrait ressembler le code pour cela ?

De plus, j'en conclue qu'il faut que j'active ma macro lorsque j'écris dans la feuille "fiche_releve", mais je ne sais pas ou l'insérer, ce que j'ai tenté ne marchant pas...

Rechercher des sujets similaires à "utilisation worksheet change"