IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de validation des données [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut Problème de validation des données
    Bonjour au forum
    Merci pour toute l'aide que vous m'apportez
    Dans ma feuille de calcul j'ai une cellule A1 dont la valeur à saisir ne doit pas dépasser (inférieure ou égale) celle qui se trouve dans une autre cellule A2 (par exemple).J'ai procédé par la Validation des données sous l'onglet Données.Jusque là c'est bon et ça marche bien.Mais j'ai remarqué une chose :lorsque j'annule la valeur saisie dans A1 celle qui se trouve dans A2 reste inchangée (pas de message d'alerte).
    Je voudrais règlé ce petit souci pour éviter d'éventuelles erreurs:
    A1 représente le nombre d'articles en stock et A2 celui des articles vendus;si par inadvertance se glisse une erreur comme celle décrite plus haut je risque de me retouver avec un stock négatif.
    Peut etre avec un code VBA l'erreur sera signalé meme si supprime la valeur qui se trouve dans la cellule source A1.
    N B : Si après avoir annulé la valeur de A1,je met une autre valeur dans A2 (autre que celle qui se trouvait déjà) alors j'obtiens le msg d'alerte.

    Merci d'avance

  2. #2
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Tu peux avec l'évènement workshhet_change tester si la modification a lieu en A1 et vérifier que la cellule A2 correspond a la nouvelle valeur si ce n'est pas le cas effaer A2 et faire une alerte.
    Exemple
    Je teste si la modif a lieu de A1 à E1 et j'éfface la ligne de dessous si elle est supérieure a la nouvelle valeur
    (a metre dans le code de la feuille)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cel As Range
    Dim flag As Boolean
    If Not Intersect(Target, Range("A1:E1")) Is Nothing Then 'on regarde si la modification a lieu sur la plage A1 à E1
        flag = False
        For Each cel In Intersect(Target, Range("A1:E1"))
            If cel.Offset(1, 0) > cel Then 'si la cellule une ligne plus bas est plus grande que la cellule modifié
                cel.Offset(1, 0).ClearContents 'on efface la cellule de la ligne du dessous
                flag = True 'il faudra un message pour signaler la modif
            End If
        Next cel
        If flag Then
            MsgBox "Certaines cellules de la ligne 2 ont du être effacé suite à la modification de la ligne 1"
        End If
    End If
    End Sub

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    Merci krovax mais le code ne fonctionne pas.
    Je que voudrais c'est que la valeur de chaque cellule de la plage G8 à G54 soit toujours inférieure ou égale à celle de la cellule se trovant à sa gauche.
    Exemple :
    G8 < ou = F8
    G53 < ou = F53

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Il te suffit d'adapter les commentaire sont la pour ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not Intersect(Target, Range("A1:E1")) Is Nothing Then 'on regarde si la modification a lieu sur la plage A1 à E1
    Remplace le A1:E1 par ta plage G8:G54 pareille quelque ligne plus bas

    Et au lieu de qui regarde une ligne plus bas utilise
    qui corespond a la ligne juste a gauche

    La prochaine fois donne tout de suite la bonne plage de valeur, comme cela tu n'auras pas a l'adapter toi même
    Car tu as dit
    lorsque j'annule la valeur saisie dans A1 celle qui se trouve dans A2 reste inchangée (pas de message d'alerte).
    Je te laisse essayer d'adapter ca Montre nous ce que tu as fait si tu as un souci

  5. #5
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    Merci à tous.Je suis toujours dans l'impase .J'ai du certainement mal m'expliquer. Voici à quoi ressemble àpeu près mon tableau :
    A priori ça marche très bien pour peu que les données soient valides


    (1) (2) (1+2) (3) (1+2-3)
    stock départ entrées stock total sorties stock arrivée
    10 20 30 28 2

    Par contre si je change (1) en mettant 2 au lieu de 10 j'aurais alors ceci


    (1) (2) (1+2) (3) (1+2-3)
    stock départ entrées stock total sorties stock arrivée
    2 20 22 28 -6

    Pourtant j'ai validé les données de "sorties" en spécifiant que sa valeur doit tjr etre inferieure ou égale à "stock total" , car le "stock arriveée" ne doit en aucun cas etre négatif.

    PS : J'avoue que je ne me suis par encore familiarisé avec les outils du forum,c'est pour ça que je n'ai pas pu envoyer un bout de mon fichier en pièce jointe.Je vais m'y mettre ,c'est promis.

    MERCI

    Désolé vraiment désolé
    la mise en forme de mon dernier post est tout aussi nul que moi

  6. #6
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Est ce que tu as modifié le code que je t'ai donné? si oui comment? montre nous ton code
    Et utilise les balise code regarde le premier post du forum sur laide a l'utilisation des bouton) il y a un lien qui t'expliquera comment faire

  7. #7
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    Merci de votre aide qui m'est précieuse...j'ai compris le fonctionnement de ton code , krovax , mais voilà il y a un hic :le code fonctionne uniquement lorsqu'on saisit une valeur dans une cellule de Range(G8:G54)...J'ai oublié de te dire que ces cellules contiennent une formule et donc j'ai du les vérouiller pour empécher toute saisie.Merci de votre aide qui m'est précieuse...j'ai compris le fonctionnement de ton code , krovax , mais voilà il y a un hic :le code fonctionne uniquement lorsqu'on saisit une valeur dans une cellule de Range(G8:G54)...J'ai oublié de te dire que ces cellules contiennent une formule et donc j'ai du les vérouiller pour empécher toute saisie.
    En bref , le code marche si on saisi une valeur (non correcte) mais pas lorsque la cellule prend cette meme valeur via une formule....je ne sais pas si je me suis fait comprendre ,en tous les cas merci ...de votre patience !

  8. #8
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    donc la tu commence a vraiment changer la donne. La prochaine fois essaye de directement posé la bonn question ca ira beaucoup plus vite.

    Avant de continué il va falloir que tu nous donne toutes les infos. Est ce que ta formule ne dépend que de cette onglet?
    Quelle est la plage que l'utilisateur peux modifier pour affecter la formule?
    Est ce que tu peux facilement savoir en fonction de la valeur que modifie l'utilisateur quelle cellule de G s'en trouve modifié? (exemple la modification de A8 ou B8 ou C8 influence que G8, etc...
    Soit précis tu auras une réponse précise

    L'autre solution au lieu d'appliquer la formule sur intersect(traget,Taplage) tu lance la boucle sur toutes la plage a chaque fois, et tu ne test pas la zone modifié, tu lance la macro a chaque changement (mais ca risque de ramer un peu surtout si l'ordi n'est pas top, ou si la plage grandi) tu peux faire le teste voir si ca ne te ralenti pas

  9. #9
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    Bonjour à tous et merci Krovax car tu fais preuve de beaucoup de patience
    Et ben j'arrive pas à t'envoyer un bout de mon fichier en pièce jointe ,on me dit que le serveur distant est injoignable....je vais essayer d'etre plus explicite ...voilà comment se présente ma feuille :

    A1 (ARTICLES)
    A2:A10 (ART1,ART2,...ART9.)

    B1 (STOCK DEPART)
    B2:B10 (nombre entiers à saisir dans chaque cellule,ce qui représente la qté de ART1,ART2,...ART9.)

    C1 (ENTREES)
    C2:C10 (nombre entiers à saisir dans chaque cellule,ce qui représente la qté ajoutée de ART1,ART2,...ART9.)

    D1 (STOCK TOTAL)
    D210 ( FORMULE = STOCK DEPART + ENTREES) exemple : D3=B3+C3

    E1 (sorties)
    E2:E10 (nombre entiers à saisir dans chaque cellule,ce qui représente la qté vendue de ART1,ART2,...ART9.)

    F1 (STOCK ARRIVEE)
    F2:F10 (FORMULE =STOCK TOTAL - SORTIES) exemple :F3 =D3 -E3
    MERCI

  10. #10
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Très compliqué de te suivre surtout que tu ne décrit pas la colonne qui nous intéresse (la G), du coup ca n'aide pas vraiment
    Tu nous décrit les plage de 2 a 10 alors que tu nous ditsais que ct de G8 à G58
    Soit tu arrive a être clair soit tu t'entraine a manipuler cette macro pour l'adapter toi même (dans tous les cas je ne regarderais pas un fichier join )

    Donc la question
    Quelle zone tu peux modifier pour que la colonne G soit modifié ?
    Cela permettra de tester target et de ne lancer la macro qui si c'est cette zone qui est modifié

    De plus est ce que en connaissant la ligne modifié tu connais la ligne de la colonne G qui est modifié?
    Cela permettra de ne tester que la bonne cellule de la colonne F

  11. #11
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    T'as raison Krovax ...désolé de t'avoir entrainé dans mes élucubrations...stp ne tiens compte que du dernier post...voilà je m'explique :
    Dans chaque cellule de E2:E10 je dois saisir une valeur inférieure ou égale à celle qui se trouve juste à sa gauche,dans D210 ,sinon il y aura mesg d'erreur car la validation des données fonctionne bien (les sorties doivent etre inferieures ou égales au stock total) .Ensuite, dans ce meme tableau avec ses memes valeurs valides,je vais opérer un changement dans une cellule de B2:B10 ou dans C2:10,automatiquement les cellules correspondantes dans D210 vont changer elles aussi car elles contiennent une formule qui implique B2:B10 et C2:10 (c'est normal) mais les valeurs de E2:E10 NE CHANGENT PAS MEME SI LEURS VALEURS NE SONT PAS VALIDES par rapport D210 .
    MERCI

  12. #12
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Je suppose que quand tu dit la cellule correspondant colonne D tu parle de la cellule sur la même ligne (pour toi ca peut être évident mais j'ai certain tableau ou c'est un tantinet différent )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cel As Range
    Dim flag As Boolean
    If Not Intersect(Target, Range("B2:C10")) Is Nothing Then 'on regarde si la modification a lieu sur la plage A2:C10
        flag = False
        For Each cel In Intersect(Target, Range("B2:C10"))
            If cells(cels.row,5) > cells(cel.row,4) Then 'si la cellule meme ligne colonne E > a celle colonne D
                cells(cels.row,5) .ClearContents 'on efface la cellule colonne E
                flag = True 'il faudra un message pour signaler la modif
            End If
        Next cel
        If flag Then
            MsgBox "Certaines cellules de la colonne E ont du être effacé suite à la modification"
        End If
    End If
    End Sub
    Je te laisse tester et essayer d'adapter tout ca en cas de souci reviens nous voir avec ta version

  13. #13
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    Merci Krovax
    Je crois qu'on y esy presque ...j'ai essayé le dernier code ...il marche pas mais je suis soulagé que tu m'aies compris. Il doit manquer un ptit qqchoz car j'ai ça en rouge dans le code de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(cels.row,5) .ClearContents 'on efface la cellule colonne E

  14. #14
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    y a les espace en trop désolé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(cels.row,5).ClearContents

  15. #15
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    Merci pour tout Krovax mais je suis vraiment désolé que ça ne marche pas ?
    Le dernier code me semble pourtant évident d'après les commentaires.je ne sais pas quesqui cloche.Il arrive des trucs bizarres à ma feuille ,ça bug de partout quand je mets le dernier code...?!

  16. #16
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Arf j'aurais du tester désolé une erreur de frappe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cel As Range
    Dim flag As Boolean
    If Not Intersect(Target, Range("B2:C10")) Is Nothing Then 'on regarde si la modification a lieu sur la plage A2:C10
        flag = False
        For Each cel In Intersect(Target, Range("B2:C10"))
            If Cells(cel.Row, 5) > Cells(cel.Row, 4) Then 'si la cellule meme ligne colonne E > a celle colonne D
                Cells(cel.Row, 5).ClearContents 'on efface la cellule colonne E
                flag = True 'il faudra un message pour signaler la modif
            End If
        Next cel
        If flag Then
            MsgBox "Certaines cellules de la colonne E ont du être effacé suite à la modification"
        End If
    End If
    End Sub
    j'utilisais cel et cels comme variable, une petite faute de frappe


    Par contrre tu n'as pas eu d'erreur ce qui signifie que tu n'es pas en option explicite. Tu devrais t'y mettre ca évite ce genre de soucis
    Un tuto pour mieu comprendre
    http://mhubiche.developpez.com/Access/variables/

    Edit : celui la je l'ai testé ca devrais être bon

  17. #17
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 59
    Points
    59
    Par défaut
    BRAVO 1.000.000.000 DE FOIS... ça marche à merveille!!!
    MERCI dans toutes les langues ...à Krovax et à la grande équipe de Developpez.com je vous ai déjà dit que vous etes géniaux...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/02/2007, 08h14
  2. Problème de validation de données
    Par loutsky dans le forum Access
    Réponses: 3
    Dernier message: 23/11/2005, 14h11
  3. [débutante] problème de validation des méta-tags
    Par silversky dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/09/2005, 17h26
  4. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07
  5. dbgrid AND validation des données
    Par samlerouge dans le forum Bases de données
    Réponses: 10
    Dernier message: 11/06/2004, 23h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo