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 :

Compléter un tableau avec Userform (Find ?) [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Compléter un tableau avec Userform (Find ?)
    Bonjour,

    Je suis actuellement en train de construire un nouveau fichier excel devant me permettre de suivre la gestion du matériel. Pour ce faire je souhaite passer par 2 UserForm, le premier « Formulaire Prise Matériel » me permet de renseigner la date de prise de matériel, le matricule opérateur prenant le matériel ainsi que le CAB du matériel correspondant.

    Jusque-là aucun souci, cependant je rencontre une petite difficulté concernant la dépose du matériel, j’aimerais si possible avec un deuxième UserForm « Formulaire Dépose Matériel », venir compléter ma colonne D « Bip Sortie ». Dans cette colonne, je souhaite que l’opérateur en fin de service vienne compléter la cellule avec le CAB du matériel pour confirmer qu’il a bien redéposé le matériel.

    Pour ce faire je souhaite que les deux Userform soient identiques, comme dans l’exemple fourni, sauf que le premier va permettre de compléter les colonnes A, B, C et le deuxième UserForm viendra compléter en fin de journée la colonne D.

    Le souci est le suivant :

    Comment faire pour que mon Userform complète la colonne de D du bon opérateur ?

    Exemple : L’opérateur 01 complète le premier UserForm en début de journée, j’obtiens correctement la Date, son matricule, et le CAB de son matériel. En fin de journée l’opérateur 01 vient compléter le deuxième UserForm pour confirmer la dépose du matériel. Cependant je souhaite que la dépose du matériel de l’opérateur 01 soit associés à la ligne complétée au matin grâce au premier UserForm, et non dans une nouvelle ligne.

    Je pensais utiliser les informations Matricule opérateur et CAB Matériel afin de trouver la ligne correspondante. Si les informations en B et C sont identiques à celle du deuxième Userform alors on vient compléter la colonne D avec le CAB matériel.

    En espérant que mes explications soient assez claires pour vous, merci d’avance pour votre aide ainsi que votre temps.

    Cordialement,

    Alex
    Fichiers attachés Fichiers attachés

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 223
    Points : 52 633
    Points
    52 633
    Billets dans le blog
    115
    Par défaut
    Salut.

    Je te propose la lecture de ma contribution sur le sujet, et de revenir ici avec des questions éventuelles.

    Perso, je n'aime pas trop Find, qui mélange allègrement l'interface Excel et le VBA, et je lui préfère une recherche formulée en VBA, soit avec Evaluate() ou Application.Match()

    Voici un exemple qui utilise Evaluate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      Dim Index As Long
     
      Index = Evaluate("iferror(match(13,t_Contacts[id],0),0)")
      If Index <> 0 Then Range("t_Contacts[dn]")(Index).Value = DateSerial(2010, 12, 19)
    End Sub
    Nom : 2021-09-24_143351.png
Affichages : 48
Taille : 26,9 Ko


    Voici un autre code tout aussi fonctionnel, utilisant Match comme fonction de l'objet Application d'Excel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      Dim Index
     
      Index = Application.Match(13, Range("t_Contacts[ID]"), 0)
      If Not IsError(Index) Then Range("t_Contacts[dn]")(Index).Value = DateSerial(2010, 12, 19)
    End Sub
    "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...
    ---------------

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 223
    Points : 52 633
    Points
    52 633
    Billets dans le blog
    115
    Par défaut
    On peut généraliser les transferts entre table et userform (formulaire), comme on le ferait entre table et formulaire "feuille de calcul"...

    Le principe est de trouver la position de la ligne dans le tableau et de créer un array (tableau VBA) contenant les paires contrôle USF / Colonne tableau.

    Voici les fonctions de transfert:
    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
    Sub FormToTable(ByVal Tablename As String, ByVal Index As Long, Form As UserForm, Map)
      Dim i As Long
     
      For i = 0 To UBound(Map) Step 2
        Range(Tablename & "[" & Map(i + 1) & "]")(Index).Value = Form.Controls(Map(i)).Value
      Next i
    End Sub
     
    Sub TableToForm(ByVal Tablename As String, ByVal Index As Long, Form As UserForm, Map)
      Dim i As Long
     
      For i = 0 To UBound(Map) Step 2
        Form.Controls(Map(i)).Value = Range(Tablename & "[" & Map(i + 1) & "]")(Index).Value
      Next i
    End Sub
    Pour passer une donnée du tableau des contacts dans le formulaire, on utilisera par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub TransferContactToForm()
      Dim Index As Long
     
      If Not Intersect(ActiveCell, Range("t_Contacts")) Is Nothing Then
        Index = ActiveCell.Row - Range("t_Contacts[#headers]").Row
        TableToForm "t_Contacts", Index, usfContacts, Array("tboID", "ID", "tboFirstname", "Prénom", "tboLastname", "Nom", "tbobirthdate", "DN")
        usfContacts.Show
      End If
    End Sub

    Le formulaire utilisera l'autre fonction pour transférer vers la table, par exemple avec ce code placé dans le module du userform (EDIT: Adaptation de la ligne de récup de la valeur du msgbox):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TransferData()
      Dim Index
     
      Index = Application.Match(tboID.Value * 1, Range("t_Contacts[id]"), 0)
      If IsError(Index) Then
        If MsgBox("Cet ID n'existe pas. Voulez-vous le créer?", vbYesNo) = vbYes Then
          Index = Range("t_Contacts").ListObject.ListRows.Add.Index
        End If
      End If
      If Not IsError(Index) Then FormToTable "t_Contacts", Index, _
        Me, Array("tboID", "ID", "tboFirstname", "Prénom", "tboLastname", "Nom", "tbobirthdate", "DN")
    End Sub
    "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...
    ---------------

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour Pierre !

    Tout d’abord merci pour vos réponses, j’ai eu l’occasion de lire attentivement votre contribution, cela est très intéressant et enrichissant pour un débutant en VBA tel que moi !

    J’ai essayé de suivre votre logique et de l’appliquer à mon cas, malheureusement je dois modifier la structure de mon fichier (demande de dernière minute). Je pense pouvoir réussir à confectionner quelque chose grâce à vos différents exemple, merci encore pour votre aide !

    Cordialement,
    Aleds

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 223
    Points : 52 633
    Points
    52 633
    Billets dans le blog
    115
    Par défaut
    L'avantage des solutions que je te propose est qu'elles sont génériques, puisqu'elles ne contiennent rien de spécifique à ton fichier. C'est l'appel à ces fonction qui contient ce qui est spécifique (nom de la table, position de la ligne dans la table, userform et tableau d'appariement contrôles/Colonnes. Une modification côté Excel (tableau structuré) et côté VBA (userform) demandant uniquement de modifier la ligne d'appel, et notamment le tableau d'appariement.

    N'hésite pas à revenir dans cette discussion si problème ou question
    "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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    L'avantage des solutions que je te propose est qu'elles sont génériques, puisqu'elles ne contiennent rien de spécifique à ton fichier. C'est l'appel à ces fonction qui contient ce qui est spécifique (nom de la table, position de la ligne dans la table, userform et tableau d'appariement contrôles/Colonnes. Une modification côté Excel (tableau structuré) et côté VBA (userform) demandant uniquement de modifier la ligne d'appel, et notamment le tableau d'appariement.

    N'hésite pas à revenir dans cette discussion si problème ou question
    Petite question ! J'aimerais réaliser un seul Userform en suivant ta logique de structuration de fichier et Application.Match. Penses-tu qu'il soit possible de réaliser un Userform suivant la logique suivante ?

    1) L'userform ne contient que 2 textbox CabMat / CabBip
    2) Si on ne retrouve pas CabMat dans le tableau "t_data[Matricule]" alors on ajoute les données de l'userform à notre tableau structuré
    3) Si CabMat est identifié grâce à Application.match alors j'ajoute CabBip en "t_data[Bip Sortie]"

    Procéder de cette manière me semble moins pénible que ma première demande dans le forum !

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 223
    Points : 52 633
    Points
    52 633
    Billets dans le blog
    115
    Par défaut
    Oui, en te basant sur le code TransferData que je t'ai donné dans ma première réponse... (J'ai corrigé une coquille dans le code que j'avais donné précédemment).

    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
    Private Sub btnValidate_Click()
      TransferData
    End Sub
     
    Sub TransferData()
      Dim Index
     
      Index = Application.Match(tboCabMat.Value, Range("t_Data[Matricule]"), 0)
      If IsError(Index) Then
        If MsgBox("Cet ID n'existe pas. Voulez-vous le créer?", vbYesNo) = vbYes Then
          Index = Range("t_Data").ListObject.ListRows.Add.Index
        End If
      End If
      If Not IsError(Index) Then FormToTable "t_Data", Index, _
        Me, Array("tboCabMat", "Matricule", "tboCabBip", "Bip Sortie")
    End Sub
    "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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Oui, en te basant sur le code TransferData que je t'ai donné dans ma première réponse[...]
    Parfait merci beaucoup Pierre ! C'est exactement ce que j'attendais de cet userform, encore merci pour votre aide et votre implication dans ce forum !

    Bonne journée à toi,
    Cordialement

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 223
    Points : 52 633
    Points
    52 633
    Billets dans le blog
    115
    Par défaut
    Tant mieux. Ravi d'avoir pu t'aider.


    Lorsque des données doivent être manipulées par formulaire, il est plus économique d'utiliser le même formulaire pour l'ajout de nouvelles données et pour la modification de données existantes. On ne crée ainsi qu'un formulaire qui contient tout le code de gestion des données, en ce compris le code de vérification des données saisies. Les modifications et adaptations ultérieures ne seront alors qu'à réaliser une seule fois.
    "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...
    ---------------

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

Discussions similaires

  1. [XL-2016] Modifier Tableau avec Userform
    Par Floyd-44 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 23/08/2018, 07h22
  2. [XL-2003] Remplir tableau avec Userform
    Par ananar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/12/2010, 16h07
  3. [PHP 5.0] Complèter un tableau avec une boucle "for"
    Par kriekbellevue dans le forum Langage
    Réponses: 1
    Dernier message: 07/12/2008, 22h04
  4. [AJAX] Compléter un tableau avec Ajax
    Par nic2t dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/02/2008, 16h35
  5. [VBA Excel] Tableau avec données du userform et de formules
    Par Viper7 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/06/2006, 13h29

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