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 :

Impossible de modifier la propriété Value du Multipage


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut Impossible de modifier la propriété Value du Multipage
    Bonjour,
    Sur un Multipage de 3 pages, je souhaite "after update textbox" changer de page, donc j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub TxtMDP_AfterUpdate()
        If Me.TxtMDP.Value <> MdP Then
            MsgBox "Mauvaise saisie d'utilisateur et/ou mot de passe", vbInformation, "Essaies encore"
            Me.TxtMDP.Value = ""
            Me.TxtMDP.SetFocus
        Else
            Me.MultiPage1.Value = 1
        End If
    End Sub
    Mon problème est que la propriété Value reste à 0 Nom : Souci.jpg
Affichages : 126
Taille : 38,5 Ko
    Si quelqu'un peut m'aider. Merci d'avance

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    C'est pourtant la bonne syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub optWord_Click()
      With Me.MultiPage1
      .Value = 2
      End With
    End Sub
    Essayez la procédure événementielle Exit au lieu d'AfterUpdate

    [EDIT]
    Est-ce que par hasard le contrôle Textbox nommé TxtMDP ne se trouverait pas dans l'une des pages du contrôle Multipage ?
    Si c'est le cas, déplacez le à l'extérieur de celui-ci car curieusement l'instruction ne fonctionne pas à l'intérieure d'une page
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut
    Bonjour,
    J'ai tout essayé, mais le point étrange est que d'autres parties du code dysfonctionnent:
    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
    ' Cette procédure ne fonctionne pas
    Private Sub LstTraite_Click() 'Listbox
        Me.LstAttente.ListIndex = -1
        With Me.LstTraite
            Origine = .List(.ListIndex, 1) 'String => Chemin avec un \ à la fin
            Fichier = .List(.ListIndex, 0) 'Nom du fichier pdf qui inclus le .pdf à la fin
    'Contrôle PDFxChange   - Il ne fonctionne pas
            Me.Contrôle1.Src = Origine & Fichier
        End With
    End Sub
    ' Alors que cette procédure fonctionne très bien
    Private Sub LstAttente_Click()
        VideControl 1
        With Me.LstAttente
            Origine = .List(.ListIndex, 1)
            Fichier = .List(.ListIndex, 0)
            Me.Contrôle1.Src = Origine & Fichier
        End With
    End Sub
    Ensuite, j'ai des problèmes avec le ".SetFocus". Aucun ne fonctionne. Il ne tient pas compte de l'instruction, il passe systématiquement au TabIndex suivant.
    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
     
    Private Sub TxtMDP_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If Me.TxtMDP.Value <> MdP Then
            MsgBox "Mauvaise saisie d'utilisateur et/ou mot de passe", vbInformation, "Essaies encore"
            Me.TxtMDP.Value = ""
            Me.TxtMDP.SetFocus
        Else
            Application.Speech.Speak ">Bienvenue" & User, True 
        End If
    End Sub
    'Un autre sur un AfterUpdate
    Private Sub TxtDateFact_AfterUpdate()
        If IsDate(TxtDateFact.Value) = True Then
            FF_Date = Me.TxtDateFact.Value
        Else
            MsgBox "La date n'est pas saisie au bon format", vbInformation, "Oups"
            Me.TxtDateFact.Value = ""
            Me.TxtDateFact.SetFocus
        End If
        ControleDate
    End Sub
    Bref je suis un peu perdu.....

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne sais pas dans quelle situation se trouve le TextBox nommé TxtMDP car les procédures événementielles Exit et AfterUpdate ne réagissent bien que s'il y a au moins un autre contrôle actif, ComboBox, TextBox, CommandButton, etc.

    Un exemple d'un UserForm contenant plusieurs contrôles dont un MultiPage.

    A son ouverture seul le TextBox nommé txtPasswrd, son Label et le CommandButton nommé cmdExit seront visibles
    Pour l'exemple, le contrôle Multipage reste visible pour voir que le premier onglet est bien actif et dès que le mot de passe (pour l'exemple Admin) sera introduit

    Le code des procédures

    Procédure événementielle à l'activation du UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_Activate()
      ' Cache les contrôles
      With Me
      .txtPasswrd.Visible = False
      .lblPassWrd.Visible = False
      End With
      Me.mPgeDataSheet.Value = 0   ' Place le premier onglet du contrôle
      OppositeStatus               ' Inverse les propriétés Visible des contrôles
      Me.txtPasswrd.SetFocus       ' Met le focus
    End Sub
    La procédure OppositeStatus qui inverse les propriétés Visible des contrôles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub OppositeStatus()
      ' Inverse la propriété des contrôles
      ' Un contrôle doit rester visible
      With Me
      .txtPasswrd.Visible = Not .txtPasswrd.Visible
      .lblPassWrd.Visible = Not .lblPassWrd.Visible
      .frmDataSheet.Visible = Not .frmDataSheet.Visible
      .cboDataSheet.Visible = Not .cboDataSheet.Visible
      ' .mPgeDataSheet.Visible = Not .mPgeDataSheet.Visible
      End With
    End Sub
    La procédure événementielle qui vérifie le mot de passe et s'il est correct, cache les contrôles txtPasswrd et lblPassWrd, rend visible les autres contrôles et active la page nommée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub txtPasswrd_AfterUpdate()
      With Me
        If .txtPasswrd.Value = "Admin" Then
           OppositeStatus
           With Me.mPgeDataSheet
           .Value = .Pages("pgeArt").Index
           End With
         Else
           MsgBox "Mot de passe erroné"
        End If
      End With
    End Sub
    Procédure événementielle txtPasswrd_AfterUpdate qui active l'onglet nommé pgeArt (2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub txtPasswrd_AfterUpdate()
      With Me
        If .txtPasswrd.Value = "Admin" Then
           OppositeStatus
           With Me.mPgeDataSheet
           .Value = .Pages("pgeArt").Index
           End With
         Else
           MsgBox "Mot de passe erroné"
        End If
      End With
    End Sub
    Comme toutes les collections d'object, il y deux façons de manipuler l'un de ses éléments. Soit utiliser son numéro, soit son nom
    Donc pour activer la page d'un Multipage on écrira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.mPgeDataSheet.Value = 2
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Me.mPgeDataSheet
    .Value = .Pages("pgeArt").Index
    End With

    Les illustrations (avant/après)

    Nous pouvons voir sur la première illustration que c'est la page 0 qui est active et sur la seconde que c'est la page 2 (onglet Articles)

    Illustration 1 (Avant l'encodage du mot de passe)

    Nom : 201206 dvp MultiPage Img1.png
Affichages : 127
Taille : 12,8 Ko

    Illustration 2 (Après l'encodage du mot de passe)

    Nom : 201206 dvp MultiPage Img2.png
Affichages : 125
Taille : 12,1 Ko


    Le classeur ayant servi d'exemple
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut
    Bonjour,
    Pour essayer de mieux visualiser, je mets le contenu dans l'ordre, on est en début de procédure,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_Initialize()
        Me.MultiPage1.Value = 0
        Me.MultiPage1(1).Visible = False
        Me.MultiPage1(2).Visible = False
        Usf1.LstTraite.ColumnCount = 3     'C'est une Listbox en page 1
        Usf1.LstTraite.ColumnWidths = "150;500;0"
        With Me.CbxSociete
            .AddItem
            .List(.ListCount - 1, 0) = "SOCIETE1"
            .AddItem
            .List(.ListCount - 1, 0) = " SOCIETE2"
        End With
    End Sub
    On arrive alors sur cet écran:
    Nom : Login.jpg
Affichages : 119
Taille : 53,1 Ko
    Dans le principe, on sélectionne la société et le choix détermine la variable "Chaine de connexion" pour se connecter à la base SQLServer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CbxSociete_AfterUpdate()
        If Me.CbxSociete.ListIndex <> -1 Then
            If Me.CbxSociete.Text = "SOCIETE1" Then
                ConStrSql = "Provider=SQLOLEDB;Data Source= MONSERVEUR;Initial Catalog=SOCIETE1;User ID=ID;Password=;"
            ElseIf Me.CbxSociete.Text = "SOCIETE2" Then
                ConStrSql = "Provider=SQLOLEDB;Data Source=MONSERVEUR;Initial Catalog=SOCIETE2;User ID=ID;Password=;"
            End If
        Else
            MsgBox "Le choix de la société est obligatoire", vbCritical
            Me.CbxSociete.Text = ""
        End If
    End Sub
    Ensuite, on saisi son nom et par une requête on va vérfier que le nom d'utilisateur existe bien.
    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
    Private Sub TxtLogin_AfterUpdate()
        If Me.TxtLogin <> "" Then
            Login = Me.TxtLogin.Value
            FindUser
        End If
    End Sub
    Sub FindUser()
        Req = "SELECT N_User, ISNULL(Prenom,'Toto'), Password from USERS WHERE LOGIN = '" & Login & "'"
        With CreateObject("Adodb.connection")
            .Open ConStrSql
            Set Rst = .Execute(Req)
            If Rst.EOF = True Then
                MsgBox "Utilisateur incunnu...", vbInformation, "Mauvais Login"
                Usf1.TxtLogin.Value = ""
                Usf1.TxtLogin.SetFocus ' Ce setfocus ne marche pas, il passe quand même au textbox suivant TxtMDP
            Else
                N_User = Rst(0)
                User = Rst(1)
                MdP = Rst(2)
                Set Rst = Nothing
                .Close
            End If
        End With
    End Sub
    et ensuite le Mot de Passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub TxtMDP_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If Me.TxtMDP.Value <> MdP Then
            MsgBox "Mauvaise saisie d'utilisateur et/ou mot de passe", vbInformation, "Essaies encore"
            Me.TxtMDP.Value = ""
            Me.TxtMDP.SetFocus 'Ne marche pas non plus et met le focus sur le commandbutton
        Else
            Application.Speech.Speak ">Bienvenue" & User, True 'message vox asynchrone
        End If
    End Sub
    En premier lieu, et sujet initial du Post, le code ci dessous était placé après le Application.speech (ci dessus) et n'a jamais fonctionné. Il a fallu que je rajoute un CommandButton pour que ça marche.... Alors la question est pourquoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub CmdLog_Click()
        Me.MultiPage1(1).Visible = True
        Me.MultiPage1(2).Visible = True
        Me.MultiPage1.Value = 1
        Me.MultiPage1(0).Visible = False
    End Sub
    et le résultat du commandbutton:
    Nom : Apres.jpg
Affichages : 126
Taille : 105,9 Ko
    Merci

Discussions similaires

  1. [Google Sheets] Script, TypeError: Impossible de lire la propriété "values"
    Par PFG60 dans le forum APIs Google
    Réponses: 2
    Dernier message: 29/11/2017, 14h39
  2. [XL-2003] Impossible de modifier les propriétés d'un axe d'un graphique
    Par Sclarckone dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/08/2011, 14h38
  3. Réponses: 13
    Dernier message: 01/02/2010, 18h56
  4. Storyboard : Impossible de modifier la propriété après lancement de l'animation
    Par bolandfranck dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 28/05/2008, 23h58
  5. Réponses: 1
    Dernier message: 21/08/2007, 15h23

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