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 :

Récupérer les données saisies dans un formulaire


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut Récupérer les données saisies dans un formulaire
    Bonjour à toutes et tous,

    Je cherche à récupérer dans la première ligne vide de mon tableau structuré les données saisies dans mon formulaire.

    Quand je prends ce code cela fonctionne mais je mets en dur la cellule où récupérer la donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub TextBox_Date_Change()
     
    Sheets("Feuil1").Activate
     
        Range("E25") = TextBox_Date.Value
     
    End Sub
    Quand je mets en place la recherche de la première cellule vide avec le code ci-dessous il se passe des choses bizarres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub TextBox_Date_Change()
     
    Sheets("Feuil1").Activate
     
        DerCell = Cells(Rows.Count, "E").End(xlUp).Row 'Dernière cellule non vide
        Cells(DerCell + 1, "E") = TextBox_Date.Value 'DerCell + 1 => Première cellule vide
     
     End Sub
    Pour chaque caractère saisi il y a la génération d'une ligne supplémentaire.
    Ce qui fait que la date 24/07/23 est saisie sur 8 lignes (1 caractère rajouté par ligne). La 8ème ligne correspond au 24/07/23.

    Comment puis je résoudre ce problème.

    Cela se produit pour chaque item de mon formulaire.

    Merci pour votre aide.

    Philippe

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, ça me semble un comportement normal. En effet, tu utilises l'événement _Change, donc à chaque caractère que tu tapes dans ta textbox, l'événement se déclenche et exécute le code.

  3. #3
    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 cherche à récupérer dans la première ligne vide de mon tableau structuré les données saisies dans mon formulaire.
    Indépendamment de la réponse de Franc, que je salue au passage, si vous travaillez vraiment avec un tableau structuré, vous n'avez pas besoin d'utiliser des instructions de plage classiques telles que DerCell = Cells(Rows.Count, "E").End(xlUp).Row 'Dernière cellule non vide et il est parfaitement inutile d'activer la feuille pour lire ou écrire dans le tableau. Excel sait où il se trouve si vous utilisez les bonnes méthodes et propriétés.

    Exemple pour écrire à la colonne nommée "Libellé" et à la ligne qui suit la dernière d'un tableau nommé "t_Data"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub t()
      Dim t As ListObject
      Dim cn As Integer
      Set t = Range("t_Data").ListObject
      With t
       cn = .ListColumns("Libellé").Index ' Numéro de la colonne
      .ListRows.Add                       ' Ajoute une ligne au tableau
       With .DataBodyRange
       .Cells(.Rows.Count, cn).Value = "Test"
       End With
      End With
      Set t = Nothing
    End Sub
    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

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonjour Messieurs

    Merci pour vos réponses.

    Je m'aide entre autre de ce tuto
    https://silkyroad.developpez.com/VBA...serForm/#LII-E
    et de bidouille de codes glanés sur le forum.

    @Franc :
    ça me semble un comportement normal. En effet, tu utilises l'événement _Change
    Je me doutais bien que c'était Change qui me posait problème.
    Mais dans plein de codes de TextBox on trouve "Private Sub TextBox1_Change()"
    Comment dois-je procéder pour ne plus avoir ce problème. Je tourne en rond depuis ce matin et fais de multiples essais à partir de discutions de ce forum.

    @Philippe Tulliez
    Merci une fois de plus pour votre approche pédagogique.
    Votre code fonctionne à merveille dans le code de ma TextBox en mettant .Cells(.Rows.Count, cn).Value = TextBox_Date.Value

    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
    Private Sub Val_Crédit_Change() '25/07 Fonctionne
    'La cellule Kxxxxx (de la feuille active) obtient la valeur de la zone de texte nommée "Val_Crédit"
     
    ' Pour écrire à la colonne nommée "Crédit" et à la ligne qui suit la dernière d'un tableau nommé "Cpta_Test"
      Dim t As ListObject ' t = Le tableau concerné
      Dim cn As Integer   ' cn = La colonne concernée
      Set t = Range("Cpta_Test").ListObject ' Cpta_Test = tableau pour écriture
      With t
       cn = .ListColumns("Crédit").Index ' Nom de la colonne concernée
       .ListRows.Add                      ' Ajoute une ligne à la fin du tableau
       With .DataBodyRange '????
       .Cells(.Rows.Count, cn).Value = Val_Crédit.Value ' Identification de la cellule concernée et insertion valeur saisie
       End With
      End With
      Set t = Nothing
     
    End Sub
    Juste un point, je ne comprend pas la ligne 11 : With .DataBodyRange

    La question reste entière quant à Change.


    Philippe

  5. #5
    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 Philippe,
    Juste un point, je ne comprend pas la ligne 11 : With .DataBodyRange
    Lorsque l'on utilise sur plusieurs lignes le même objet ou la même propriété on insère le code dans un bloc With...End With
    Cela clarifie le code. Le point qui précède les objets ou propriétés à l'intérieur du bloc indique qu'ils sont rattachés à l'objet ou propriété du bloc

    Ainsi dans le bloc en question j'utilise deux fois DataBodyRange
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With .DataBodyRange '????
    .Cells(.Rows.Count, cn).Value = Val_Crédit.Value ' Identification de la cellule concernée et insertion valeur saisie
    End With
    Cela évite d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .DataBodyRange.Cells(.DataBodyRange.Rows.Count, cn).Value = Val_Crédit.Value
    Mais ce bloc With .DataBodyRange est lui-même imbriqué dans un autre bloc avec la variable objet t
    Ce évite d'écrire le code comme ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cn =  t.ListColumns("Crédit").Index ' Nom de la colonne concernée
    t.ListRows.Add                      ' Ajoute une ligne à la fin du tableau
    t.DataBodyRange.Cells(t.DataBodyRange.Rows.Count, cn).Value = Val_Crédit.Value ' Identification de la cellule concernée et insertion valeur saisie
    J'espère que c'est clair.
    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

  6. #6
    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 Philippe,
    La question reste entière quant à Change.
    On utilisera l'événement Change d'un TextBox par exemple pour faire une recherche dans une colonne.
    Ainsi à chaque insertion d'une lettre dans le contrôle on affine la recherche puisque le fait d'insérer un caractère provoque l'événement
    Si je tape B dans le TextBox , on pourrait par exemple dans un ListBox afficher tous les mots commençant par A et dès l'introduction d'un "a", la liste affichera tous les mots commençant par Ba
    C'est l'effet que l'on a lorsque l'on fait une introduction de lettre dans la zone de recherche du filtre simple d'excel (où là c'est plutôt une recherche sur le mot qui contient ce que l'on cherche)

    Pour effectuez un test et comprendre, vous insérez dans un nouveau UserForm, un TextBox et un Label sans les renommer et vous insérer ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TextBox1_Change()
       Me.Label1.Caption = Me.TextBox1.Value
    End Sub
    Privilégiez l'événement AfterUpdate
    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

  7. #7
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonjour Philippe Tulliez

    Merci pour vos réponses.
    Je m'y plonge ce matin
    Philippe

  8. #8
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut EUREKA
    Bonjour messieurs,

    Merci pour votre aide. Cela fonctionne.
    La clé :
    Privilégiez l'événement AfterUpdate
    Voici mon code
    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
    Private Sub Val_Crédit_AfterUpdate() 
     
    If TextBox_Date.Value = "" Then Exit Sub 'Permet de bloquer la donnée saisie dans la dernière ligne si la date n'a pas été saisie.
     
    ' Pour écrire à la colonne nommée "Crédit" et à la ligne qui suit la dernière d'un tableau nommé "Cpta_Test"
      Dim t As ListObject 
      Dim cn As Integer   
      Set t = Range("Cpta_Test").ListObject 
      With t
       cn = .ListColumns("Crédit").Index 
       '.ListRows.Add                      ' Pas nécessaire sinon génère une seconde ligne car la ligne est créée lors de la saisie de la date.
       With .DataBodyRange
       .Cells(.Rows.Count, cn).Value = Val_Crédit.Value
       End With
      End With
      Set t = Nothing
     
    End Sub
    Je continue avec ce formulaire.

    Philippe

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

Discussions similaires

  1. [WD-2010] Récupérer les données saisies dans un formulaire
    Par patch2007 dans le forum Word
    Réponses: 3
    Dernier message: 10/10/2012, 10h05
  2. Réponses: 1
    Dernier message: 26/03/2008, 15h54
  3. [MySQL] récupérer les données mysql dans un formulaire
    Par cali62100 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/04/2007, 14h17
  4. Réponses: 2
    Dernier message: 08/01/2007, 09h01
  5. Recuperer les données saisie dans un formulaire
    Par hunzi dans le forum XMLRAD
    Réponses: 3
    Dernier message: 29/08/2006, 15h22

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