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 :

Comment bloquer un control ne comportant pas le mot clé [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut Comment bloquer un control ne comportant pas le mot clé
    Salut le forum

    J'ai besoin de votre aide pour résoudre un problème.
    En effet, il arrive que dans certains de mes textbox, je saisisse un mot ou en ensemble de mot. obligatoirement dans ces textbox, un des mots de la plage PARAMETRE!V394:W623 devra y être saisi.
    Je souhaite que lorsque un des éléments de la plage définie ne figure dans ces textbox, qu'il y'ait blocage c'est à dire qu'on ne puisse pas aller au control suivant.
    Merci de voir le fichier joint
    http://cjoint.com/?CCEmXBGZMfn

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour

    Essaies l'évènement BeforUpdate

    Quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub TextBox12_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim c As Range
     
    Set c = Feuil1.Range("V394:W623").Find(Me.TextBox12.Value, LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        Set c = Nothing
    Else
        Cancel = True
        MsgBox "Mot clé manquant ou mal écrit"
    End If
    End Sub

  3. #3
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Salut Mercatog

    Merci pour votre solution.
    Comme d'habitude tout ce que vous proposez est fort appréciable.
    Il manque une ou deux conditions à intégrer:
    Je constate que lorsque le textbox est vide en faisant ENTER, il passe au textbox suivant;ce qui n'est pas bien.
    Pouvez-vous faire en sorte que lorsque le textbox est vide ou ne contient pas le mot clé de la plage indiquée, qu'il y'ait blocage pour aller aux textbox suivants?
    J'ai ajouter d'autres textbox dans le fichier joint
    merci
    http://cjoint.com/?CCEoXvkOeAN

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    si le mot doit ce trouver parmi plusieur dans le textbox tu devrais utiliser la fonction "Like" avec les jocker "*" en prefixe et sufixe de l'argument

    Au plaisir

  5. #5
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Salut Patrick

    Merci pour votre contribution.
    Avez-vous regardé les autres critères que j'ai ajouté?
    La solution de mercatog marche mais devrait prendre en compte d'autres critères. dans sa solution, lorsque le textbox est vide, on peut aller au textbox suivant ce qui n'est pas bien.
    C'est ce que je souhaite qu'on intègre dans la solution de Mercatog.
    Encore merci à vous

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Utilise l'évènement Exit (comme tu l'as essayé au début)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub TextBox12_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim c As Range
     
    Set c = Feuil1.Range("V394:W623").Find(Me.TextBox12.Value, LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        Set c = Nothing
    Else
        Cancel = True
        MsgBox "Mot clé manquant ou mal écrit"
    End If
    End Sub

  7. #7
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Salut Mercatog et le forum

    Ca marche avec exit mais j'ai constaté un disfonctionnement.
    En saisissant un ensemble de mot, je remarque qu'il y'a blocage.
    Je pense qu'il y'a lieu d'intégrer l'avis de patrictoulon :
    si le mot doit ce trouver parmi plusieur dans le textbox tu devrais utiliser la fonction "Like" avec les jocker "*" en prefixe et sufixe de l'argument
    Divers:
    Si c'est pas trop abuser de votre temps et si ce que je demande est réalisable: est-il possible de faire en sorte que quand bien les conditions ne sont pas reunies, qu'on puisse revenir en arrière mais pas avant?

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Essaies ceci
    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
    Private Sub TextBox12_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim Valable As Boolean
    Dim i As Integer
    Dim c As Range
    Dim Tb
     
    Tb = Split(Me.TextBox12.Value)
    If UBound(Tb) > -1 Then
        For i = 0 To UBound(Tb)
            Set c = Feuil1.Range("V394:W623").Find(Tb(i), LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Set c = Nothing
                Valable = True
                Exit For
            End If
        Next i
    End If
    If Not Valable Then
        Cancel = True
        MsgBox "Mot clé manquant ou mal écrit"
    End If
    End Sub
    Pour la question Divers, je ne l'ai pas comprise

  9. #9
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    A part le divers qui n'a pas été compris, tout est super.
    Si on arrivait à solutionner le divers cela serait encore cool.
    Je m'explique:
    Lorsque je suis dans le textbox13 par exemple il m'est difficile de revenir faire une correction dans le textbox12.
    Pour pourvoir revenir au textbox12, il faut que l'utilisateur saisisse un mot qui passe sinon il sera bloqué.
    La solution que je souhaite est que l'on puisse revenir en arrière quand bien même les conditions ne sont pas remplies (que le textbox soit vide ou qu'il contient n'importe quoi).
    En un mot que lorsque les conditions ne sont pas remplies, qu'on ne puisse pas aller aux controls suivants mais ok pour les controls précédents.
    encore merci pour le travail déjà abattu

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    A mon avis, il faudra changer le fusil d'épaule.

    C'est à dire remplir normalement toutes tes textbox, et lors de la validation à l'aide du botton valider faire le test de validité des informations saisies dans TextBox12

    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
    Private Sub CValider_Click()
     
    If Not Valable(Me.TextBox12) Then
        Me.TextBox12.SetFocus
        MsgBox "Mot clé manquant ou mal écrit"
    Else
        MsgBox "Lieu de naissance valide"
        'suite du code
     
    End If
     
    End Sub
     
    Private Function Valable(ByVal Str As String) As Boolean
    Dim i As Integer
    Dim c As Range
    Dim Tb
     
    Tb = Split(Me.TextBox12.Value)
    If UBound(Tb) > -1 Then
        For i = 0 To UBound(Tb)
            Set c = Feuil1.Range("V394:W623").Find(Tb(i), LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Set c = Nothing
                Valable = True
                Exit Function
            End If
        Next i
    End If
    End Function

  11. #11
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Pensez-vous que c'est la meilleure option?
    Je pense que vous êtes un expert confirmé donc par conséquent je dois suivre vos conseil.
    J'avais auparavant utilisé la méthode de la validation mais pour des raisons de fiabilisation de notre base, le service informatique m'a demandé si c'était pas possible de bloquer les champs obligatoires.
    Voila pourquoi je cherche à m'y adapter.

  12. #12
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    si la réponse n° #8 de mercatog relatif à Exit est satisfaisante, tu n'as quà placer une condition de comparaison des propriétés TabIndex du TextBox et celui du contrôle actif en début de cette procédure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Textbox1.TabIndex > ActiveControl.TabIndex Exit sub

  13. #13
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Salut NVCfrm

    merci pour votre contribution.
    Sans mentir, j'ai pas compris l'utilité de cette condition.
    Je l'ai testé mais le résultat n'est pas ca.
    Je reformule encore mon besoin:
    dans un textbox, je souhaite éviter que l'on puisse aller au textbox (controls) suivant tant que certaines conditions ne sont pas reunies;mais que les retour arrières (aller au textbox (controls) précédent puisse être possible.
    Ces conditions sont les suivantes:
    - le textbox ne doit pas être vide
    - dans le textbox, il doit y avoir un mot d'une plage définie.
    Mercatog dans sa réponse n° #8 à résolue ces conditions.
    N.B : ces conditions doivent s'appliquer lorsque je cherche seulement à aller au control suivant.
    Voici grosso modo mon idée générale.
    Merci d'avance pour vos contributions

  14. #14
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Bonsoir,
    en effet la solution que je t'ai proposée ne peut marcher avec l'évènement Exit.
    L'idée reste néanmoins exploitable.
    Voyons un peu ..."Changer de fusil d'épaule" comme le disait mercatog.

    Bien!
    Dans le but de satisfaire ton souhait de pouvoir rétrograder sur les textbox sans passer par la validation.
    [][]
    je suggérerais 2 évènements à utiliser: Enter et Exit et une fonction contenant le corps de procédure de la réponse n° #8 de mercatog avec une légère adaptation.

    En tête de module déclarer ces trois variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Precedent As String, val_Precedent As String, indx As Integer
    Voici la fonction:
    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
     
    'Dans les évènements TextBox_Enter et TextBox_Exit appeller la fonction.
    'pour TextBox_Enter appel simple
    'pour TextBox_Exit:
        Cancel = Entrer
     
    Private Function Entrer()
     
        Dim Valable As Boolean
        Dim i As Integer
        Dim c As Range
        Dim Tb
     
        If indx > ActiveControl.TabIndex Then
            Precedent = ActiveControl.Name
            val_Precedent = ActiveControl
            indx = ActiveControl.TabIndex
            Entrer = False
        Else
            'valider le controle précédent
            Tb = Split(val_Precedent)
            If UBound(Tb) > -1 Then
                For i = 0 To UBound(Tb)
                    Set c = Feuil1.Range("V394:W623").Find(Tb(i), LookIn:=xlValues, lookat:=xlWhole)
                    If Not c Is Nothing Then
                        Set c = Nothing
                        Valable = True
                        Exit For
                    End If
                Next i
            End If
            If Not Valable Then
                Me.Controls.Item(Precedent).SetFocus
                MsgBox "Mot clé manquant ou mal écrit"
                Entrer = True
            End If
        End If
    End Function
    Il te faut maintenant tester voir s'il y a d'autres adaptations à faire.

    edit:
    supprimer la ligne n°33.
    La valeur de la fonction étant suffisante.

  15. #15
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Salut NVCfrm
    merci pour feedback.
    je viens de tester mais jy arrive pas car je rencontre un debogage:
    cancel = entrer donc j‘arrive pas a verifier.
    merci de revoir svp

  16. #16
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    re,

    en y réfléchissant un peu plus, tu peux supprimer l'évènement Exit et te contenter de la procédure Enter qui suffit pour vérifier l'état du contrôle précédent.
    Il te faut aussi initialiser la variable indx dans l'évènement initialize
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub UserForm_Initialize()
     
        indx = TextBox1.TabIndex 'le premier textbox dans l'ordre de tabulation
     
    End Sub
     
    Private Sub TextBox1_Enter()
        Entrer
    End Sub
    Adapte correctement la condition de la fonction comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If ActiveControl.TabIndex <= indx Then
     Me.Controls.Item(Precedent).SetFocus

    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
    Private Function Entrer()
     
        Dim Valable As Boolean
        Dim i As Integer
        Dim c As Range
        Dim Tb
     
        If ActiveControl.TabIndex <= indx Then
            Precedent = ActiveControl.Name
            val_Precedent = ActiveControl
            indx = ActiveControl.TabIndex
            Entrer = False
        Else
            'valider le controle précédent
            Tb = Split(val_Precedent)
            If UBound(Tb) > -1 Then
                For i = 0 To UBound(Tb)
                    Set c = Feuil1.Range("V394:W623").Find(Tb(i), LookIn:=xlValues, lookat:=xlWhole)
                    If Not c Is Nothing Then
                        Set c = Nothing
                        Valable = True
                        Exit For
                    End If
                Next i
            End If
            If Not Valable Then
                Me.Controls.Item(Precedent).SetFocus
                MsgBox "Mot clé manquant ou mal écrit"
                Entrer = True
            End If
        End If
    End Function
    A plus

  17. #17
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Encore merci pour votre assistance.
    J‘ai essaye mais pa de blocage.
    tout ce que je saisis passe sans probleme ce qui nest pas normal.
    voici comment j‘ai procede:
    J‘ai remplace mon code par celui de votre post n°14.
    ensuite j‘ai remplace la condition de la ligne 14 par la nouvelle.
    enfin j‘ai cree les 2private comme demande et ca ne marche pas.
    ai-je oublie quelque chose?
    Merci.

  18. #18
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    bonjour capi81,

    ta dernière réponse succède à peu d'intervalles le post #17.
    relis bien ce post.

  19. #19
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Effectivement votre solution m'avais échappée.
    Je l'ai testée et c'est super.
    Merci à tous pour vos riches contributions.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/09/2006, 16h47
  2. comment faire un controle de transaction ???
    Par Oxygene dans le forum Oracle
    Réponses: 4
    Dernier message: 22/02/2005, 15h04
  3. [MFC] Comment bloquer lma touche maximiser?
    Par xs_nady dans le forum MFC
    Réponses: 2
    Dernier message: 14/06/2004, 20h05
  4. TCustomGrid, comment bloquer une cellule ?
    Par Merfolk dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/04/2004, 13h55
  5. Réponses: 9
    Dernier message: 01/10/2003, 18h43

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