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 :

Tableau de type définis par l'utilisateur.Gestion des données par fonction.Ex: Average et Index [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Septembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Tableau de type définis par l'utilisateur.Gestion des données par fonction.Ex: Average et Index
    Bonjour,
    J'ai découvert grâce au tutoriel "Tableaux" les tableaux de type définis par l'utilisateur.
    Je souhaite les utiliser pour regrouper des tableaux de une ou deux dimensions se référant à une même collection. Ici: clients. J'ai pris ici l'exemple de la durée des différents rendez vous avec un client appelé client n°3.
    J'ai placé en fin de code une procédure avec deux fonctions que j' utilise dans la gestion d'un tableau par exemple de deux dimensions: moyenne des durées et recopie des durées grâce à la fonction index.
    Je souhaite effectuer les mêmes opérations avec un tableau de type.
    Mon code ne fonctionne pas. J'ai indiqué les messages erreur. Merci d'avance.
    PS:désolé, je n'ai pas réussi à insérer une fenêtre pour le code

    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
    Option Explicit
     
    'Définition du type
    Type InfoClients
        Durée_RDV(1 To 5) As Variant
    End Type
     
    Public Sub Moyenne_Tableau_Type_Données()  ' (Client,Durée RDV). 
    Dim Tableau(1 To 10) As InfoClients
    Dim i As Integer, Moyenne As Currency
     
    ' durée des 4 RDV du client n°3
    For i = 1 To 4
        Tableau(3).Durée_RDV(i) = 4 * i
    Next i
    'moyenne de la durée des RDV du client n°3
    Moyenne = Application.Average(Application.Index(Tableau.Durée_RDV, 3)) 'Renvoie: "Erreur de compilation. Tableau: qualificateur incorrect"
    'Copie dans la feuille active  du tableau.
    Range("A1").Resize(UBound(Tableau.Durée_RDV, 1), UBound(Tableau.Durée_RDV, 2)).Value = Application.Index(Tableau.Durée_RDV, 3) 'UBound(tableau,dimension souhaitée)'Renvoie: "Erreur de compilation. Tableau: qualificateur incorrect"
    End Sub
     
    Public Sub Moyenne_Tableau_deux_dimensions() 'Cette procédure fonctionne.
    Dim Tableau(1 To 10, 1 To 5) As Variant ' (Client,Durée RDV)
    Dim i As Integer, Moyenne As Currency
     
    ' durée des 4 RDV du client n°3
    For i = 1 To 4
        Tableau(3, i) = 4 * i
    Next i
    'moyenne de la durée des RDV du client n°3
    Moyenne = Application.Average(Application.Index(Tableau, 3))
     
    'Copie du tableau dans la feuille active  .
    Range("A1").Resize(UBound(Tableau, 1), UBound(Tableau, 2)).Value = Application.Index(Tableau, 3) 'UBound(tableau,dimension souhaitée)
     
    End Sub

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Pour la moyenne du client n° 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Moyenne = Application.Average(Tableau(3).Durée_RDV)
    Ceci renverra 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UBound(Tableau(3).Durée_RDV())
    car les tableaux du type sont dimensionnés en dur de 1 à 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Durée_RDV(1 To 5) As Variant
    et ceci renverra 10 :
    car le tableau est dimensionné en dur de 1 à 10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim Tableau(1 To 10) As InfoClients

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Si tu veux quelque chose de plus dynamique, voici un petit exemple :
    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
     
    Type InfoClients
     
        Durée_RDV() As Double
        NomClient As String
        Adresse As String
        CP As String
        Ville As String
     
    End Type
     
    Public Sub Moyenne_Tbl_Type_Données()
     
        Dim Tbl() As InfoClients
        Dim I As Integer
        Dim J As Integer
        Dim Moyenne As Double
     
        For I = 1 To 3
     
            ReDim Preserve Tbl(1 To I)
     
            Tbl(I).NomClient = "Client n° " & I
            Tbl(I).Adresse = I & ", Rue des Fleurs"
            Tbl(I).CP = "0" & I & I * 100
            Tbl(I).Ville = "Ville " & I
     
            For J = 1 To 4
     
                ReDim Preserve Tbl(I).Durée_RDV(1 To J)
     
                Tbl(I).Durée_RDV(J) = (I + 4) * J
     
        Next J, I
     
        For I = 1 To UBound(Tbl)
     
            Moyenne = Application.Average(Tbl(I).Durée_RDV)
     
            Debug.Print "La moyenne du client " & Tbl(I).NomClient _
                        & " habitant '" & Tbl(I).Adresse & " " & Tbl(I).CP & " " & Tbl(I).Ville _
                        & "' est de " & Moyenne
     
        Next I
     
        Debug.Print "-------------"
     
        For I = 1 To UBound(Tbl())
     
            For J = 1 To UBound(Tbl(I).Durée_RDV)
     
                Debug.Print "Les valeurs entrées pour le client " & Tbl(I).NomClient & " sont : " & Tbl(I).Durée_RDV(J)
     
        Next J, I
     
    End Sub

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Septembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Code suite à la première réponse
    Bonjour,
    Merci Theze. Suite à ta réponse d'hier j'ai modifié mon code.
    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
    Option Explicit
    'Définition du type
    Type InfoClients
        Durée_RDV(1 To 5) As Variant
    End Type
     
    Public Sub Moyenne_Tableau_Type_Données()  ' (Client,Durée RDV)
    Dim Tableau(1 To 10) As InfoClients
    Dim i As Integer, Moyenne As Currency
     
    ' durée des 4 RDV du client n°3
    For i = 1 To 4
        Tableau(3).Durée_RDV(i) = 4 * i
    Next i
    'moyenne de la durée des RDV du client n°3
    Moyenne = Application.Average(Tableau(3).Durée_RDV)
    'Copie dans la feuille active  du tableau.
    'Rappel:Tableau(3).Durée_RDV est un taleau de dimension 1, donc UBound(Tableau(3).Durée_RDV)est suffisant et resize sur une seule ligne
    Range("A3").Resize(1, UBound(Tableau(3).Durée_RDV)).Value = Tableau(3).Durée_RDV 'UBound(tableau,dimension souhaitée).
    End Sub
    Je vais maintenant étudier ton deuxième message.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Septembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Suite:Utilisation dynamique des tableaux de données
    J'ai étudié et testé ton nouveau code. Impeccable.
    Je te remercie bien pour ton aide. Bon week end.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/12/2013, 11h43
  2. Gestion des fichiers par utilisateurs
    Par badi3a82 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 06/07/2010, 11h31
  3. Tranférer des données par email avec selection des destinataires
    Par jmsintes dans le forum Développement
    Réponses: 4
    Dernier message: 05/07/2010, 15h50
  4. [SQL] Gestion des données par boutons afin de les valider ou non
    Par tozy88 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/03/2008, 12h09
  5. Trier un tableau de type défini par l'utilisateur
    Par nonaparus dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 24/10/2005, 21h11

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