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 :

Faire des calculs sur des variables tableaux [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut Faire des calculs sur des variables tableaux
    Bonjour à tous,

    J'ai un ensemble de données qui sont stockées dans des variables tableaux en 2 dimensions.
    Le tableau comporte une ligne de titre, les données sont en colonnes dans les lignes suivantes.

    Je cherche à faire la moyenne des données d'une colonne de ce tableau directement dans vba sans passer par l'intermédiaire d'une feuille excel. Je sais que je peux copier tout ou partie de ce tableau dans une feuille Excel, y faire mes calculs avec un WorksheetFunction.Average(Range.....) pour avoir ma moyenne, mais je souhaite éviter cela et faire mes calculs à partir des données du tableau directement dans vba. J'ai farfouillé la toile à la recherche d'une solution et je n'ai rien trouvé de probant. J'ai probablement mal cherché.

    Est-ce qu'il est possible de faire des calculs de ce type avec des variables tableaux ?

    J'avais pensé récupérer les données de la colonne une à une avec une boucle for en les additionnant puis en divisant le résultat par le nombre de données pour avoir la moyenne, ou encore remplir un tableau à une dimension et faire un moy = Application.Average(tableau) mais peut-être existe t'il un moyen plus direct.

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Hello,
    Citation Envoyé par Mic13710 Voir le message
    remplir un tableau à une dimension et faire un moy = Application.Average(tableau) mais peut-être existe t'il un moyen plus direct.
    Merci pour votre aide.
    oui en utilisant la fonction Application.Index
    il faut savoir que application.index est toujours en base index 1 même avec un tableau en base index 0

    1° On cible un élément du tableau :
    Exemple Code pour le tableau tablo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox application.index(tablo,3,2)
    est l'équivalent de msgbox tablo(3,2) ou tablo(2,1) suivant que le tableau tablo à des index commençant à 1 ou 0


    2° On cible une ligne entière( la 3 par exemple) (donc on va se retrouver avec un array (1 dim)
    Attention "0" veut dire ici "toute les colonnes" et non colonne(0) qui n'existe pas.
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne=application.index(tablo,3,0)'on obtient la ligne 3 complète dans un array 1 dim
    3° on cible une colonne entière ( la 3 par exemple)
    Attention "0" veut dire ici "toute les les lignes" et non ligne(0) qui n'existe pas.
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    macolonne= application.index( tablo,0,3)
    Exemple d'utilisation pour calculer la moyenne d'une colonne d'un tableau :
    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
    Sub CalculMoyenne()
    'declaration du tableau 2D
       Dim intA(2, 3) As Integer
    'declaration des variables
       Dim rw As Integer
       Dim col As Integer
       Dim cumul As Integer
       For col = 0 To 3
         cumul = 0
         For rw = 0 To 2
            intA(rw, col) = CInt((99 * Rnd) + 1)
            cumul = cumul + intA(rw, col)
         Next rw
         Debug.Print "Moyenne colonne " & col & " : " & cumul / rw
       Next col
      ' moyenne de toute la deuxième colonne ( 2 pour Index , colonne 1 Pour intA car part de 0)
      Debug.Print "Moyenne 2ème colonne : " & _
                  Application.Average(Application.Index(intA, 0, 2))
    End Sub
    pour ne pas s'emmêler les pinceaux il aurait peut-être fallu mettre le tableau intA en base index 1 :
    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
    Sub CalculMoyenne2()
    'declaration du tableau 2D
       Dim intA(1 To 3, 1 To 4) As Integer
    'declaration des variables
       Dim rw As Integer
       Dim col As Integer
       Dim cumul As Integer
       For col = 1 To 4
         cumul = 0
         For rw = 1 To 3
            intA(rw, col) = CInt((99 * Rnd) + 1)
            cumul = cumul + intA(rw, col)
         Next rw
         Debug.Print "Moyenne colonne " & col & " : " & cumul / (rw - 1)
       Next col
      ' moyenne de toute la deuxième colonne
      Debug.Print "Moyenne 2ème colonne : " & _
                  Application.Average(Application.Index(intA, 0, 2))
    End Sub

    Ami calmant, J.P

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut
    Bonjour jurassic pork,

    Tout d'abord merci pour cette explication très détaillée d'une des utilisations d'Application.Index

    J'avais entre temps mis en pratique le passage par un tableau à une dimension qui fonctionne correctement, mais je trouve toutefois absurde de devoir reconstruire un tableau à partir de données déjà en mémoire dans un autre tableau alors qu'il me semble plus logique de travailler directement avec les données existantes.

    Je vais tenter de mettre en pratique votre proposition et je reviens vers vous. Pour info, je travaille toujours avec "Option Base 1" pour justement éviter de me mélanger les pinceaux

  4. #4
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut
    Bonjour,

    Désolé pour ce retour tardif, j'étais un peu occupé par ailleurs.

    Je ne suis pas passé par Application index car d'une part mes données étaient des textes et que pour des raisons apparues après coup, je devais écarter du calcul les valeurs à 0.

    J'ai donc utilisé la méthode des sommes comme ceci :


    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
     
    Dim Moy1 As Single
    Dim Total As Single
    Dim NbreOK As Byte
    Dim LigTabl As Byte
    'Tabl est un tableau à 2 dimensions défini et rempli en amont
    'Rot et la position de la valeur à moyenner dans la première variable de Tabl
    For LigTabl = 1 To UBound(Tabl, 2)
           'on vérifie que la valeur est positive (dans mon projet, soit elle l'est et c'est OK, soit elle est à 0 ou vide est on l'écarte)
           If Val(Tabl(Rot, LigTabl)) > 0 Then
                 Total = Total + Val(Tabl(Rot, LigTabl))
                 NbreOK = NbreOK + 1
           End If
    Next LigTabl
    's'il y a au moins une valeur, on calcule le moyenne, sinon elle vaut 0
    If NbreOK > 0 Then Moy1 = Total / NbreOK Else Moy1 = 0
    'on peut rajouter ici le traitement des anomalies en comparant NbreOK avec LigTabl - 1
    If NbreOK<>LigTabl - 1 Then ........
    .
    .
    .
    Pour ma part, le problème est résolu.

    Merci jurassic pork

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

Discussions similaires

  1. Variable tableau comportant des variables tableaux? Avec MATCH ou FINDNEXT?
    Par IZZYDEBUTANT dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/10/2020, 10h39
  2. Réponses: 1
    Dernier message: 31/08/2017, 12h48
  3. [WebI XiR2] Graphique camembert avec des variables et un calcul sur les variables
    Par colom dans le forum Débuter
    Réponses: 0
    Dernier message: 12/02/2014, 14h02
  4. Imbriquer des variables tableaux
    Par mennix dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/04/2011, 15h23
  5. comment faire des variables globales
    Par user_ensias dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/09/2006, 10h03

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