Utilisation de Worksheet_change

Je souhaite conserver les donnés qui sont écrites dans la feuille BDD.

Elles ne passent dans la feuille valeur que pour être mise en forme. Une fois dans la base de données BDD je souhaite juste que toutes les valeurs soient conservées pour qu'à la prochaine utilisation de la feuille, les nouveaux relevés continuent d'incrémenter la base de données.

Pour les virgules, je ne fais rien d’exceptionnel.. A savoir, si je note dans une case de la feuille fiche_releve, 2,5 cela va bien écrire 2,5 dans la feuille BDD.

Par contre, si j'écris 2,4999 dans la feuille fiche_releve cela va écrire 24999 dans la BDD. (alors que dans la feuille valeur cela écrit bien 2,4999). Donc je ne comprends pas...

Merci

Pour cette histoire de décimale, j'ai beau taper, je ne constate nullement le phénomène ! Les nombres sont bien tels qu'ils doivent être...

La seule chose qui ressort est les MFC mériteraient une révision complète...

JuliaM a écrit :

Je souhaite conserver les donnés qui sont écrites dans la feuille BDD.

Elles ne passent dans la feuille valeur que pour être mise en forme. Une fois dans la base de données BDD je souhaite juste que toutes les valeurs soient conservées pour qu'à la prochaine utilisation de la feuille, les nouveaux relevés continuent d'incrémenter la base de données.

Par contre ici, tout n'est pas clairement établi...

1) La fiche relevé comportait 11 colonnes, le tableau Valeurs 11 lignes dans la première version de fichier que j'ai observée. Dans la dernière, on est passé à 27 colonnes et 27 lignes... il y a toujours donc une correspondance bien établie entre les deux.

On avait alors un tableau BDD résultant non défini mais qui sous l'effet de la macro se dimensionnait à 11 lignes...

2) Par contre le tableau BDD actuel de la dernière version ne fait plus 27 lignes, il en fait 50, donc pas non plus 27 x 2 = 54, ce qui aurait pu être cohérent.

Là il y a donc une incohérence...

3) Si on consière que le tableau Valeurs demeure le reflet réorganisé de la fiche de relevé : durant l'établissement d'une fiche, tant qu'on n'est pas passé à une nouvelle, le remplacement du tableau BDD à chaque changement se justifie. Les valeurs qui n'ont pas changé seront reproduite à l'identique lors du changement...

Pas de souci particulier à ce niveau...

4) Une question survient donc lorsqu'on passe à une nouvelle fiche : l'effacement de la fiche précédente se répercute sur le tableau Valeurs, et conduira à effacer l'ancienne fiche du tableau BDD...

Alors, hypothèse [je dis bien hypothèse car ton propos ne l'a jamais formulée ainsi avec limpidité en distinguant chaque fiche de relevé en tant que telle...], hypothèse donc que l'on veuille conserver les données de l'ancienne fiche, il y a alors 2 solutions :

  • soit on reproduit la fiche ailleurs pour la conserver, avant de l'effacer !
  • soit si on veut que ce soit dans BDD qu'elle soit conservée, on peut effectivement introduire 27 lignes (minimum) pour la mettre hors de portée de l'action de la macro.
Mais cette insertion de 27 lignes doit alors se faire sur la commande "Nouveau", avant effacement de la fiche...

Cordialement.

1) En effet, entre le premier fichier posté et celui ajouté tout a l'heure il y a eu quelques modifications comme je l'ai précisé dans mon message. Mais j'avais adapté votre code à ces modifications, ce qui ne me posait donc pas de problème.

2) La fichier vierge de base ne comporte aucune ligne dans le tableau bdd. Lorsque j'écris dans la feuille "fiche_releve", les 27 lignes de celle-ci s'affichent automatiquement dans bdd. Si je clique sur "sauvegarder et quitter" la macro liée à ce bouton va alors repérer les ligne vides et les supprimer, puis insérer 27 autre lignes vides au dessus qui permettront aux nouvelles valeurs de s'écrire dans la base de données sans écraser les autres. D'ou le fait que dans le fichier que je vous ai transmis la calcul ne tombe pas bon. Pour illustrer ma demande j'avais rempli quelques valeurs en espérant que ça soit plus clair.

