Utilisation de Worksheet_change
La macro est à insérer dans le module de la feuille fiche_releve, même si elle a pour but d'intervenir ailleurs.
Et on commence logiquement par définir s'il y a lieu d'intervenir, c'est à dire si le changement intervient dans la plage conduisant à une intervention.
Cela se fait le plus souvent sous la forme : If Not Intersect(Target, plage) Is Nothing Then
ou : If Intersect(Target, plage) Is Nothing Then Exit Sub
mais il y a quantité de formulations possibles à voir cas par cas.
Bonjour.
Je suis désolée mais je ne m'en sors toujours pas. J'ai essayé d'insérer ma macro avec votre méthode dans la bonne feuille mais les erreurs s'affichent les unes après les autres et je n'arrive toujours pas au résultats souhaité...
Voilà le code que j'ai actuellement dans la feuille "fiche_releve"
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Target, Range("G6:Q23")) Is Nothing Then
Dim i%, j% 'défini les variables
j = 1
With Sheets("Valeurs")
For i = 3 To 14
If WorksheetFunction.CountBlank(.Range(.Cells(i, 29), Cells(i, 37))) < 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 If
Application.ScreenUpdating = True
End SubTel quel, le logiciel m'affiche une erreur à ce niveau
If WorksheetFunction.CountBlank(.Range(.Cells(i, 29), Cells(i, 37))) < 9 ThenQuand je met cette ligne en commentaire, la macro tourne. Quand j'écris dans la plage délimité sur ma feuille "fiche_releve" je constate bien que quelque chose se passe car la page excel se "rafraîchi", mais là seule chose que je constate c'est que ça efface tout dans ma feuille "BDD" ...
Pouvez-vous m'aider car là je ne m'en sors vraiment pas...?
Merci !!
Bonjour,
Il faudrait comprendre ce que tu veux faire !
Apparemment, à chaque changement, tu transfères tout le tableau de Valeurs vers BDD, il est naturel qu'il se substitue au précédent !
Comme je l'ai dit, cela peut être fait autrement de façon plus économique, mais si c'est autre chose que tu cherches à faire, il faut dire quoi !
Bonjour le fil, bonjour le forum,
Aïe Julia ! Là tu nous l'as énervé Maître Ferrand !... Va falloir du Rhum charrette pour le calmer...
Bonjour,
comme le dit MFerrand, à chaque transfert, le nouveau tableau remplace le précédents.
si j'ai compris ce que vous voulez et le code , je pense qu'il faudra remplacer le variable "j" qui est réinitialiser à chaque exécution par le "dernier ligne non null de la feuille bdd +1" pour écris à la suite
JuliaM a écrit :Tel quel, le logiciel m'affiche une erreur à ce niveau
If WorksheetFunction.CountBlank(.Range(.Cells(i, 29), Cells(i, 37))) < 9 Then
l'erreur ici est normal , vous indiquer a excel une plage de valeur qui commence sur une feuille et qui se termine sur un autre feuille, il manque un point avant le 2eme cells
Salut ThauThème, Minanse
Trop tôt pour le Charette
Minanse a raison (sur l'erreur aussi), mais si on ne veut pas supprimer dans BDD, il faut inscrire en-dessous... Sauf que ne s'agissant pas de données "additives" (passez-moi la qualification
En tout cas, sans intervenir sur la finalité de la chose, il vaudrait mieux savoir ce que l'on veut faire pour le faire comme on le veut.
Actuellement, lorsque j'écris une valeur dans une case de ma feuille "fiche_releves", cette valeur s’écrit automatiquement dans la feuille "valeurs" grâce aux formules " =Fiche_releve!G6&"" " par exemple.
Ce que je voudrais faire "simplement" c'est qu'à chaque valeur écrite dans la feuille "fiche_releves", ça l'écrive en même temps dans la feuille "bdd" via une macro mais je veux pouvoir la modifier si besoin ou ne pas remplir toutes les cases dans l'ordre. (d'ou le fait que je ré-importe toutes les valeurs à chaque fois).
Ce que je ne comprends pas par rapport à vos commentaire, c'est que lorsque je déclenche la macro postée plus haut avec un bouton placé sur ma feuille "valeurs", tout fonctionne comme je le souhaite. Tout ce que je voudrais moi, c'est que ça se fasse automatiquement à l'écriture d'une valeur dans la feuille "fiche_releves"...
Je suis désolée si je ne vous semble pas claire du tout.... Je fais au mieux.
je crois que j'ai compris le problème
à mon avis un macro événement (ici Worksheet_change) s'exécute avant une formule (information à vérifier)
lors de l'exécution de la macro la formule d'import sur la feuille "valeurs" n'a pas encore exécuté donc arriver à cette ligne :
If WorksheetFunction.CountBlank(.Range(.Cells(i, 29), .Cells(i, 37))) < 9 Then la feuille "valeurs" est encore vide donc ne respect pas la condition , on boucle et on sort du code
fin de mon histoire
Ma proposition
1) Nommer le tableau de la feuille Valeurs concernée (j'ai nommé TValeurs)
2) La macro évènementielle Change sur la feuille Fiche_releve :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G6:Q23")) Is Nothing Then
With [TValeurs]
Worksheets("BDD").Range("A2").Resize(.Rows.Count, .Columns.Count).Value = .Value
End With
End If
End SubPas d'autre variable
Pas de copier-coller
Action générée par une seule ligne de commande
Aucun besoin d'inhiber l'affichage, on n'est pas sur la feuille impactée
(NB- Pas de problème de calcul, si calcul auto, le tableau sera à jour.)
Là cela affecte tout le tableau ! Si on ne le veut pas, il faut apporter quelques modifications : aux formules pour que l'affichage de valeurs sur les 3 premières colonnes n'intervienne que si des valeurs sont affichées dans les 9 suivantes, à la plage nommée pour qu'elle soit dynamique...
En tout cas cette macro fonctionne efficacement sans effets colatéraux !
Cordialement.
Merciiiiiiiiiiiii !!!!!!!!!
Je vais pouvoir appeler la plage "Charette"
Bonjour,
Je suis désolée mais je viens encore quémander votre aide...
Le code proposé par MFerrand fonctionne parfaitement (encore merci !). Cependant, un petit détails que je n'avais pas précisé me bloque encore la route...
Mon fichier est tel que lorsque je l'ouvre il me propose soit de continuer les relevés déjà entamés, soit d'en débuter de nouveaux. Si je choisi nouveau, tout fonctionne à merveille. Or si je choisi de continuer, cela va me copier une deuxième fois les valeurs notés précédemment.
Lors de la "connexion", si je choisi de continuer, le numéro d'affaire sera le même, mais j'ai la possibilité de changer la date ainsi que l'identifiant. Je voudrais donc que les valeurs qui s'inscrivent dans la base de données soient donc celles que je n'avais pas renseignées avant et qu'elle dispose du nouveau nom et date si ils ont changés.
Je vous mets le fichiers tel qu'il est actuellement, j'ai apporté quelques modifications depuis la précédente version...
J'espère avoir été assez clair dans ce que j'explique.
Merci !!
Une autre petite chose tant que j'y suis...
Je viens de constater que lorsque j'entre un nombre décimal avec trop de décimal, la valeur copiée automatiquement dans la feuille BDD perd sa virgule... Comme l'illustre cette capture d'écran...
Une idée d'ou cela peut provenir ? Et comment je peux le régler ?
Merci
Bonjour,
Il y en a un de trop ! A part ça quel est le problème, puisque la précédure évènementielle ne réagit qu'aux changements en G6:AG23.
La sortie des Userforms n'a donc aucun impact. Seule l'entrée pour nouveau en a un puisqu'on efface cette plage, ce qui doit se traduire par l'effacement du tableau sur BDD...
Après à chaque valeur saisie dans la plage précitée, le tableau sera renouvelé, mais de la même façon, qu'on ait opté au départ pour nouveau ou continuer. Il n'y a aucune différence !
Cordialement.
Problème de décimales ? Cela ne se produit pas dans le classeur que tu as mis ! Les cellules y sont au format Standard.
Vois si tu as modifié le format de cellule...
Pour revenir au problème précédent, tu as opéré une modification dont tu n'as pas fait état ! Tranformation de la plage de Valeurs en tableau Excel ! Le nom de la plage est devenu nom du tableau...
Parallèlement, le tableau de BDD, déjà tableau Excel a démesurément grossi, on se demande comment.
Vu ce contexte nouveau !! il serait sans doute bon que la procédure efface complètement Tableau1 à chaque opération, avant de réinscrire...
Cordialement.
Bonjour,
Sur le userform "nouveau", les données de la feuille "fiche_releves" s’effacent, et des lignes s'insèrent dans la feuille "BDD" (justement pour ne pas qu'elles soient écrasées par celles qui vont être copiées, et choses que je n'avais pas précisé ... Autant pour moi
Sur le userform "continuer", seules les plages destinées à la date et à l'identifiant s'effacent pour qu'on puisse les changer si besoin. Les valeurs rentrées lors de la précédente sauvegarde sont toujours là. Ce qui permet de continuer de rentrer des valeurs pour une même "affaire".
Par exemple, aujourd'hui je rentre les données suivante dans la feuille "fiche_releves"
Et j'obtiens dans la feuille "BDD" :
Ensuite je ferme le fichier, qui s'enregistre, supprime les lignes vides de la bdd et insère automatiquement des lignes au dessus des valeurs à enregistrer.
Demain, je réouvre ce même fichier, et je choisi "continuer". Je continue alors de renseigner des valeurs en plus de celles renseignées aujourd'hui.
Dans la BDD j'obtiens :
Mon soucis est donc que je ne voudrais pas que les données surlignées en jaune se copient une deuxième fois. Ou si elles se copient, je voudraient pouvoir les supprimer automatiquement ensuite.
Pour mon problème de décimale. Le format de cellule n'a pas changé. Et j'ai le même problème dans mon fichier original que dans celui que j'ai partagé ici
Merci.
Je crois que je m'y perd !
Le décimales : si le format est standard, reste standard, on ne voit pas ce qui les affecterait, et je n'ai d'ailleurs pas vu que lors d'une saisie quelconque, le nombre saisi se multipliait de mui-même !
La procédure évènementielle active, qui est celle que j'avais proposé aboutit à aligner à chaque changement le tableau BDD sur le tableau Valeurs !
Il est évident que cette procédure est incompatible avec des manoeuvres parallèles aboutissant à préserver des données sur BDD et en augmentant le nombre de lignes de ce tableau...
Comme je l'ai dit au départ, l'aboutissement auquel on veut parvenir se règle dans cette procédure...
Rien n'interdit des manipulations de BDD autonomes mais dès lors qu'on dissocie son dimensionnement de celui du tableau de Valeurs, cela perturbe... Je préconisais donc que la procédure d'évènement procède systématiquement à l'effacement complet du tableau BDD avant d'y sustituer le nouveau tableau issu de Valeurs ! Ce qui clarifierait !
Le code des Userforms n'a aucune incidence sur les phénomènes constatés dans le tableau BDD. Les procédures qui en ont une sont liées à des boutons, donc n'interviennent que sur action de l'utilisateur.
Il est possble qu'elles soient responsables de la situation non voulue constatée (mais je ne les ai pas lues, et ne les lis pas, les considérant comme illisibles !)
Cordialement.
Comment expliquer mon problème de virgule alors ? Je n'ai rien touché de ce côté là et ça me fausse toute mon analyse par la suite...
Le problème c'est que la feuille bdd doit, comme son nom l'indique, servir de base de donnée. Donc je souhaite impérativement garder toutes les données qui s'y insèrent.
Maintenant que ma problématique est plus claire (j'espère
Merci
Les données de la feuille ..._releves étant répercutés dans le tableau Valeurs, lequel est répercuté dans BDD, je ne comprend pas bien ce qui devrait être conservé, si les données de BDD doivent correspondre aux relevés...
Quant aux virgules, explique comment tu obtiens ton résultat de virgules volatiles, car la saisie répétée dans les cellules ne permet pas de l'obtenir !
Cordialement.