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 :

Utilitaire de choix de matériaux [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2015
    Messages : 16
    Par défaut Utilitaire de choix de matériaux
    Bonjour à toutes et tous,


    Je fais appelle à vos connaissances aujourd'hui car je suis nulle. Oui, autant ne pas se mentir je ne maitrise pas VBA.

    Je dois réaliser un utilitaire logiciel de détermination d'impact environnemental pour le choix de matériaux lors de la conception d'un ensemble.
    Ce logiciel doit permettre, notamment :
    • la saisie de l'arborescence de l'ensemble à concevoir
    • la sélection de matériaux de chaque pièce et de la masse utilisée
    • calculer l'impact environnemental de chaque pièce de manière globale avec pondération et détaillée
    • fournir un diagramme radar d'impact détaillé



    Certains me diront, "pff facile, regarde ce cours-ci" ou encore "il suffit de faire ça, trop simple"... Sachez que je suis partie de vraiment rien il y a un mois et j'ai du lire tous les cours VBA disponibles sur internet et j'ai même acheté un livre. J'ai donc les bases du langage, des fonctions, des macros,... et quelques notions supplémentaires. Mais pas du tout la logique; je suis perdue. Je sais où je veux aller mais je ne sais pas comment le réaliser.

    J'ai créé un Userform UF_Pièces qui se présente de la manière suivante:
    Pièce jointe 185134

    Je veux saisir le nom de mon ensemble, sous ensemble, pièce ainsi que ca masse. Cela fonctionne et est renvoyé à la ligne spécifiée sur la feuille "arborescence":
    Nom : UF_Pièces & Arborescence.PNG
Affichages : 572
Taille : 26,7 Ko

    Mon premier problème est le suivant: je n'arrive pas à créer une boucle qui, à chaque fois que j'appuie sur "valider" écris les valeurs saisies un ligne en dessous. Voila ce que j'ai fait et cela écrit toujours sur la même ligne:

    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 B_Val_P_Click()
    Ensemble = TB_Ensemble.Text
    Nom_SE = TB_SE.Text
    Nom_Piece = TB_Nom_P.Text
    Mat_Piece = CB_Mat_P.Text
    Masse_Piece = TB_Masse_P.Text
     
    If B_Val_P = True Then
    i = 3
    Worksheets("Arborescence").Cells(i, 1) = Ensemble
    Worksheets("Arborescence").Cells(i, 2) = Nom_SE
    Worksheets("Arborescence").Cells(i, 3) = Nom_Piece
    Worksheets("Arborescence").Cells(i, 4) = Mat_Piece
    Worksheets("Arborescence").Cells(i, 5) = Masse_Piece
    i = i + 1
    End If
     
    End Sub
    Mon second problème est que je n'arrive pas à sélectionner une plage de données allant de A2 à A20 -pour le moment, sur la feuille Matériaux. En effet je n'arrive qu'à sélectionner une cellule, en l’occurrence A2 par "range", si je met "cells" et la plage voulue, il me dit incompatibilité de type....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CB_Mat_P_Change()
    CB_Mat_P = Worksheets("Matériaux").Range("A2")
    End Sub

    Je pense que pour l'instant je ne vais pas vous embêter plus que ça, si quelqu'un est passionné par mon problème, je vous expliquerais le reste.
    Je vous remercie en tout cas par avance de votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Par défaut
    Bonjour,

    Q1: Utilise la méthode end(xlup).
    ps: au passage tu peux stocker ta feuille de calcul dans une variable, ça utilisera moins de ressources si tu l'utilise souvent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim Ligne As Long
    Dim shArbo As Worksheet
    Set shArbo = ThisWorkbook.Sheets("Arborescence") ' ou un autre workbook si ce n'est pas celui dans lequel la macro est écrite
     
    Ligne = shArbo.Cells(Rows.Count, 1).End(xlUp).Row + 1
    ' cells(rows.Count,1) selectionne la dernière cellule de la colonne A.
    'end(xlup) recherche la dernière cellule utilisée vers le haut
    'on ajoute .row pour récupérer le numéro de la ligne et pas un objet range
     
    shArbo.Cells(Ligne, 1) = Ensemble
    '...
    Q2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim CB_Mat_P as variant
    CB_Mat_P = Worksheets("Matériaux").Range("A2:A20")
    CB_Mat_P = Worksheets("Matériaux").Range(cells(2,1),cells(20,1))
    Bon courage !

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 75
    Par défaut
    Salut !
    Je te préviens dès maintenant je suis dans la même situation que toi, j'ai commencé la VBA il y a moins de 2 mois pour mon stage d'été !
    J'ai ptet une solution pour ta 1ère question : si j'ai bien compris, tu voudrais pouvoir rentrer plusieurs lignes de suite, que la Userform s'ouvre plusieurs fois de suite tant que t'as quelque chose à ajouter.

    Donc si j'ai vu juste, voila ce que je te propose :
    Un module que j'appelerai "Main" qui possèdera les variables i et bnext et qui va lancer ta Userform de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public bnext As Boolean
    Public i As Integer
     
    Sub main()
        bnext = True
        i = 1
        While bnext = True
            Userbox.Show
        Wend
    End Sub
    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 B_Val_P_Click()
     
        Ensemble = TB_Ensemble.Text
        Nom_SE = TB_SE.Text
        Nom_Piece = TB_Nom_P.Text
        Mat_Piece = CB_Mat_P.Text
        Masse_Piece = TB_Masse_P.Text
     
        Worksheets("Arborescence").Cells(i, 1) = Ensemble
        Worksheets("Arborescence").Cells(i, 2) = Nom_SE
        Worksheets("Arborescence").Cells(i, 3) = Nom_Piece
        Worksheets("Arborescence").Cells(i, 4) = Mat_Piece
        Worksheets("Arborescence").Cells(i, 5) = Masse_Piece
        i = i + 1
     
    End Sub
    Et c'est dans le code du bouton "Quitter" que tu rentres "bnext = False"
    Comme ça, si mon truc marche, tant que tu appuie sur "Valider" tu repars sur le module "Main" qui lance la Userform, et garde en mémoire la valeur de la variable i.

    Si en plus tu peux être amené à t'arrêter puis vouloir recommencer à remplir ton tableau, ajoute au début du module Main une fenêtre de question qui demanderai à quelle ligne commencer (tu rentres un nombre), le Main entrerait cette valeur dans i et c'est repartit !

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2015
    Messages : 16
    Par défaut
    Tout d'abord merci pour vos réponses ultra rapides ! J'ai testé en premier la méthode de letienne, cela fonctionne pile poil comme je le voulais.

    J'ai voulu rajouter la fonction clear pour que lorsque je ferme mon programme, les valeurs de la feuille arborescence s'effacent pour laisser place nette pour un projet suivant.

    Par contre j'ai testé la solution de letienne pour mon second problème, cela n'apporte pas le résultat escompté. Le problème de compatibilité est résolu mais les noms des matériaux ne s'affichent pas la combobox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CB_Mat_P_Change()
    Dim CB_Mat_P As Variant
    CB_Mat_P = Worksheets("Matériaux").Range("A2:A20")
    End Sub
    Nom : UF_Pièces & Arborescence.PNG
Affichages : 692
Taille : 22,1 Ko


    Ais-je loupé quelque chose ? en tout cas, merci pour cette aide déjà précieuse ! En espérant pouvoir à mon tour aider quelqu'un...

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Par défaut
    Bonsoir à tous,

    Pour remplir un control ComboBox, plusieurs solutions dont l'instruction RowSource. Exemple ci-dessous à adapter et à placer dans la Sub Initialize du Formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CB_Mat_P = "Matériaux!A2:A20"

  6. #6
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Par défaut
    Bonjour,

    Je n'avais pas compris que tu cherchais à alimenter une combobox ^^
    La méthode de HopPopPop est bonne, tu peux utiliser la méthode rowsource. Soit dans initialize du userform soit directement dans les propriétés de la combobox si ta liste n'est pas amenée à changer.
    Il y a également la méthode additem (que je trouve plus souple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub UserForm_Initialize()
    'Exemple d'alimentation combobox avec la colonne A de la première feuille de calcul
    Dim i As Integer
    For i = 1 To ThisWorkbook.Sheets(1).Range("A1").End(xlDown).Row
        Me.ComboBox1.AddItem ThisWorkbook.Sheets(1).Range("A" & i)
    Next i
    End Sub
    Etienne

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2015
    Messages : 16
    Par défaut
    Bonjour tout le monde, grâce à vous j'ai pas mal avancé !

    Je peux saisir les différentes pièces et leurs masses et matériaux -que je choisit dans ma ComboBox ! Et je peux également à chaque fois que je saisis une nouvelle pièce, saisir les coefficients associés au différents facteurs.... Et toutes les données s'inscrivent correctement dans ma feuille de calcul.

    Ce n'est peut être pas grand chose pour des pros comme vous, mais je suis contente de vous montrer ce que j'ai codé pour l'UF_Pieces:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    'déclaration des variables
    Dim Ensemble As String 'déclaration de la variable ensemble comme une chaine de caractères
    Dim Nom_SE As String ' déclaration de la variable nom du sous ensemble comme une chaine de caractères
    Dim Nom_Piece As String ' déclaration de la variable nom de la pièce comme une chaine de caractères
    Dim Mat_Piece As String 'déclaration de la variable matériau de la pièce comme une chaine de caractères
    Dim Masse_Piece As Variant 'déclaration de la variable masse de la pièce comme un nombre entier
     
    Dim i As Integer ' déclaration de la variable locale i comme un nombre entier pour les itérations
     
    Dim Ligne_Arbo As Long 'déclaration de la variable ligne de la feuille arborescence comme un nombre entier long
    Dim Sheet_Arbo As Worksheet 'déclaration de shArbo comme une feuille de calcul
     
    Dim Ligne_Impact As Long 'déclaration de la variable ligne de la feuille impact comme un nombre entier long
    Dim Sheet_Impact As Worksheet 'déclaration de shMat comme une feuille de calcul
     
    Private Sub UserForm_Activate()
    ' alimentation de la combobox avec la colonne A de la feuille Matériaux
    For i = 3 To ThisWorkbook.Sheets("Matériaux").Range("A3").End(xlDown).Row
        Me.CB_Mat_P.AddItem ThisWorkbook.Sheets("Matériaux").Range("A" & i)
    Next i
     
    'au démarrage du logiciel nettoyage de l'ancien projet
    Worksheets("Arborescence").Range("A3:E500").Clear
    Worksheets("Impact").Range("A3:I500").Clear
    End Sub
     
    Private Sub B_Val_P_Click() 'actions lors d'un clic sur le bouton Valider
    Ensemble = TB_Ensemble.Text 'la variable ensemble correspond au texte écrit dans la TextBox Ensemble
    Nom_SE = TB_SE.Text 'la variable nom du sous ensemble de la pièce correspond au texte écrit dans la TextBox SE
    Nom_Piece = TB_Nom_P.Text 'la variable nom de la pièce correspond au texte écrit dans la TextBox Nom_P
    Mat_Piece = CB_Mat_P.Text 'la variable matériau de la pièce correspond au texte écrit dans la ComboBox Mat_P
    Masse_Piece = TB_Masse_P.Text 'la variable masse de la pièce correspond au texte écrit dans la TextBox Masse_P
     
    'écriture des valeurs saisies dans l'arborescence, les unes en dessous des autres à chaque clic du bouton Valider
    Set Sheet_Arbo = ThisWorkbook.Sheets("Arborescence")
    Ligne_Arbo = Sheet_Arbo.Cells(Rows.Count, 1).End(xlUp).Row + 1
    ' cells(rows.Count,1) selectionne la dernière cellule de la colonne 1 = A
    'end(xlup) recherche la dernière cellule utilisée depuis le haut
    '.row récupère le numéro de la ligne et pas un objet range
    Sheet_Arbo.Cells(Ligne_Arbo, 1) = Ensemble
    Sheet_Arbo.Cells(Ligne_Arbo, 2) = Nom_SE
    Sheet_Arbo.Cells(Ligne_Arbo, 3) = Nom_Piece
    Sheet_Arbo.Cells(Ligne_Arbo, 4) = Mat_Piece
    Sheet_Arbo.Cells(Ligne_Arbo, 5) = Masse_Piece
     
    'écriture des valeurs saisies dans la feuille impact, les unes en dessous des autres à chaque clic du bouton Valider
    Set Sheet_Impact = ThisWorkbook.Sheets("Impact")
    Ligne_Impact = Sheet_Impact.Cells(Rows.Count, 1).End(xlUp).Row + 1
    Sheet_Impact.Cells(Ligne_Impact, 1) = Nom_Piece
    Sheet_Impact.Cells(Ligne_Impact, 2) = Mat_Piece
    Sheet_Impact.Cells(Ligne_Impact, 3) = Masse_Piece
     
    UF_Coefficients.Show
    End Sub
     
    Private Sub B_Quit_P_Click() 'un clic sur le bouton Annuler
    If MsgBox("Etes-vous sur de vouloir quitter, toutes les pièces ont été saisies ?", vbYesNo, "Demande de confirmation") = vbYes Then
    'message d'alerte par pop up avec demande de confirmation
    Unload UF_Pieces
    End If
    End Sub
    Et voilà le résultat en image sur la feuille Arborescence :
    Nom : Saisie arboresence.PNG
Affichages : 592
Taille : 29,7 Ko

    Et voici, l'UF_Coefficents:
    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
    29
    30
    31
    32
    Dim Coef_1 As Single 'déclaration du coefficient 1 comme un nombre à virgule
    Dim Coef_2 As Single 'déclaration du coefficient 2 comme un nombre à virgule
    Dim Coef_3 As Single 'déclaration du coefficient 3 comme un nombre à virgule
    Dim Coef_4 As Single 'déclaration du coefficient 4 comme un nombre à virgule
    Dim Coef_5 As Single 'déclaration du coefficient 5 comme un nombre à virgule
     
    Dim i As Integer ' déclaration de la variable locale i comme un nombre entier pour les itérations
     
    Dim Ligne_Impact As Long 'déclaration de la variable ligne de la feuille impact comme un nombre entier long
    Dim Sheet_Impact As Worksheet 'déclaration de shMat comme une feuille de calcul
     
    Private Sub B_Val_C_Click()
    Coef_1 = TB_Coef_1.Text 'la variable coefficient 1 correspond au texte écrit dans la TextBox TB_Coef_1
    Coef_2 = TB_Coef_2.Text 'la variable coefficient 2 correspond au texte écrit dans la TextBox TB_Coef_2
    Coef_3 = TB_Coef_3.Text 'la variable coefficient 3 correspond au texte écrit dans la TextBox TB_Coef_3
    Coef_4 = TB_Coef_4.Text 'la variable coefficient 4 correspond au texte écrit dans la TextBox TB_Coef_4
    Coef_5 = TB_Coef_5.Text 'la variable coefficient 5 correspond au texte écrit dans la TextBox TB_Coef_5
     
    Set Sheet_Impact = ThisWorkbook.Sheets("Impact")
    Ligne_Impact = Sheet_Impact.Cells(Rows.Count, 5).End(xlUp).Row + 1
     
    Sheet_Impact.Cells(Ligne_Impact, 5) = Coef_1
    Sheet_Impact.Cells(Ligne_Impact, 6) = Coef_2
    Sheet_Impact.Cells(Ligne_Impact, 7) = Coef_3
    Sheet_Impact.Cells(Ligne_Impact, 8) = Coef_4
    Sheet_Impact.Cells(Ligne_Impact, 9) = Coef_5
    End Sub
     
    Private Sub B_Quit_C_Click()
    Unload UF_Coefficients
    Load UF_Pieces
    End Sub
    Et son super résultat sur la feuille Impact:
    Nom : Saisie facteurs.PNG
Affichages : 612
Taille : 22,2 Ko

    Ce que je veux faire maintenant, c'est de pouvoir multiplier les coefficients aux valeurs initiales des facteurs d'impact et les afficher dans ma feuille de calcul -alors qu'à présent seuls les valeurs rentrées s'affichent.
    Or comment j'associe un facteur d'un matériau que j'ai sélectionné via ma ComboBox pour la multiplication ?

    Voici la feuille de calcul Matériaux où je renseigne mes matériaux et leurs facteurs:
    Nom : Matériaux.PNG
Affichages : 663
Taille : 11,2 Ko


    Dans un second temps, je souhaite créer diagramme radar pour montrer l'impact environnemental de chaque pièce...
    Le problème est que je n'arrive pas à le faire sous forme "diagramme radar", j'ai trouvé pour les histogrammes, vous avez quelque chose la dessous ?

    Je vous remercie encore parce que vous êtes au top !

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

Discussions similaires

  1. Choix langage pour utilitaire de Backup et questions
    Par Helyopses dans le forum Débuter
    Réponses: 2
    Dernier message: 25/01/2012, 18h19
  2. Réponses: 5
    Dernier message: 06/02/2009, 11h51
  3. Choix du langage pour faire un petit utilitaire
    Par jejam dans le forum Langages de programmation
    Réponses: 9
    Dernier message: 07/12/2005, 17h29
  4. [Choix] SGDB pour Entreprise : coût, efficacité, etc.
    Par grassat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/06/2002, 08h52
  5. Choix d'un ORB
    Par Anonymous dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h15

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