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 :

Setfocus ne fonctionne pas [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut Setfocus ne fonctionne pas
    Bonjour à tous,

    Je souhaite résoudre un petit soucis que je ne comprend pas.
    Pour résumé je teste la valeur du Textbox 'TB_ID' et si l'ID n'existe pas dans la base ou que ce qui est saisi n'est pas au format numérique je fais un msgbox puis je supprime le contenu du Textbox et je fais un setfocus sur 'TB_ID'.
    Et c'est là que le problème apparaît : Du fait que le code est sur l'action AfterUpdate du textbox je dois sélectionner autre chose ou faire entrer. Tout le code fonctionne sauf le setfocus qui m'envoi sur ce que j'ai saisi pour déclencher AfterUpdate ou sur mon combobox suivant si j'ai fais entrer.

    En passant il y a un deuxième truc que je n'ai pas saisi : je suis obligé de passer par la variable x pour la valeur Sheets("BDMat").Range("A65000").End(xlUp).Row sinon ce n'est pas traité. Il me semblait que .row possédait une valeur de type Long ce qui devrait fonctionner non? J'ai résolu en mettant x en tant qu'integer mais je souhaiterai comprendre.

    Merci d'avance.

    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
    Dim x As Integer
    x = Sheets("BDMat").Range("A65000").End(xlUp).Row + 1
    If Me.TB_ID.Value > 1 And Me.TB_ID.Value < x Then
     
        MsgBox (Sheets("BDMat").[A65000].End(xlUp).Row)
        Else
            If Not IsNumeric(Me.TB_ID.Value) Then
            MsgBox "L'ID est obligatoirement au format numérique !", vbCritical
            Me.TB_ID.Value = "" 'Vide le control
            Me.TB_ID.SetFocus 'renvoi le focus sur la case ID
            Exit Sub
            Else
                MsgBox "L'ID entrée n'existe pas !", vbCritical
                Me.TB_ID.Value = "" 'Vide le control
                Me.TB_ID.SetFocus 'renvoi le focus sur la case ID
                Exit Sub
            End If
    End If

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne réponds pas directement à votre problème, mais vous pouvez contrôler la saisie dans votre textbox avec l'événement keypress où dans "1234567890", vous définissez les caractères autorisés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TB_ID_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
            If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
    End Sub
    Quant à x, je ne vois pas.

    Cordialement.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Merci à vous Eric pour cette astuce qui peut effectivement remplacer le isnot numeric et le >1.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Tu peux faire ton contrôle sur le bouton valider, et là donner le focus!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bonjour rdurupt,
    Qu'entends tu par "bouton Valider" ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Dans ton formulaire tu rajoute un bouton et sur bouton_click te contrôles tes valeurs et tu redonnes le focus ou tu écris dans Excel.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Ok pourquoi pas mais ça veux dire que pour chaque control avec des contraintes à respecter je dois tester avec le bouton valider.
    Pourquoi mon setfocus ne fonctionne pas ce serait quand même bien plus simple non?

    Et concernant la valeur de x vous avez une idée?

    Merci d'avance.

  8. #8
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour

    La solution est simple, sauf qu'elle n'est pas évidente car on pense que TextBox1.Setfocus devrait fonctionner. Il fonctionne, mais il faut attendre un peu.

    'Dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public LeControl As Object
     
    Sub Focus_Sur_LeControle()
      On Error Resume Next
      LeControl.SetFocus
    End Sub
    'Dans un Userform
    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
    Private Sub tb_ID_Exit(ByVal Cancel As MSForms.ReturnBoolean)
      If test = True Then
       Cancel = False
       Set LeControl = tb_ID
       Application.OnTime Now + TimeValue("00:00:01"), "Focus_Sur_LeControle"
      End If
     
    End Sub
     
    Function test() As Boolean
    Dim x As Long
     
    x = Sheets("BDMat").Range("A65000").End(xlUp).Row + 1
    If Me.tb_ID.Value > 1 And Me.tb_ID.Value < x Then
        test = False
        Else
            If Not IsNumeric(Me.tb_ID.Value) Then
             test = True
             MsgBox "L'ID est obligatoirement au format numérique !", vbCritical
            Exit Function
            Else
                test = True
                MsgBox "L'ID entrée n'existe pas !", vbCritical
                Me.tb_ID.Value = "" 'Vide le control
     
                Exit Function
            End If
    End If
    End Function
    Cordialement

    Docmarti.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bonjour Docmarti,

    Effectivement ce que vous proposez fonctionne parfaitement.

    Du coup je suis obligé de faire une fonction au lieu d'un privatesub?

    Par contre bien que cela fonctionne dans un classeur sans autre code, ça bug quand j'intègre ces procédures sur ma feuille il m'informe que l'objet "Lecontrol" n'est pas reconnu ?

  10. #10
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Alors essayons comme ceci:

    'Dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Focus_Sur_LeControle()
      On Error Resume Next
      UserForm1.Controls(UserForm1.LeControl).SetFocus
    End Sub
    'Dans Userform1
    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
    Public LeControl As String
     
    Private Sub tb_ID_Exit(ByVal Cancel As MSForms.ReturnBoolean)
      If test = True Then
        Cancel = False
        LeControl = "Tb_ID"
       Application.OnTime Now + TimeValue("00:00:01"), "Focus_Sur_LeControle"
      End If
    End Sub
     
    Function test() As Boolean
    Dim x As Long
     
    x = Sheets("BDMat").Range("A65000").End(xlUp).Row + 1
    If Me.tb_ID.Value > 1 And Me.tb_ID.Value < x Then
        test = False
       ' MsgBox (Sheets("BDMat").[A65000].End(xlUp).Row)
        Else
            If Not IsNumeric(Me.tb_ID.Value) Then
             test = True
             MsgBox "L'ID est obligatoirement au format numérique !", vbCritical
            Exit Function
            Else
                test = True
                MsgBox "L'ID entrée n'existe pas !", vbCritical
                Me.tb_ID.Value = "" 'Vide le control
     
                Exit Function
            End If
    End If
    End Function
    Cordialement

    Docmarti.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bon je pense que l'on approche du dénouement

    Cela fonctionne effectivement par contre dernier petit point je prévoyais un certain nombre d'actions sur d'autres controls dans l'évènement AfterUpdate de ID_TB et il semble que cela rentre en conflit avec l'évènement Exit. De plus les actions que je souhaite faire ne peuvent être réalisés lors de l'évènement Exit. Quel évènement dois-je utiliser pour que cela ne pose pas de problème.

    Voici le code que je souhaitais mettre en place, celui-ci fonctionne sur l'évènement Exit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Vider l'ensemble des ZLM et des TB de la Base de données
    Me.ZLM_Ouvrages.Clear
    Me.ZLM_Elements.Clear
    Me.ZLM_Materiaux.Clear
    Me.TB_Descriptif.Value = ""
    Me.TB_Kgu.Value = ""
    Me.TB_Kgml.Value = ""
    Me.TB_Kgm2.Value = ""
    Me.TB_Kgm3.Value = ""
    Me.ZLM_densite.Clear
    Me.TB_densite = ""
    End Sub
    Celui-ci non :

    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
     
        'Attribuer aux différents controls les valeurs correspondantes à l'ID
        Me.ZLM_Ouvrages.AddItem Sheets("BDMat").Cells(Me.TB_ID.Value, 2).Value
        Me.ZLM_Ouvrages.ListIndex = 0
        Me.ZLM_Elements.AddItem Sheets("BDMat").Cells(Me.TB_ID.Value, 3).Value
        Me.ZLM_Elements.ListIndex = 0
        Me.ZLM_Materiaux.AddItem Sheets("BDMat").Cells(Me.TB_ID.Value, 4).Value
        Me.ZLM_Materiaux.ListIndex = 0
        Me.TB_Descriptif.Value = Sheets("BDMat").Cells(Me.TB_ID.Value, 5).Value
        Me.TB_Kgu.Value = Sheets("BDMat").Cells(Me.TB_ID.Value, 13).Value
        Me.TB_Kgml.Value = Sheets("BDMat").Cells(Me.TB_ID.Value, 15).Value
        Me.TB_Kgm2.Value = Sheets("BDMat").Cells(Me.TB_ID.Value, 17).Value
        Me.TB_Kgm3.Value = Sheets("BDMat").Cells(Me.TB_ID.Value, 18).Value
     
        'Attribuer des valeurs à la ZLM densité
        With Me.ZLM_densite
            ZLM_densite.AddItem "Kg/u"
            ZLM_densite.AddItem "Kg/ml"
            ZLM_densite.AddItem "Kg/m2"
            ZLM_densite.AddItem "Kg/m3"
        End With
    'End Sub
    Merci encore pour votre aide.

  12. #12
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par bickou Voir le message
    . les actions que je souhaite faire ne peuvent être réalisés lors de l'évènement Exit. Quel évènement dois-je utiliser pour que cela ne pose pas de problème.
    Avec OnTime, tu peux utiliser l'événement de ton choix. Il n'y a pas de conflit car le principe de l'utilisation de OnTime est justement de permettre à tous les événements de se produire et de prendre fin avant l'exécution du code dans la procédure appelée par OnTime.

    Citation Envoyé par bickou Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Me.ZLM_Ouvrages.AddItem Sheets("BDMat").Cells(Me.TB_ID.Value, 2).Value
        Me.ZLM_Ouvrages.ListIndex = 0
    Modifier la valeur de ListIndex déclenche un autre événement.

    Il est important de mettre la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.OnTime Now + TimeValue("00:00:01"), "Focus_Sur_LeControle"
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.ZLM_Ouvrages.ListIndex = 0
    Cordialement

    Docmarti.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup Docmarti,

    Après quelques test tout fonctionne je passe en résolu

    Bonne journée.

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

Discussions similaires

  1. TextBox.SetFocus ne fonctionne pas
    Par wipMan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/06/2013, 11h23
  2. setfocus texbox ne fonctionne pas
    Par chris45 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/12/2010, 17h20
  3. [Lazarus] SetFocus ne fonctionne pas
    Par cavaco dans le forum Lazarus
    Réponses: 5
    Dernier message: 09/08/2007, 23h17
  4. [VBA-E] SetFocus sur TextBox dans UserForm_Initialize ne fonctionne pas ?
    Par Jipété dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 27/11/2006, 11h39
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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