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 :

somme de deux variables tableau


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
    technicien
    Inscrit en
    Février 2017
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Février 2017
    Messages : 82
    Par défaut somme de deux variables tableau
    Bonjour à tous,
    Suite à mes précédentes interventions je butte encore sur un sujet.
    Je suis amené à traiter plusieurs fichiers de données avec une itération.
    Après analyse du fichier 1 (quantité d'événement) je crée dois généré un tableau synthétique permettant de faire une moyenne des données issues du fichier 1, fichier 2, fichier n.
    Dans cette synthèse les quantité d'événements sont stockés dans une variable appelée tablo() soit écrite. Cette variable est composée de 12 lignes et 5 colonnes.
    Suite à l'itération et l'analyse du fichier 2 cette même variable est donc modifiée avec les nouvelles valeurs mais je souhaite ajouter celles de l'analyse 1
    Comme les données stockées pour la cellule (a,z) correspond au même événement je pensais que cela serait simple de faire une somme et bien non

    exemple souhaité
    cellule (1,1) = cellule (1,1) du fichier 1 + cellule (1,1) du fichier 2 + cellule (1,1) du fichier n
    même chose pour les les cellules jusqu'à (12,1) et (1,5) et (12,5)

    je pensais tout bonnement que générer une seconde variable tableau sommes() en sommant le range de mes données du fichier 1 (écrite dans le fichier Excel) permettrait de le faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sommes = Range("C5:G16").Value + sommes
    et bien non

    Je ne comprends pas pourquoi?

    Je pensais adapter à mon cas le code de Jacques Boisgontier suivant:
    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
    Sub essai2()
      Dim Tableau(1 To 10, 1 To 9, 1 To 12) ' 10 lignes/9 colonnes
      Dim y As Integer, x As Integer, z As Integer
      For y = LBound(Tableau, 1) To UBound(Tableau, 1)
         For x = LBound(Tableau, 2) To UBound(Tableau, 2)
           For z = LBound(Tableau, 3) To UBound(Tableau, 3)
              Tableau(y, x, z) = Sheets(z).Cells(y, x)
           Next z
        Next x
      Next y
      MsgBox SommeTableau(Tableau, Empty, 1, 4) ' Somme Colonne1/ Feuil4
      MsgBox SommeTableau(Tableau, 2, Empty, 4) ' Somme Ligne 2/Feuil4
      MsgBox SommeTableau(Tableau, 1, 1, Empty) ' Somme Ligne1/Colonne1/Toutes les feuilles
      MsgBox SommeTableau(Tableau, 3, 2, 1)        ' Ligne3/Colonne2/Feuil1
    End Sub
     
    Function SommeTableau(T(), Lig, Col, F)
      If IsEmpty(Col) Then
         For x = LBound(T, 2) To UBound(T, 2)
            temp = temp + T(Lig, x, F)
         Next x
       Else
         If IsEmpty(Lig) Then
           For y = LBound(T, 1) To UBound(T, 1)
             temp = temp + T(y, Col, F)
           Next y
         Else
            If IsEmpty(F) Then
               For z = LBound(T, 3) To UBound(T, 3)
                 temp = temp + T(Lig, Col, z)
               Next z
            Else
               temp = T(Lig, Col, F)
            End If
         End If
       End If
       SommeTableau = temp
    End Function
    Mais à part me casser les dents je n'arrive pas à grand chose de plus

    Merci à vous tous de votre aide très précieuse.

  2. #2
    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
    Salut.

    Tu n'aurais pas intérêt à coller tes n tableaux dans des feuilles Excel puis à utiliser Excel pour la consolidation? N'es-tu pas en train de réécrire Excel en voulant passer par des tableaux?

    Si tu veux vraiment passer par un tableau de somme, tu peux t'inspirer de ceci. Je sais bien qu'on va me dire que c'est beaucoup plus lent etc etc, mais c'est lisible, fonctionnel et facilement transposable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test2()
      Dim t1(25, 10), t2(25, 10), t3(25, 10), s(25, 10)
      Dim R As Long, C As Long
     
      ' Remplissage des tableaux t1, t2, t3
      For R = 0 To UBound(s)
        For C = 0 To UBound(s, 2)
          s(R, C) = t1(R, C) + t2(R, C) + t3(R, C)
        Next C
      Next R
    End Sub
    "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...
    ---------------

  3. #3
    Membre confirmé
    Homme Profil pro
    technicien
    Inscrit en
    Février 2017
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Février 2017
    Messages : 82
    Par défaut
    Merci Pierre pour ta réponse.
    Le problème c'est que dans un premier temps je traite le fichier 1 (données issues du jour 1) et en fais une analyse j’enregistre le fichier et le ferme.
    ainsi de suite jusqu'à x fichier (x jours).
    Donc le tableau initial de chaque jour existe.
    L'objectif étant de faire une moyenne des x jours.
    Dans mon programme précédent (que je refais) j'avais édité ce code (je suis totalement autodidacte en vba...):

    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
     
    'exemple pour la première colonne
    'je récupère le données issue de la première synthèse
    l1c1 = Cells(5, 3)
    l2c1 = Cells(6, 3)
    l3c1 = Cells(7, 3)
    l4c1 = Cells(8, 3)
    l5c1 = Cells(9, 3)
    l6c1 = Cells(10, 3)
    l7c1 = Cells(11, 3)
    l8c1 = Cells(12, 3)
    l9c1 = Cells(13, 3)
    l10c1 = Cells(14, 3)
     
    Windows("compil").Activate
    Sheets("total").Select
    'j'ajoute les données de la seconde synthése
    Cells(5, 3) = Cells(5, 3) + l1c1
    Cells(6, 3) = Cells(6, 3) + l2c1
    Cells(7, 3) = Cells(7, 3) + l3c1
    Cells(8, 3) = Cells(8, 3) + l4c1
    Cells(9, 3) = Cells(9, 3) + l5c1
    Cells(10, 3) = Cells(10, 3) + l6c1
    Cells(11, 3) = Cells(11, 3) + l7c1
    Cells(12, 3) = Cells(12, 3) + l8c1
    Cells(13, 3) = Cells(13, 3) + l9c1
    Cells(14, 3) = Cells(14, 3) + l10c1
    Bref long et pénible....

    Du coup je viens de trouver une solution mais là il y a améliorer:

    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
    Sub test()
    Dim z(12, 5) As Variant
    Dim y As Integer, x As Integer
     
    tableau = [C5:G16].Value '(cas ou les données sont écrites) Objectif: voir si je peux ne pas les écrire et les garder en mémoire pour la prochaine itération
    tableau2 = [J5:N16].Value '(cas ou les données sont écrites) itération suivante à ajouter à la précédente
      For y = LBound(tableau, 1) To UBound(tableau, 1)
      If y > 5 Then
      Exit For
      End If
         For x = LBound(tableau2, 1) To UBound(tableau, 1)
     
             z(x, y) = tableau(x, y) + tableau2(x, y)
     
        Next x
      Next y
     
      [P5:U16].Value = z
     
    End Sub

    Par contre ça me décale la somme d'une ligne vers le bas (je cherche la solution)

  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
    Salut.

    Les tableaux chargés à base de plages de cellules commencent à 1. Ceux créés comme ton tableau z, sans option spécifique de compilation, commencent à 0. Tu devrais donc déclarer z comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim z(1 to 12, 1 to 5) As Variant
    Tu pourrais aussi boucler sur y comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For y = LBound(tableau, 1) To 5
    A part cela, je ne vois pas grand chose qui pourrait clocher, mais je n'ai pas testé

    Tu peux déclarer tes variables en Long plutôt qu'en Integer, ça te permettra de travailler au delà de 32.768 lignes et de toute façon, les Integer sont convertis en Long par l'interpréteur du VBA.
    "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
    Membre confirmé
    Homme Profil pro
    technicien
    Inscrit en
    Février 2017
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Février 2017
    Messages : 82
    Par défaut
    Merci pour tes retours.
    J'ai modifié mon code avec tes corrections
    Ca ronronne sur mon exemple.
    Reste à tester sur un cas concret sans passer par l'écriture des données, ce que je vais faire de ce pas...

    Edit: je tiens le bon bout
    Merci pour tout.

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

Discussions similaires

  1. Somme de deux variables entre iReport et SubReport
    Par bingo06260 dans le forum iReport
    Réponses: 0
    Dernier message: 29/11/2011, 10h00
  2. Calcul d'une d'une double somme avec deux variables en entrée
    Par beauvaim dans le forum Mathématiques
    Réponses: 4
    Dernier message: 20/11/2011, 04h31
  3. Tableau a deux variables
    Par cre3000 dans le forum Langage
    Réponses: 2
    Dernier message: 29/02/2008, 08h46
  4. calculer la somme de deux variables
    Par Invité dans le forum iReport
    Réponses: 12
    Dernier message: 03/08/2007, 17h25
  5. [VBA-E] : somme de deux lignes ayant des positions variables
    Par johnmakina dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/01/2007, 16h47

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