4) Oui jusque là c'est logique et ça ne me pose pas de problème dans la mesure ou j'insère de nouvelles lignes dans ma base de donnée afin de ne pas effacer les anciennes valeurs en écrivant les nouvelles.

Enfin, ce n'est pas une hypothèse, mais bien ce que je souhaite depuis le début, à savoir, conserver mes valeurs dans la feuille bdd sans les écraser.

La raison pour laquelle je n'ai pas mis l'insertion de nouvelles lignes avec la commande nouveau (parce que cela avait été ma première idée et cela fonctionnait très bien) vient du fait que si je choisi de continuer mes relevés, je conserve les valeurs notées dans la feuille "fiche_releve" mais je souhaite pouvoir modifier le nom de l'opérateur et la date. Dans les cases repérées ici. (je viens de m'apercevoir qu'elles n'apparaissent pas dans le deuxième fichier que je vous ai transmis... )

capture

De fait, en prenant en compte ce paramètre, la seule solution que j'ai trouvé est donc de supprimer les lignes vides de la colonne E à M dans BDD puis d'insérer au dessus 27 ligne quelque soit le schéma qui suivra.

Si je choisi nouveau à l'ouverture pas de soucis.

Si je choisi continuer, je souhaite conserver dans la base de donnée seulement les valeurs qui ont étés rajoutées.

Ce fichier excel doit servir à des opérateurs machines, il doit être simplifié au maximum pour ne pas leur alourdir le travail. Plusieurs opérateurs peuvent travailler sur la même machine l'un après l'autre et étudier la même série, d'ou la nécessité de pouvoir changer l'identifiant et la date et poursuivre les relevés sur la même feuille, le tout sans écrasé les données du collègue ou de la veille.

Exemple. Le 12/07/2016 Marc travaille sur l'affaire n°25. Il rempli les trois première colonnes. Ferme excel et s'en va. (Tout s'enregistre correctement dans BDD)

Le 13/07/2016 Paul prend la suite du travail de marc, toujours sur l'affaire n°25 donc. En cliquant sur "continuer" il change l'id et la date et accède à la feuille déjà remplie la veille par Marc. Il rempli alors les 4 colonnes suivantes. Ferme excel et s'en va.

Suite à ça, si je reprend le fichier, je souhaite pouvoir ouvrir la BDD et trouver les 4 lignes de relevés de Paul datés du 13 suivi des 3 lignes de relevés de Marc datés du 12, uniquement.

Mon fichier tel qu'il est actuellement m'afficherait. L'ensemble des (4+3) 7 lignes de relevés au nom de Paul, datés du 13 (puisque la macro a réécrit toutes les valeurs dans bdd) puis les 3 lignes de relevés de Marc datés du 12. On aurait donc 3 doublons au niveau des relevés de cotes.

Merci !

Toujours pareil, j'ai du mal à suivre les détails de ton histoire !

La macro ne fait que reproduire Valeurs sur BDD ! Il ne peut donc pas y avoir de modification autres que celles que tu opères sur la fiche (et si tu les opères, je suppose qu'elles doivent être répercutées sinon plus rien n'a de sens !)

Ou ton projet fonctionne autrement que ce que l'on peut en comprendre, ou bien il faut clairement distinguer chaque fiche !

Tant qu'on est dans une même fiche, elle se modifie, ça se retrouve sur BDD.

On change de fiche : on met la première à l'écart et on opére sur la nouvelle. Si cela n'est pas bien tranché, pas étonnant que tout s'entremêle.

Ce que je préconise volontiers dans ce cadre :

  • Suppression des procédures boutons, et des boutons par la même occasion
  • Suppression des Initialize des Userforms
  • Suppression d'un des 2 Userforms identiques
ça c'est pour le ménage !

Deux procédures : Nouveau et Continuer, auxquelles peuvent renvoyer les boutons de ton Userform d'ouverture (je ne raffole pas des Userforms ouverts ainsi, mais c'est toi que ça regarde...). Ces procédures procèdent aux effacements que tu souhaites (autant que possible en bannissant tout Select du code !!! ), la procédure Nouveau procédant à l'insertion de 27 lignes dans BDD (ce qui se fait avec une ligne de code, une seule !) avant d'effacer la fiche. Les deux lancent le Userform (qui lui est tout à fait neutre quelle que soit la situation). La macro évènementielle continue de jouer son rôle en assurant la mise à jour de BDD sur la fiche en cours...

