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 :

utilisation de classes d'objet


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut utilisation de classes d'objet
    Bonjour, j'ai un problème d'utilisation des classes.
    Je veux utiliser une classe pour définir un matériau, rentrer ma base de données matériau et pouvoir ensuite appeler mes propriétés matériau n'importe ou dans ma feuille excel. Ca a l'air simple mais mon manque de connaissances me fait gravement défaut...

    exemple :
    - je crée une classe "Materiau" avec les proprietés "densité", "young", "alpha", "poisson". Chacune de ces propriétés doit être dépendante de la température
    ici un exemple de ce que j'ai essayé de faire en copiant des lignes trouvées ici
    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
    Option Explicit
     
    Private FDensite As Variant
     
    Public Property Let Densite(ByRef Valeur As Variant)
        Set Densite = Valeur
    End Property
     
    Public Property Get Densite() As Variant
        Set Densite = FDensite
    End Property
     
    Private Sub Class_Initialize()
      Set FDensite = New Sequence
    End Sub
    - je rentre tous mes matériaux dans un module "base_mat"
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim acier as new Materiau
    acier.densité = ([20; 8000]; [100 ; 7500]; [200; 7000])
    (excusez la syntaxe... de toutes façons même en simplifiant à l’extrême avec une seule valeur j'ai une erreur de compilation)

    - ensuite dans ma feuille je veux appeler la densité de l'acier à 100°C.
    je voudrais taper un truc du style =acier.Densité(100) et ça me renverrai 7500 dans cet exemple. Ca je n'y suis jamais arrivé non plus.

    j'espere avoir été clair...merci de votre aide!

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Avec les éléments que tu nous donnes, il me semble qu'il y ait un petit problème d'analyse.
    Que prévois-tu si un utilisateur entre une température de 80 degrés?

    De plus, je pense que c'est dans l'Initialize de ta classe (et pas dans le code appelant) que tu devrais charger ton tableau de valeurs.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    Bonjour,

    Avec les éléments que tu nous donnes, il me semble qu'il y ait un petit problème d'analyse.
    Que prévois-tu si un utilisateur entre une température de 80 degrés?

    De plus, je pense que c'est dans l'Initialize de ta classe (et pas dans le code appelant) que tu devrais charger ton tableau de valeurs.
    Il y a moyen de passer des paramètres lors de l'initialisation d'un objet en VBA? En .NET, je sais faire, mais en VBA, je n'y suis pas arrivé.

    Sinon, +1 sur les valeurs intermédiaires, l'objet doit être capable de faire une interpolation(linéaire ou non) entre deux points du tableau de valeurs pour pouvoir répondre à toute sollicitation intermédiaire. Ce qui signifie que le tableau de valeurs doit être trié.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Soit tu saisis tes densités comme tu le fais, et tu devras t'amuser à récupérer les valeurs au sein de la classe, soit tu passes par une propriété Densites qui reçoit un tableau à deux dimensions T° - Densité.

    Tu crées alors une fonction GetDensite au sein de ta classe pour calculer la densité en fonction d'une température. La fonction que je donne ici est un exemple (interpolation linéaire) et du dois bien entendu adapter en fonction d'une formule plus adéquate, la difficulté résultant ici dans le fait que chaque matériau à sa courbe de densité propre ( => il faut analyser ton besoin plus en profondeur).

    Voici le code de la classe
    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
    Option Explicit
     
    Private mDensites
     
    Public Property Let Densites(Densites As Variant)
        mDensites = Densites
    End Property
     
    Function getDensite(Temperature As Integer)
      Dim Temperature1 As Integer, Temperature2 As Integer
      Dim Densite1 As Integer, Densite2 As Integer
      Dim i As Integer
     
      For i = 0 To UBound(mDensites) - 2
        Temperature1 = mDensites(i, 0)
        Densite1 = mDensites(i, 1)
        Temperature2 = mDensites(i + 1, 0)
        Densite2 = mDensites(i + 1, 1)
        If Temperature < Temperature2 Then Exit For
      Next i
     
      getDensite = Densite1 - ((Temperature - Temperature1) / (Temperature2 - Temperature1) * (Densite1 - Densite2))
     
    End Function
    et voici le code qui l'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TestsDensites()
      Dim Densites(2, 1)
      Dim Acier As New cMateriau
     
      Densites(0, 0) = 20
      Densites(0, 1) = 8000
      Densites(1, 0) = 100
      Densites(1, 1) = 7500
      Densites(2, 0) = 200
      Densites(2, 1) = 7000
     
      Acier.Densites = Densites
      MsgBox Acier.getDensite(80)
    End Sub
    Par contre, je ne comprends pas trop ce que tu veux dire par "pouvoir ensuite appeler mes propriétés matériau n'importe ou dans ma feuille excel", car tu vas devoir de toute façon alimenter ta base de matériaux au départ d'une table et donc, je ne comprends pas trop l'intérêt de passer par une classe...
    "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...
    ---------------

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    ...
    Par contre, je ne comprends pas trop ce que tu veux dire par "pouvoir ensuite appeler mes propriétés matériau n'importe ou dans ma feuille excel", car tu vas devoir de toute façon alimenter ta base de matériaux au départ d'une table et donc, je ne comprends pas trop l'intérêt de passer par une classe...
    Bonjour
    Et merci pour vos réponses.

    Mon objectif final est assez simple (enfin je crois...): Je veux pouvoir appeler mes propriétés matériaux à travers mes feuilles de calcul. Je pensais que la création d'une classe matériau etait particulièrement adaptée même si au final je ne cherche qu'à faire une sorte de base de données.

    Je pense qu'avec vos réponses je serai capable de créer cette base de données, mais je ne comprends pas bien comment appeler ces données par la suite. dois-je créer une méthode qui renvoie les données?
    par exemple (mais ca me parait compliqué)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sub baseMat(Mat As Mater, Prop As String, temp As Double)
    etc
    pour ensuite taper dans une cellule de la feuille "=baseMat(acier,densité,80)" ou bien "=baseMat(acier,young,720)"
    mais je trouve cela lourd,

    ou est-il possible directement dans une cellule de la feuille de taper
    "=Acier.getDensité(80)"
    ou "=Acier.getYoung(720)" etc... (en supposant que la methode "getYoung" existe)
    ???
    Merci pour vos réponses!

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Si tes données sont déjà dans Excel, ce n'est pas nécessaire d'utiliser des classes d'objet car cela charge les données une deuxième fois en mémoire (1x dans Excel, 1x dans des objets perso).

    Je ne sais pas comment sont organisées tes données, mais j'imagine une table des couples température/Densité associée à un matériau, soit trois colonnes, avec autant de lignes par matériau que tu as de couples pour ce matériau.

    Tu peux t'en tirer avec une formule matricielle pour l'interpolation linéaire. Elle fonctionne à partir du moment où la température renseignée pour une densité cherchée se trouve dans entre un minimum et un maximum renseignés dans la table. Je n'ai pas géré les erreurs ou non-concordances éventuelles.

    La formule est longue et doit être validée en matricielle (Ctrl+Shift+Enter). Tu ne dois pas saisir les accolades, Excel les ajoute lors de la validation matricielle

    Voici la formule
    =SI(SOMME((Materiaux=F2)*(Temperatures=G2))<>0;SOMME((Materiaux=F2)*(Temperatures=G2)*Densites);DECALER(Densites;SOMME((Materiaux=F2)*(Temperatures=MAX((Materiaux=F2)*(Temperatures<=G2)*Temperatures))*LIGNE(Materiaux))-2;0)-(G2-MAX((Materiaux=F2)*(Temperatures<=G2)*Temperatures))/(GRANDE.VALEUR((Materiaux=F2)*(Temperatures>=G2)*Temperatures;SOMME((Materiaux=F2)*(Temperatures>=G2)))-MAX((Materiaux=F2)*(Temperatures<=G2)*Temperatures))*(DECALER(C1;SOMME((Materiaux=F2)*(Temperatures=MAX((Materiaux=F2)*(Temperatures<=G2)*Temperatures))*LIGNE(Materiaux))-1;0)-DECALER(C1;SOMME((Materiaux=F2)*(Temperatures=GRANDE.VALEUR((Materiaux=F2)*(Temperatures>=G2)*Temperatures;SOMME((Materiaux=F2)*(Temperatures>=G2))))*LIGNE(Materiaux))-1;0)))


    Voici l'illustration de la table et de la formule




    Si tu préfères passer par VBA, tu pourras utiliser une fonction perso qui s'appuiera également sur une table construite comme je l'ai illustré.

    Si souhaité, je décortiquerai la construction de la formule
    "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...
    ---------------

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par el_slapper Voir le message
    Il y a moyen de passer des paramètres lors de l'initialisation d'un objet en VBA? En .NET, je sais faire, mais en VBA, je n'y suis pas arrivé.
    ...
    Non, ce n'est pas possible en VBA, mais comme nous sommes en VBA pour Excel, on pourrait récupérer les valeurs via un objet range au sein de l'initialisation (juste pour l'exemple)
    "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...
    ---------------

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/01/2015, 16h22
  2. [Kendo UI] Utilisation des classes d'objet dans un widget
    Par thor76160 dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 24/04/2013, 13h07
  3. Réponses: 4
    Dernier message: 11/01/2012, 17h59
  4. Réponses: 2
    Dernier message: 30/05/2006, 15h26

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