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

  1. #1
    Membre à l'essai
    Homme Profil pro
    ingénieur industriel
    Inscrit en
    août 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Maroc

    Informations professionnelles :
    Activité : ingénieur industriel

    Informations forums :
    Inscription : août 2019
    Messages : 12
    Points : 13
    Points
    13
    Par défaut VBA : accéder à un tableau dans une feuille à partir d'un COMBO
    salut tout le monde !
    mon programme permet d'ajouter dans un journal les arrêts rencontrés durant le travail en entrant les informations correspondantes.
    pour cela j'ai mis un COMBO pour le choix de la machine (Désignation objet)en premier lieu, des boutons d'option pour le type d'arrêt (meca. ou élec.) et puis le deuxième COMBO qui affiche les arrêts possibles en relation avec la machine et le type d'arrêt à l'aide d'une base de donnée qui se trouve dans une feuille correspondante à la machine
    Nom : vba.JPG
Affichages : 37
Taille : 41,3 Ko

    voilà la base de donnée
    Nom : vba 2.JPG
Affichages : 41
Taille : 47,4 Ko

    la base de donnée de chacune des machine est mit dans une feuille qui porte le nom de la machine (ex: DATEUSE) cette BDD est constituée de deux tableau séparés :
    le 1er: Elec_Dateuse
    le 2eme: Meca_Dateuse

    Mon problème c'est que si j'ai un nouveau arrêt qui ne se trouve pas dans mon 2eme COMBO alors je vais l'écrire dans une zone de texte (après avoir remplir le 1er COMBO et les BTN d'option) qui va être ajouter dans la BDD correspondante et le tableau correpondant

    NB: puis je me servir des choix du premier COMBO pour accéder à la feuille de la machine, car j'ai mis les mêmes noms des feuilles dans le choix du COMBO?

  2. #2
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 509
    Points : 40 087
    Points
    40 087
    Billets dans le blog
    57
    Par défaut
    Salut.

    Se pose pour moi un problème de conception.

    Les arrêts machine doivent se trouver dans le même tableau, quelle que soit la machine. Créer un tableau par machine n'a pas de sens.

    Il te faut donc un tableau avec:
    • la machine;
    • la cause de l'arrêt;
    • la date (et éventuellement l'heure);
    • l'heure (si pas dans la colonne précédente);
    • ... d'autres informations utiles.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre à l'essai
    Homme Profil pro
    ingénieur industriel
    Inscrit en
    août 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Maroc

    Informations professionnelles :
    Activité : ingénieur industriel

    Informations forums :
    Inscription : août 2019
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Le journal comporte la machine, la cause, la date ......

    le journal se base sur les BDD que j'ai dans les autres pages.
    si j'applique votre solution j'aurai créer un tableau de 3 colonnes (machine;arrêt;type) dans une page appelée BDD par exemple;
    Le problème avec ça c'est dans mon Userform (macro) càd le code car je dois faire un filtre avec le premier COMBO (designation objet ) et le type d'arrêt choisi;
    j'avais cette idée en premier lieu mais j'ai pas trouver de solution et ça ma pris bcp de temps car je suis un (débutant) en VBA
    donc j'ai fais la solution actuelle.
    Mais pouvez vous me montrez comment faire ?

  4. #4
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 509
    Points : 40 087
    Points
    40 087
    Billets dans le blog
    57
    Par défaut
    Au départ, trois tableaux:
    • t_Machines, qui contient la liste des machines;
    • t_PannesTypes, qui contient la liste des pannes possibles par machine et leur type;
    • t_Pannes, qui contient les pannes réelles.


    Un userform avec les contrôles suivants:
    • tboDate, textbox pour la date de la panne;
    • tboWorker, textbox pour le nom de la personne qui encode la panne;
    • cboTool, combobox pour choisir la machine;
    • cboBreakdown, combobox pour choisir la panne;
    • optElectrical, optionbutton pour déterminer qu'on encode une panne électrique;
    • optMechanical, optionbutton pour déterminer qu'on encode une panne mécanique;
    • btnValidate, bouton de commande pour valider la saisie.



    Le code du userform est assez simple, il pilote les événements. On remarque une fonction qui détermine le type de panne encodée, et qui est utilisée à plusieurs endroits. On remarque également, comme toujours dans mes userform, la propriété publique Result valorisée par le click sur le bouton de validation. On remarque enfin que le code qui alimente les combobox et qui traite la saisie n'est pas dans le userform, mais en dehors. Il en va de même pour la fonction qui adapte le combobox des types de pannes, que j'ai externalisé du combobox, mais qui est appelée par le userform.

    Code vba : 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
    Option Explicit
     
    Public Result As String
     
    Private Sub btnValidate_Click()
      Result = "Validate"
      Me.Hide
    End Sub
     
    Private Sub cboTool_Change()
      cboBreakDown.List = getBreakDownTypes(cboTool.Value, getType())
    End Sub
     
    Private Sub optElectrical_Click()
      cboBreakDown.List = getBreakDownTypes(cboTool.Value, getType())
    End Sub
     
    Private Sub optMechanical_Click()
      cboBreakDown.List = getBreakDownTypes(cboTool.Value, getType())
    End Sub
     
     
    Function getType() As String
      If optElectrical Then
        getType = "Panne électrique"
      ElseIf optMechanical Then
        getType = "Panne mécanique"
      End If
    End Function

    Le userform est géré par une procédure dans un module standard, qui charge les combo puis, après validation, transfère les données dans une nouvelle ligne de la table de données (tableau structuré). Dans le même module standard, on a la fonction qui alimente le combobox des pannes possibles.

    Code vba : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Option Explicit
     
    Sub ShowForm()
      Dim Row As ListRow
     
      With UserForm1
        .cboTool.List = Range("t_Machines[Machine]").Value
        .Show
        If .Result = "Validate" Then
          Set Row = Range("t_Pannes").ListObject.ListRows.Add()
          Row.Range(1).Value = .cboTool.Value
          Row.Range(2).Value = .cboBreakDown.Value
          Row.Range(3).Value = .getType()
          Row.Range(4).Value = CDate(.tbaDate.Value)
          Row.Range(5).Value = .tboWorker.Value
        End If
      End With
      Unload UserForm1
    End Sub
     
    Function getBreakDownTypes(Tool As String, Optional BreakDownType As String) As Variant
      ReDim Values(0 To 0) As Variant
      Dim Value As String
      Dim r As Range
     
      For Each r In Range("t_PannesTypes[Machine]")
        Value = ""
        If r.Value = Tool Then
          If BreakDownType = "" Then
            Value = r(1, 2).Value
          ElseIf BreakDownType = r(1, 3).Value Then
            Value = r(1, 2).Value
          End If
          If Value <> "" Then
            If Not IsEmpty(Values(0)) Then ReDim Preserve Values(0 To UBound(Values) + 1)
            Values(UBound(Values)) = Value
          End If
        End If
      Next
      getBreakDownTypes = Values
    End Function


    On remarque que tout s'articule sur trois tableaux (tables de données) pour faciliter la manipulation des données. Normalement, mon code est plus "professionnel" que cela, j'ai ici illustré rapidement l'architecture à mettre en place, selon moi, pour gérer ce genre de cas. Ce code est exemplatif de l'échange de données entre des tables de données et des userforms. En cas d'un nombre important de machines et/ou de pannes possibles, la fonction GetBreakDownTypes pourrait être plus rapide en manipulant des tableaux (arrays), mais il faut déjà un nombre important de lignes. Normalement, on ne passe pas les données dans la nouvelle ligne par position de cellule comme je l'ai fait ici mais par nom de colonne, pour prévenir des déplacements de colonne à l'intérieur de la table. L'architecture découpée en petites procédures/fonctions permet ces adaptations assez rapidement. Il conviendrait également de tester les saisies, notamment pour la date, et d'architecturer son code de vérification comme je l'explique dans ce billet.

    Avec du beaucoup plus simple et même sans vba, il est possible de faciliter la saisie des données directement dans la table t_Pannes, au prix d'une petite réorganisation des données de la table des pannes possibles pour obtenir les listes de validation en cascade. Ca évite le VBA, ça évite le problème des dates saisies dans des textbox, et je pars du principe que moins il y a de vba dans un classeur, moins il y a de risques de bugs. On pourrait aussi, avec très peu de vba, gérer une feuille Excel comme un formulaire, et gérer le transfert dans la table par quelques lignes de code très simple. C'est plus léger et plus souple que l'utilisation d'un userform.

    J'insiste également sur le fait qu'un classeur Excel n'est a priori pas partageable, et donc que le travail en équipe sur le classeur est du domaine de l'utopie. Normalement, c'est le boulot d'un truc comme Access de gérer les saisies, éventuellement partagées, et de mettre à disposition d'Excel une table à plat pour l'analyse (TCD, graphiques, KPI, ...).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/09/2018, 16h19
  2. [AJAX] Recharger un tableau dans une page à partir d'une thickbox
    Par benthebest dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/10/2008, 11h24
  3. Accéder à un tableau dans une fonction
    Par valanagrid dans le forum C++
    Réponses: 10
    Dernier message: 18/09/2006, 16h08
  4. [VBA-E]Copier données dans une feuille créée
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/05/2006, 09h09
  5. [VBA-E]tri/sélection dans une feuille
    Par philpommé dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/04/2006, 20h18

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