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 :

Création de type et initialisation


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
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut Création de type et initialisation
    Bonsoir le forum

    Pour un projet dans mes études, je dois créer un planning de repas: 3 repas par jour, équilibrés. La masse et les calories des aliments doivent être calculées en fonction de l'utilisateur qui fait usage du planning. Je code donc sur VBA.
    J'ai du mal à réaliser bien des choses mais j'aimerais savoir si vous pouviez m'aider sur ce point en particulier:

    J'aimerais créer deux types : Aliment (nom, masse et calorie) et PetitDejeuner (nom, et 6 aliments).
    Je voudrais initialiser un tableau de type PetitDejeuner à l'aide de boucles, car c'est très répétitif.

    En fait, j'ai sur la feuil2 de mon tableur Excel toutes les données:
    Sur chaque ligne se trouve un petit déjeuner composé de son nom (colonne C), et des 6 aliments qui le composent:
    aliment 1: nom sur la colonne E, masse sur F, calorie sur G
    aliment 2: nom sur la colonne I, masse sur J, calorie sur K
    aliment 3: nom sur la colonne M, masse sur N, calorie sur O
    aliment 4: nom sur la colonne Q, masse sur R, calorie sur S
    aliment 5: nom sur la colonne U, masse sur V, calorie sur W
    aliment 6: nom sur la colonne Y, masse sur Z, calorie sur AA
    La ligne pour un petit déjeuner est donc toujours la même. Ce sont les colonnes qui varient.
    Voici mon code, qui ne marche pas:

    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
    'Déclaration du type Aliment qui contient le nom, la masse et les calories de chaque aliment
    Public Type Aliment
        Nom As String
        Masse As Double
        Calorie As Double
    End Type
     
    'Déclaration du PetitDejeuner qui contient le nom et 6 aliments
     Public Type PetitDejeuner
       Nom As String
       x1 As Aliment
       x2 As Aliment
       x3 As Aliment
       x4 As Aliment
       x5 As Aliment
       x6 As Aliment
    End Type
     
    'Déclaration du tableau PetitDejeuner
    Public Sub PetitDejeunerTableau()
        Dim Depart As Range
        Depart = Feuil2.Range("E3")
        Dim PetitDejTab(26) As PetitDejeuner
        Dim i As Integer
        For i = 0 To 26
            PetitDejTab(1).Nom = Feuil2.Range("C" & 3 + i)
            Dim j As Integer
            For j = 0 To 20 Step 4      'J'ai mis un pas de 4 puisque je change de colonne
                    x1.Nom = Depart.value(0, j)
                    x1.Masse = Depart.Offset(0, j + 1).value
                    x1.Calorie = Depart.Offset(0, j + 2).value
            Next
         Next
    End Sub
    Il faudrait que j'incrémenté les valeurs de x1 à x2 mais je n'y arrive pas.
    J'avais écrit: "x" & j+1 mais ça ne marche pas. Je ne sais pas comment coder ce genre de problème.

    J'ai énormément de problème avec ce projet, mais j'espère pouvoir trouver une solution à celui-ci...
    J'espère avoir été claire
    Je vous remercie d'avance.

    PS: Je peux envoyer mon fichier si besoin.

  2. #2
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour ch0ubida


    Regarde ce tuto
    qui est une initiation au Type personnalisé.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut
    Merci. J'avais déjà vu ce tuto, en fait c'est à partir de lui que j'ai tenté de créer mon code. Mais ça ne marche pas dans mon cas. Je n'arrive pas à faire les boucles comme il faut. Et je ne trouve pas de solution sur internet pour résoudre ma boucle sur les variables x1, x2 etc. Je ne dois pas l'écrire correctement.

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Ton problème actuel réside dans une connaissance insuffisante de l'utilisation des Types personnalisés.

    Es-tu obligée d'utiliser un type personnalisé?

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut
    J'ai trouvé comment m'en sortir malgré tout

    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
    Public Sub DeclarationPetitDejeuner()
    Dim PetitDej(1 To 26, 1 To 7) As Aliment
    Dim i As Integer
    For i = 1 To 26
        With PetitDej(i, 1)
            .Nom = Feuil2.Range("E3").Offset(i - 1)
            .Calorie = Feuil2.Range("G3").Offset(i - 1)
            .Masse = Feuil2.Range("F3").Offset(i - 1)
        End With
        With PetitDej(i, 2)
            .Nom = Feuil2.Range("I3").Offset(i - 1)
            .Calorie = Feuil2.Range("J3").Offset(i - 1)
            .Masse = Feuil2.Range("K3").Offset(i - 1)
        End With
        With PetitDej(i, 3)
            .Nom = Feuil2.Range("M3").Offset(i - 1)
            .Calorie = Feuil2.Range("N3").Offset(i - 1)
            .Masse = Feuil2.Range("O3").Offset(i - 1)
        End With
        With PetitDej(i, 4)
            .Nom = Feuil2.Range("Q3").Offset(i - 1)
            .Calorie = Feuil2.Range("R3").Offset(i - 1)
            .Masse = Feuil2.Range("S3").Offset(i - 1)
        End With
        With PetitDej(i, 5)
            .Nom = Feuil2.Range("U3").Offset(i - 1)
            .Calorie = Feuil2.Range("V3").Offset(i - 1)
            .Masse = Feuil2.Range("W3").Offset(i - 1)
        End With
        With PetitDej(i, 6)
            .Nom = Feuil2.Range("Y3").Offset(i - 1)
            .Calorie = Feuil2.Range("Z3").Offset(i - 1)
            .Masse = Feuil2.Range("AA3").Offset(i - 1)
        End With
        With PetitDej(i, 7)
            .Nom = Feuil2.Range("C3").Offset(i - 1)
        End With
    Next
    End Sub

    Merci pour votre aide !

    Je ne sais pas si j'étais obligée d'utiliser un Type personnalisé mais étant donné que je dois récupérer le nom, la masse et les calories relatifs à chaque aliment, il me semble que c'est mieux. Le choix des menus se fait aléatoirement, il faut donc que je stocke ces données dans une variable.

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Très impressionnant !

    Il n'y a rien à dire.

    J'avais pensé à un tableau à une dimension. Mais ton tableau à deux dimensions est parfait.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    'Tableau à une dimension de types personnalisés imbriqués
    Public Type Aliment
        Nom As String
        Masse As Double
        Calorie As Double
    End Type
     
    'Déclaration du PetitDejeuner qui contient le nom et 6 aliments
     Public Type PetitDejeuner
       Nom As String
       x1(6) As Aliment
     End Type
     
     Public PetitDejTab() As PetitDejeuner
     
    'Déclaration du tableau PetitDejeuner
    Public Sub PetitDejeunerTableau()
        Dim Depart As Range
     
        Dim f As Worksheet
     
        Dim i As Long
     
        Dim j As Long
     
        Dim colE, ColF, colG
     
        Set f = ThisWorkbook.Worksheets("Feuil2")
     
        ReDim PetitDejTab(1 To 26) As PetitDejeuner
     
        For i = 1 To UBound(PetitDejTab)
     
        Set Depart = f.Range("C" & i + 2)
     
         'aliment 1: nom sur la colonne E, masse sur F, calorie sur G
         'aliment 2: nom sur la colonne I, masse sur J, calorie sur K
     
        With PetitDejTab(i)
               .Nom = Depart.Offset(0, 0)
     
               For j = 1 To 6
                 Select Case j
                  Case 1
                   colE = 2: ColF = 3: colG = 4
                  Case 2
                    colE = 6: ColF = 7: colG = 8
                  Case 3
                    colE = 10: ColF = 11: colG = 12
                  'Case 4
     
                  'Case 5
     
                  'Case 6
     
                 End Select
     
                 .x1(j).Nom = Depart.Offset(0, colE)
     
                 .x1(j).Masse = Depart.Offset(0, ColF)
     
                 .x1(j).Calorie = Depart.Offset(0, colG)
     
               Next
           End With
         Next
     
         Call Lister
     
    End Sub
     
    Sub Lister()
     Dim j As Long, i As Long
     Dim VerifTab
     On Error Resume Next
        'VerifTab va prendre la valeur Empty si le tableau est vide. Dixit SilkyRoad
        VerifTab = UBound(PetitDejTab)
        On Error GoTo 0
     
        If IsEmpty(VerifTab) Then Exit Sub
     
     For i = LBound(PetitDejTab) To UBound(PetitDejTab)
          With PetitDejTab(i)
     
           Debug.Print i; .Nom
     
           For j = 1 To 6
            Debug.Print j, .x1(j).Nom
            Debug.Print j, .x1(j).Masse
            Debug.Print j, .x1(j).Calorie
           Next
     
          End With
     
         Next
    End Sub

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

Discussions similaires

  1. Variable type UserForm à initialiser avec nom variable
    Par dalmasma dans le forum Général VBA
    Réponses: 2
    Dernier message: 28/04/2009, 14h03
  2. création de type enum en runtime
    Par marwaa dans le forum Windows Forms
    Réponses: 15
    Dernier message: 10/03/2009, 16h22
  3. Création formulaire type
    Par Jacquesdu38 dans le forum Modélisation
    Réponses: 3
    Dernier message: 10/07/2008, 09h04
  4. Création de types de données en Visio en modèle de DB
    Par jerome.fortias dans le forum Visio
    Réponses: 0
    Dernier message: 31/03/2008, 11h04
  5. Création colonne type memo
    Par Mvu dans le forum Access
    Réponses: 8
    Dernier message: 23/06/2006, 11h57

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