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 :

valider le format à la sortie cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut valider le format à la sortie cellule
    Bonjour,

    Je viens de commencer le vba dans Excel et j'ai besoin de votre aide. Je veux que lors de la perte de focus d'une cellule (après avoir saison un numéro de dossier , appeler une fonction (call) qui va vérifier si le numéro est bon. J'ai déjà mon code pour vérifier le numéro de dossier. Je ne sais pas comment faire en excel, je sais qu'avec access je mets:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Private Sub Numero_LostFocus()
    Call Verifier_Numero(Numero)
    Me.Numero.SetFocus
    End Sub



    Merci pour votre aide

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Au lieu de mettre ton code dans lostfocus, mets-le dans Click
    Quant au code, pour conserver le focus sur un bouton, tu dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Call Verifier_CP12(cp12)
    Cancel = True
    Me.cp12.SetFocus
    Tu peux conditionner "Cancel = True" sinon tu ne sortiras jamais de là Tu dis
    A+

    Edit
    En supposant que cp12 soit bien le bouton en question !

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Voilà mon problème, je ne sais pas comment faire pour le mettre dans le click?

    Je veux que lorsque l'utilisateur quitte la cellule ex: D4 et clique dans une autre cellule ex: E4, la validation se fasse et ce pour une plage de cellule (D4 à D50). Donc mon utilisateur écrit son CP12 et lorsqu'il passe à l'autre cellule la fonction Vérifier CP12 doit démarrer.

    Merci de ton aide rapide.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ok, alors oublie ce que je t'ai mis, je n'ai jamais imaginé que CP12 était une cellule, je l'ai pris pour un bouton
    Je regarde
    A+

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Merci de ton aide, voici des explications:

    Exemple: je suis dans la cellule D4 et j'écris mon CP12, lorsque je passe à une autre cellule (E4) je veux que appeler mon code (call ) Verifier CP12 et si le CP12 n'est pas bon, revenir dans la cellule D4.

    Encore un gros merci

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Bon, tu vas être obligé de transformer ta sub Verifier_CP12 en fonction pour savoir si tu dois retourner dans CP12 ou non.
    La fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function Verifier_CP12(LeRange) as boolean
      'ton code
      '...
      'ensuite, tu vois comment conditionner Verifier_CP12
      Verifier_CP12 = True 'si vérif ok
      Verifier_CP12 = False 'si vérif pas ok
    End function
    Pour appeler cette fonction placée dans un module standard, tu places le code suivant dans la feuille de code de la feuille de calculs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    dim ok as boolean
        if target.address(false, false) <> "CP12" then ok = Verifier_CP12("cp12")
        if not ok then range("CP12").select
    End Sub
    Si tu veux, tu peux ajouter l'effacement de CP12 "if not ok"... C'est toi qui choises
    Inconvénient de la méthode, quelque soit la cellule sélectionnée autre que CP12 lancera la vérif. (transparent si CP12 ok)
    Tu dis
    A+

    Correction
    J'ai oublié de parler du paramètre envoyé à la fonction (cp12)
    Si c'est censé être une adresse de cellule, ce que j'ai supposé, j'ai corrigé le code.
    Et dans la fonction, si tu vérifies ce qu'il y a dans CP12, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Range(LeRange).value = ... then
        Verifier_CP12 = True
       else
        Verifier_CP12 = False
    endif

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Peut-on assigner un code seulement à un cellule et ou à une plage de cellule?

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Précise ta question, je ne comprends pas ce que tu veux dire.

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Je viens de trouver:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ok As Boolean
         If Not Intersect(Target.Cells, Range("E4:E116")) Is Nothing Then
                'For Each c In Target
                Call Verifier_Numero(Numero)
        If Not ok Then Range("E4:E116").ShowPrecedents
     
     
     
        End If
    avec ce code seulement les cellules situées dans la plage E4 à E116 est valider. Sauf que ma ligne [code] if Not ok the Range (....).ShowPrecedents ne fonctionne pas. Je veux que si le Numero n'est pas valide, la sélection revienne à la cellule précédente.




    Merci pour ta patience.

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par kat40
    Je viens de trouver:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ok As Boolean
         If Not Intersect(Target.Cells, Range("E4:E116")) Is Nothing Then
                'For Each c In Target
                Call Verifier_CP12(cp12)
                If Not ok Then Range("E4:E116").ShowPrecedents
         End If
    avec ce code seulement les cellules situées dans la plage E4 à E116 est valider. Sauf que ma ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if Not ok the Range (....).ShowPrecedents
    ne fonctionne pas. Je veux que si le cp12 n'est pas valide, la sélection revienne à la cellule précédente.
    Relis ce que je t'ai mis, une sub ne renvoie rien, une fonction si. Remplace
    Call Verifier_CP12(cp12)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ok = Verifier_CP12(cp12)
    et dans la Function Verifier_CP12(cp12) as boolean, mets le test qui te convient selon ce que je t'ai mis et que je répète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If  Ton test ... then
        Verifier_CP12 = True
       else
        Verifier_CP12 = False
    endif
    là, tu as des chances de retrouver ok
    Pour le reste, j'ai posé la question : Qu'y a-t-il dans CP12 ?
    Pour Len(cp12) = 0 => cp12 = ""
    affiche la fenêtre exécution dans l'éditeur VB et mets, sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Debug.print "cp12 = " & cp12
    Debug Print "Longueur " & len(cp12)
    Debug Print "Longueur sans espace = " & Trim(cp12)
    If Len(cp12) <> 12 Then
    A+

  11. #11
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Je me pose une question, comme ça, à tout hasard : Y'a une raison qui empêche d'utiliser la validation de données du menu Données ?

    Je ne crois pas que ShowPrecedents vous soit d'une quelconque utilité:
    Citation Envoyé par Aide de VBA
    ShowPrecedents, méthode
    Voir aussi S'applique à Exemple Spécificités
    Cette méthode affiche les flèches d'audit signalant les antécédents directs de la plage.

    expression.ShowPrecedents(Remove)

    expression Obligatoire. Expression qui renvoie un objet Range. Il doit s'agir d'une seule cellule.

    Remove Argument de type Variant facultatif. Affectez-lui la valeurTrue pour supprimer les flèches d'audit signalant un niveau d'antécédents directs. Affectez-lui la valeur False pour développer les flèches d'audit signalant un niveau d'antécédents directs. La valeur par défaut est False.

    Exemples
    Cet exemple montre comment afficher les flèches d'audit signalant les antécédents directs de la cellule active de la feuille Sheet1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets("Sheet1").Activate
    ActiveCell.ShowPrecedents
    Cet exemple montre comment supprimer la flèche d'audit signalant un niveau d'antécédents directs de la cellule active de la feuille Sheet1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets("Sheet1").Activate
    ActiveCell.ShowPrecedents remove:=True
    Alors que la validation de données permet d'utiliser une formule ou une liste de cellules sources.

    Pour tester ce que fait la méthode ShowPrecedents, Tapes une formule dans une cellule, dans B2 par exemple
    Tout simple, vous voyez
    Maintenant, mettez ce code dans l'événement SelectionChange de votre feuille de calcul.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Target.ShowPrecedents
    End Sub
    Revenez dans la cellule A1 et tapez sur TAB. Ça affiche une flèche. Rien d'autre!

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Merci de votre aide, mais j'ai trouvé la solution et ça fonctionne numéro 1 .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ok As Boolean
    Dim Numero As String
     
            If Not Intersect(Target.Cells, Range("E4:E116")) Is Nothing Then
            Numero= Target.Cells 
            Call Verifier_Numero(Numero)
     
        End If
     
    End Sub
    Taget.cells me permet de renvoyer mes données de la cellule, soit le Numero et je vais vérifier avec Verifier_Numero(Numero)

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    Function public Verifier_Numero(Numero) As Boolean
     
    Dim VarJour, VarMois
    Dim AnnéeBissextile As Boolean
     
     ' *** VÉRIFICATION LOGISTIQUE ET "ALPHANUMÉRIQUE" ***
     ' S'il y a plus ou moins que 12 caractères ... erreur
     
     If Len(Numero) <> 12 Then
        GoTo CP12Invalide
     End If
     ' Si un ou plusieurs des 4 premiers caractères est un numérique ... erreur
     If IsNumeric(Left(Numero, 1)) Or _
        IsNumeric(Mid(Numero, 2, 1)) Or _
        IsNumeric(Mid(Numero, 3, 1)) Or _
        IsNumeric(Mid(Numero, 4, 1)) Or _
        Not (IsNumeric(Right(Numero, 1))) Then
        GoTo NumeroInvalide
     End If
     ' Si un ou plusieurs des caractères 5 à 10 ne sont pas numériques ... erreur
     If Not IsNumeric(Mid(Numero, 5, 6)) Then
       GoTo NumeroInvalide
     End If
     
      ' *** VALIDATION DE LA DATE DE NAISSANCE DANS LE Numero***
     VarJour = CInt(Mid(Numero, 5, 2))
     VarMois = CInt(Mid(Numero, 7, 2))
     If ((CInt(Mid(Numero, 9, 1)) Mod 2 = 1) And ((CInt(Mid(Numero, 10, 1)) = 2) Or (CInt(Mid(Numero, 10, 1)) = 6))) Or _
        ((CInt(Mid(Numero, 9, 1)) Mod 2 = 0) And ((CInt(Mid(Numero, 10, 1)) = 0) Or (CInt(Mid(Numero, 10, 1)) = 4) Or (CInt(Mid(Numero, 10, 1)) = 8))) Then
       AnnéeBissextile = True
     Else
       AnnéeBissextile = False
     End If
     ' Si le jour est = à 0 ou plus > 31 ... erreur
     If VarJour = 0 Or VarJour > 31 Then
        GoTo NumeroInvalide
     End If
     ' Si le mois est = à 0 ou
     ' si le mois est (plus > 12 et plus < 51) ou
     ' Si le mois est plus > 62 ... erreur
     If VarMois = 0 Or (VarMois > 12 And VarMois < 51) Or VarMois > 62 Then
     GoTo NumeroInvalide
     End If
     ' Si le mois = février et que (le jour = 29 et pas année bissextile) ou que le jour = 30 ou 31)
     ' ou Si le mois = avril, juin, septembre ou novembre et que le jour = 31 ... erreur
     Select Case VarMois
     Case 2, 52
       If (VarJour = 29 And Not AnnéeBissextile) Or VarJour = 30 Or VarJour = 31 Then
    GoTo NumeroInvalide
       End If
     Case 4, 54, 6, 56, 9, 59, 11, 61
       If VarJour = 31 Then
      GoTo NumeroInvalide
       End If
     End Select
     
     CP12Valide = True
     
    GoTo Fin
     
    NumeroInvalide:
     
      NumeroValide = False
     
        MsgBox "ATTENTION!" & Chr(13) & Chr(13) & "Le Numero est invalide.", vbExclamation
        ActiveCell.Previous.Activate
     
     Exit Function
     
    Fin:
     
    End Function
    et si le Numero= False, me msgbox et [ActiveCell.Previous.Activate] va me redonner le focus sur la cellule en erreur.

    Encore un gros merci de votre aide et avec de la patiente et de la logique on y arrive toujours ou presque.

    Bonne journée à tous

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Juste une petite question : Connais-tu la fonction isdate ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isdate(Cells(NoLigne, NoCol).value then
    Bon Dev
    A+

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Je suis débutante en programmation, non je ne connais pas fonction.

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    IsDate vérifie si une valeur est une date.
    A+

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

Discussions similaires

  1. [VBA-E]changer le format d'une cellule dans un spreadsheet
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 13/02/2006, 11h12
  2. format de sortie commande \pset
    Par Alesk dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 30/01/2006, 14h48
  3. [vb.net][vs2005][Validating event] Control de sortie
    Par graphicsxp dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/12/2005, 14h01
  4. Comment forcer le format d'une cellule?
    Par cha_cha dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/11/2005, 14h31
  5. Display Format d'une cellule d'une DBGrid
    Par Wilco dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/10/2004, 13h00

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