On aura ainsi éliminé un bon volume de code à l'utilité douteuse (si même il ne provoquait pas des dysfonctionnements). On a un code restant simple, dans une structure parfaitement maîtrisable... Le choix s'opérant uniquement sur Nouveau ou Continuer.

Cordialement.


Accessoirement, si tu peux me dire ce que fabrique le &"" à la fin de tes formules ? Je serais curieux de connaître l'utilité de cette excroissance, laquelle ne saute pas aux yeux !

Je ne sais pas comment vous expliquer autrement ce que je souhaite faire... Mais je pense que vous m'avez comprise malgré tout.

Je suis ouverte à toute proposition d'améliorations seulement voilà, si mon fichier est dans cet état actuellement c'est qu'avec mes maigres compétences et des bouts de codes récupérés un peu partout j'ai réussi à obtenir quelque chose qui fonctionne à peu près. Je suis bien consciente que c'est très loin d'être optimal ou ergonomique...

Je ne voudrais pas abusé de votre temps et de votre patiente (je suis consciente qu'il en faut pour me comprendre) mais j'avoue que si vous pouviez me proposer directement des bous de codes ça me sauverait un peu la vie...

Merci !!

Demain je suis absent... donc teste ces aménagements rapidement faits :

  • Les boutons du Userform IMPORTANT renvoient à une procédure Préparer avec un argument (respectivement : "nouveau" ou "continuer")
  • La procédure prépare selon le choix : elle efface Opér. et Date pour les 2, Affaire pour nouveau ainsi qu'insertion de 27 lignes en BDD puis effacement des relevés antérieurs, met en Caption du Userform : Nouveaux relevés, ou Continuer les relevés, si continuer affecte Affaire au TextBox concerné. Et elle ouvre le Userform.

- Userform : j'ai renommé les contrôles (à voir). Procédure bouton de validation : affectation des valeurs des TextBox...

Une option non finalisée (pour la finaliser, enlever les apostrophes qui transforment le code en commentaires) : cas ou une fiche est réalisée par divers opérateurs : chaîner les noms des opérateurs...

Je n'ai pas de solution dans l'immédiat pour conserver les diverses dates d'une fiche de relevés établie sur plusieurs jours.

Le reste est supprimé ou inchangé.

Bonne journée (demain) [déjà aujourd'hui pour moi]

14juliam-test3.xlsm (97.45 Ko)

Bonjour,

Merci de vos propositions. J'ai adapté mon fichier pour qu'il soit plus propre.

J'ai fini par trouver une solution (avec de l'aide bien-sur) à mon problème initiale. A savoir un bout de code qui va trier mes valeurs et supprimer les doublons.

 Dim oTable As ListObject

    Set oTable = ThisWorkbook.Worksheets("BDD").ListObjects("Tableau1") 
    With oTable.Sort 
        .SortFields.Clear
        .SortFields.Add Key:=oRange.Parent.Range("Tableau1[[#All],[Date]]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
        .Apply
    End With

    oRange.RemoveDuplicates Columns:=Array(1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), Header:=xlYes 
    
MFerrand a écrit :

Accessoirement, si tu peux me dire ce que fabrique le &"" à la fin de tes formules ? Je serais curieux de connaître l'utilité de cette excroissance, laquelle ne saute pas aux yeux !

Le &"" sert à ne pas considérer mes cases vides comme ayant un contenu égal à 0. Sans ça, pour tracer mes graphiques cela considérait les cases vides comme étant nulles...

J'ai toujours ce problème de décimale que je ne comprends pas. Et je constate que sur le fichier que vous m'avez renvoyé cela marche sans soucis. C'est très étrange...

Merci de votre aide !

Rechercher des sujets similaires à "utilisation worksheet change"