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 :

Formulaire de données Excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Formulaire de données Excel
    Nom : Onglet1.png
Affichages : 214
Taille : 5,7 Ko
    Nom : Onglet2.png
Affichages : 194
Taille : 2,8 Ko

    Bonjour,

    J'ai deux onglets (voir pièce jointe).

    Dans l'onglet1, mon formulaire avec les champs (D7 à J7) que l'utilisateur doit remplir.

    Ensuite, il y a des validations dans les champs:

    L7: =SI(ESTVIDE(D7);"Erreur";"OK"),
    M7: =SI(OU(ESTVIDE(E7);ET(E7="NON";ESTVIDE(F7));ET(E7="Oui";NON(ESTVIDE(F7))));"Erreur";"Ok"),
    N7: =SI(OU(ESTVIDE(G7);ET(G7="OUI";ESTVIDE(H7));ET(G7="NON";NON(ESTVIDE(H7))));"Erreur";"Ok"),
    O7: =SI(ESTVIDE(I7);"Erreur";"OK"),
    P7: =SI(ESTVIDE(J7);"Erreur";"OK"),
    Q7: =NB.SI(L7:P7;"Erreur").


    En cliquant sur le bouton "Soumettre", ce code VBA s'exécute:

    Le problème c'est que mes données ne s'affichent pas dans l'onglet2 à la ligne3.
    Pouvez-vous m'aider ? Merci!

    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
     
    Sub Valider()
    Dim ligne As Integer
    ligne = 2
     
    If (Range("Q7").Value = 0) Then
     
    While Sheets("Archives").Cells(ligne, 3).Value <> ""
       ligne = ligne + 1
    Wend
     
    'Msgbox ligne
     
    Sheets("Archives").Cells(ligne, 3).Value = Range("D7")
    Sheets("Archives").Cells(ligne, 3).Value = Range("E7")
    Sheets("Archives").Cells(ligne, 3).Value = Range("F7")
    Sheets("Archives").Cells(ligne, 3).Value = Range("G7")
    Sheets("Archives").Cells(ligne, 3).Value = Range("H7")
    Sheets("Archives").Cells(ligne, 3).Value = Range("I7")
    Sheets("Archives").Cells(ligne, 3).Value = Range("J7")
     
    Else
     
    MsgBox "Tous les champs ne sont pas correctements renseignés"
     
    End If
     
    End Sub
    Dernière modification par Invité ; 20/08/2020 à 19h34. Motif: Ajout des balises C

  2. #2
    Membre Expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 575
    Par défaut
    Bonjour

    Je pense que le problème vient du codage pour remplir ligne.
    Si j'ai bien compris, ligne sert à trouver la première ligne vide dans la colonne C de la feuille Archives.

    Les 3 lignes de While jusqu'à Wend peuvent, si c'est bien le cas, être remplacées par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = Sheets("Archives").Range("C" & Rows.Count).End(xlUp).Row + 1

    En espérant que cela aide

    Bonne journée

    Pierre Dumas

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

    En fait, les données doivent aller se copier sur la ligne 3 sous les titres dans le formulaire "Archives.

  4. #4
    Membre Expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 575
    Par défaut
    C'est bien ce qu'il me semblait avoir compris.

    Donc mon bout de code doit fonctionner (en remplacement de vos 3 lignes).

    Avez-vous essayé ?
    Est-ce que cela marche ?

    Bonne journée

    Pierre Dumas

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il faut toujours dissocier les différents traitements. Il y a un traitement qui sert à tester que les données sont correctes et un autre qui sert à les transférer.

    Pour le transfert, normalement, ton archive est constituée d'un tableau structuré. Dans ce cas-ci il contient le même nombre de colonnes que ton formulaire de saisie et les colonnes sont ordonnées de la même façon dans le formulaire et le tableau d'archives.

    Dans mon exemple, le tableau d'archives s'appelle Tableau1. En utilisant le tableau structuré en VBA, tu allèges beaucoup ton code, puisque l'opération se limite à ajouter une ligne au tableau d'archives, puis à transférer les données de ton "formulaire" sur cette ligne, puisque le formulaire et ta ligne d'archives ont la même structure (1 ligne, 7 colonnes ordonnées de façon identique).

    Voici le code de transfert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub SaveData()
      Dim Target As Range
      Dim i As Long
     
      Set Target = Range("tableau1").ListObject.ListRows.Add().Range
      Target.Value = Range("d7:j7").Value
    End Sub

    Je le dis souvent: Travailler avec des tableaux structurés en VBA te permet de te détacher du End(xlUp) (générateur potentiel d'erreur) et de l'emplacement de ton tableau d'archives (feuille et position sur celle-ci). Il n'y a que des intérêts à travailler avec les tableaux structurés pour ce genre de traitements
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre Expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 575
    Par défaut
    Je suis d'accord avec ce qu'a écrit Pierre (que je salue).

    Je pense que l'on peut faire plus simple/court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Tableau1").ListObject.ListRows.Add().Range.Value = Range("D7:J7").Value
    Bonne journée

    Pierre Dumas

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Pierre

    Citation Envoyé par Pierre Dumas Voir le message
    [...]
    Je pense que l'on peut faire plus simple/court[...]
    Oui, dans ce cas précis où il y a un parallélisme entre la ligne d'archive du tableau et le formulaire, on peut tout faire en une ligne. J'aime bien décortiquer pour que Catherine voit bien le processus qui est à l'oeuvre:
    • Ajouter une ligne dans le tableau d'archives;
    • Y transférer les données du "formulaire"...


    Dans la réalité, il est rare que le formulaire soit "en ligne" (car alors, autant saisir directement dans le tableau structuré). Dès lors, il est utile d'ajouter la ligne, puis de transférer les données via les index des listcolumns et éventuellement une table de mappage entre le formulaire et le tableau structuré. Ca permet une généralisation du processus et la création/utilisation d'une fonction générique qui transfère les données d'une plage de saisie à une ligne du tableau structuré



    Salut Catherine

    Citation Envoyé par catherinemsproject Voir le message
    Bonjour,

    Mon Formulaire a 7 colonnes (D à J) et mon Archive a aussi 7 colonnes (C à I).[...]
    J'ai repris ton exemple à la lettre (D à J d'un côté, soit 7 colonnes, et un tableau Tableau1 qui contient 7 colonnes ordonnées comme ton formulaire...
    As-
    Dès lors... Qu'est-ce qui "ne marche pas"? As-tu bien adapté mon code au nom de ton tableau structuré? As-tu un message d'erreur? Si oui lequel? Vois-tu ce qu'est un tableau structuré? Il me semble t'avoir déjà transmis le lien vers mon tuto à ce sujet dans nos échanges précédents. As-tu créé ce tableau?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

    Mon Formulaire a 7 colonnes (D à J) et mon Archive a aussi 7 colonnes (C à I).



    Ça ne fonctionne pas. À quel endroit dois-je remplacer mon code par le tien ? Désolé, je ne comprends pas.

    Merci!

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pour illustrer mon propos relatif à la généralisation d'une procédure...

    Pour faciliter le transfert d'infos entre une feuille "formulaire" et un tableau structuré, on peut imaginer ce qui suit:
    • On nomme chaque cellule de la feuille "Formulaire";
    • On crée un tableau (VBA, mais on peut le générer sur base d'une feuille Excel) comprenant les noms des cellules du formulaire et les noms des colonnes correspondantes du tableau structuré;
    • Une procédure générique qui reçoit le nom du tableau structuré de stockage et l'array de mappage.


    Du coup, la procédure est générique et peut être réutilisée de projet en projet.

    Voici le tableau structuré de stockage

    Nom : 2020-08-20_181229.png
Affichages : 197
Taille : 3,7 Ko


    Voici le formulaire (j'ai mi en italique le nom des cellules pour que l'on comprenne la conception)

    Nom : 2020-08-20_181430.png
Affichages : 166
Taille : 14,9 Ko


    La procédure générique est alors la suivante. On remarque qu'il n'y a dans ce code aucune notion liée au classeur. Ces notions lui sont passées en arguments, de sorte qu'elle peut être utilisée pour transférer n'importe quel ensemble de cellules nommées dans n'importe quel tableau, l'array Map et le nom de la table à alimenter étant indépendants de la procédure elle-même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub AddRow(TableName As String, Map)
      Dim i As Long
      Dim Target As Range
     
      Set Target = Range(TableName).ListObject.ListRows.Add().Range
      For i = 0 To UBound(Map) Step 2
        Target(1, Range(TableName).ListObject.ListColumns(Map(i + 1)).Index).Value = Range(Map(i))
      Next
    End Sub
    Dans le cas illustré ci-dessus, voici le code qui permet le transfert puis qui vide la feuille de saisie et la prépare pour une nouvelle saisie (la plage nommé Saisie regroupe les cellules de saisie du formulaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub TransferData()
      Dim Map
      Dim Target As Range
     
      Map = VBA.Array("Prénom", "Prénom", "Nom", "Nom", "DN", "DN", "VilleNaissance", "Lieu DN", "Adresse", "Adresse", "CodePostal", "CP", "Localité", "Ville")
      AddRow "t_Contacts", Map
      Range("saisie").ClearContents
      Range("saisie")(1).Select
    End Sub
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

    J'ai essayé ton exemple et ça fonctionne bien.

    J'aimerais savoir comment fais-tu pour nommer ta cellule "Prénom" dans la zone à gauche de la barre de formule ?

    Merci.

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'ai essayé de l'adapter au mien mais ça me dit Sub ou function non définie

    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
     
    Option Explicit
     
    Sub TransferData()
      Dim Map
      Dim Target As Range
     
      Map = VBA.Array("D7", "Confirmé", "E7", "Exact", "F7", "Déficitaire", "G7", "Capacité", "H7", "Supplémentaire", "I7", "Processus", "J7", "Embauche")
      AddRow "archives", Map
      Range("stages").ClearContents
      Range("stages")(1).Select
    End Sub
     
     
    'Sub AddRow(TableName As String, Map)
     ' Dim i As Long
     ' Dim Target As Range
     
     ' Set Target = Range(TableName).ListObject.ListRows.Add().Range
     ' For i = 0 To UBound(Map) Step 2
      '  Target(1, Range(TableName).ListObject.ListColumns(Map(i + 1)).Index).Value = Range(Map(i))
     ' Next
    'End Sub

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    1. Pour nommer une cellule, tu la sélectionnes puis, dans la zone de nom à gauche de la barre de formule, tu saisis le nom ET tu le valides avec ENTER (indispensable!!!). Le nom ne peut contenir que des chiffres, des lettres et le caractère _ et doit commencer par une lettre. il doit contenir 31 caractères maximum.


    2. Sub ou fonction non définie: Tu as commenté toute la procédure addNew, donc évidemment, l'appel de cette procédure dans TransferData pose problème puisque AddNew n'existe plus.



    [EDIT] Ce qui suit fait écho à une partie de ton message que tu as supprimée et qui disait que tu voulais transférer plusieurs lignes du "formulaire" dans autant de lignes des archives. Si ce n'est pas cela que tu souhaites réaliser, reprécise alors clairement ton besoin. Normalement, que se soit pour un "formulaire unique" ou pour transférer un ensemble de lignes répondant à une condition, tu as maintenant les cartes en main

    3. Normalement, un "formulaire", de façon généralement admise, consiste en une zone de saisie de données qui représentent UN enregistrement, c'est-à-dire ce qui sera stocké sur UNE ligne de la table dans laquelle les données seront stockées. Mon formulaire et la fonction générique que je propose fonctionne dans ce sens. Si tu souhaites transférer plus de lignes, tu peux utiliser ce que je propose au sein d'une boucle qui va tester chaque ligne et qui la transfèrera au tableau d'archives si elle répond aux conditions.

    Je proposes dans ce cas, pour simplifier le code VBA, d'avoir une colonne dans le tableau de saisie (la huitième) qui renvoie VRAI par rapport aux conditions citées. Dans tes précédentes discussions, des contributeurs dont moi t'ont montré comment rédiger les formules qui permettaient ces tests, notamment par mise en forme conditionnelle.

    Donc, à présent, le deal est de transférer les infos valides dans le tableau. idéalement, ce tableau de saisie devrait être aussi un tableau structuré. Si tes colonnes sont dans le même ordre dans tes deux tableaux, tu peux parcourir simplement les lignes de ton formulaire et transférer en un bloc chaque ligne valide dans l'archive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub TransferDataForm_1()
    ' Transfère les donnnées d'une ligne en un bloc
      Dim i As Long
      Dim Target As Range
     
      For i = 1 To Range("t_Saisie").Rows.Count
        If Range("t_Saisie")(i, 8).Value Then
          Range("t_Archives").ListObject.ListRows.Add().Range.Value = Range("t_Saisie")(i, 1).Resize(1, 7).Value
        End If
      Next
    End Sub
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. formulaire avec donnée excel comme paramètre
    Par nicop123456789 dans le forum IHM
    Réponses: 0
    Dernier message: 08/06/2010, 22h36
  2. [XL-2007] Modifier et remplacer des données excel depuis un formulaire
    Par SenseniX dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/12/2009, 10h59
  3. Réponses: 1
    Dernier message: 26/03/2007, 19h34
  4. [PHP-JS] Données formulaire dans fichier Excel
    Par Partner dans le forum Langage
    Réponses: 2
    Dernier message: 05/10/2006, 16h04
  5. PB d'utilisation des formulaires de données dans EXCEL
    Par adil155 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/11/2005, 16h09

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