[vba] probleme addition

Fermé
Bonjour,

j'ai un tableau de dimension n : tableau(n)

j'ai un total qui se fait comme suit

total = total + tableau(n)

comme j'ai plusieurs total a faire j'ai fait un truc comme ca

for i= 1to 5
total(i)=total(i)+tableau(i)
next i

en admettant que mes valeurs soit 2,3,4,5,6 au lieu d'obtenir 20 j'obtient 23456

pourquoi ?
Configuration: Windows XP
Internet Explorer 6.0

19 réponses

Résumé de la discussion

Le fil expose un problème de calcul en VBA où total ajouté à des valeurs 2, 3, 4, 5 et 6 donne 23456 au lieu de la somme 20. Plusieurs réponses évoquent des causes possibles comme des chaînes de caractères ou des données mal typées et proposent d'assurer le type numérique et la réinitialisation du total. Des solutions proposées intègrent des boucles correctes, l'utilisation de IsNumeric pour éviter la concaténation et la reprise du total par colonne, puis l'écriture des résultats sur une autre feuille ou dans un autre classeur. Certaines contributions proposent des schémas complets utilisant des variables distinctes (total1, total2) pour plusieurs totaux, y compris le transfert des résultats vers une autre feuille ou fichier.

Bobot (l’IA à votre service)
  1. Bonjour,
    Juste en passant: initialiser la variable total =0

    J'admets que le tableau (n) et une variable éclarée
    Dim tableau(4) as Integer ? conrient les valeurs 2,3,4,5,6

    et votre bloucle devient

    for i= 0 to 4 ' le 0 base de départ
    total=total+tableau(i)
    next

    0
    1. Contributeur
      oui c'est ce que j'avais fait au départ mais je n'ai pas qu'un total a faire mais 10 donc je me vois mal ecrire

      total1....
      total2...
      etc...
      0
  2. Bonjour antic80,,
    Oui d'accord, mais pourquoi total1.....total2.... je ne comprend pas !!
    0
    1. Contributeur
      en fait j'ai 12 colonnes et je dois faire le total de chaque colonne pour le stocker dans une autre feuille

      donc total1 = total colonne 1 etc...
      0
  3. Bonjour antic80,
    est-ce juste: le tableau est donc tableau(5,10) !
    0
    1. Contributeur
      oui voila le tableau qui stocke les valeurs en vue de les additionner est a double dimension

      tableau (1 to 12 ,1 to 16)
      0
  4. Bonjour antic80,
    Ok j'ai compris et le total de chaque colonnes est inéré sur une feuille ?
    Un moment je reviens .....
    0
    1. Contributeur
      oui c ca
      0
  5. Bonjour antic80,
    Je vous propose se qui suit:
    Sub matrice()
    Dim tableau(12, 16) As Integer

    total = 0 ' -- réinitialiser la variable

    For Co = 0 To 16 ' boucle sur colonne

    For Li = 0 To 12 ' boucle sur ligne
    total = total + tableau(Li, Co)
    Next
    InputBox (total) ' --- écrire dans la feuille
    total = 0 ' -- réinitialiser la variable

    Next

    End Sub
    J'espère que c'est se que vous cherchez !
    0
    1. Contributeur
      ok je vais voir et vous tiens au courant
      0
    2. Contributeur
      le soucis est que total ne prend qu'une valeur

      pour recopier les 12 totaux ca va poser probleme
      0
  6. Bonjour antic80,
    Vous avez bien dit ceci : le total de chaque colonne pour le stocker dans une autre feuille
    Donc dès que le total d'une colonne est réalisé je vais inscrire le résultat sur la feuille adéquate et je continue ma boucle.
    C'est ici qu'il daut mettre l'instruction .... InputBox (total) ' --- écrire dans la feuille
    Ou alors ou est le problème...!
    0
    1. Contributeur
      ok je n'avais pas percuter
      0
  7. Bonjour antic80,
    Merci.
    A titre d'information cette instruction permet d'écrire dans un autre classeur (Il doit être ouvert biensur)
    Workbooks("Classeur1.xls").Worksheets("Feuil2").Cells(1, 3) = total
    à mettre à la place de ----- InputBox (total) ' --- écrire dans la feuille
    A une prochaine.
    0
    1. Contributeur
      voici mon code dit moi ce que tu en penses

      Sheets("par secteur").Select

      lastline = Range("p65365").End(xlUp).Row

      For i = 1 To lastline
      If Cells(i, 2).Text = annéedébut And Cells(i, 1).Text = "Décembre" And Cells(i, 4) = secteur Then
      Cells(i, 1).Select

      j = j + 1

      For k = 1 To 15
      Décembre(j, k) = ActiveCell.Offset(0, k).Value
      Next

      End If

      Next i

      For z = 4 To 12
      For p = 1 To j

      total = total + Décembre(p, z)

      MsgBox total

      Next p

      Sheets("test").Select
      Range("a65365").End(xlUp).Select
      ActiveCell.Value = "Décembre"
      ActiveCell.Offset(0, 1) = annéedébut

      ActiveCell.Offset(0, 2) = secteur
      ActiveCell.Offset(0, z - 1) = total
      Next z
      0
      1. Bonjour antic80,
        Sans connaitre l'application elle même c'est pas facile, par contre la partie qui est semblable à notre échange de courriel me semble parfaite.
        Je constate que l'autre feuille est dans le même classeur.
        J'espère que tout va marché super bien.
        Bonne soirée
        0
        1. Contributeur
          ce qu'il y a au dessus ne marche pas

          la macro ne m'additionne pas les valeurs
          0
      2. Contributeur
        le code en lui meme ne marche pas

        par contre désolé mais les données sont confidentiels impossible de les envoyer
        0
        1. Bonsoir antic80,
          Ok, même par là pingou2ccm@bluewin.ch c'est confidentiel .
          0
          1. Contributeur
            en fait le tableau ce présente comme suit

            Décembre 2007 127150 secteur 1 0 0 1 1 0 0
            Décembre 2007 127160 secteur 1 0 0 0 0 3 0
            Décembre 2007 127170 secteur 1 1 0 0 1 3 0
            Décembre 2007 127180 secteur 1 0 1 0 0 1 0
            Décembre 2007 127190 secteur 1 0 1 0 3 0 0
            Décembre 2007 127210 secteur 2 0 1 0 0 3 0
            Décembre 2007 127220 secteur 2 0 1 1 4 0 1
            Décembre 2007 127230 secteur 2 0 0 0 0 0 0
            Décembre 2007 127240 secteur 2 0 0 0 0 0 0
            Décembre 2007 127250 secteur 2 0 0 1 0 2 0

            j'ai la meme chose pour tout les mois de l'année et pour 2006, 2007 etc.....

            je choisis l'année 2006 et secteur 1

            le but est d'obtenir le total de chaque colonne pour les lignes qui correspondent aux critères

            puis de copier vers une autre feuille du classeur pour obtenir ceci

            Décembre 2007 secteur 1 total colonne 1, total colonne 2, total colonne 3 etc....
            0
            1. Bonsoir antic80,
              Merci, je vais essayer de m'en sortir, pour l'instant je m'arrête et je reprendrai demain.
              Bonne soirée.
              0
              1. Bonjour à vous deux,
                désolé de m'immiscer dans votre correspondance, mais ... vu le format des données initiales (post 21), n'est-il pas judicieux d'utiliser un tableau croisé dynamique ?
                Un tableau croisé pourra tout à fait renvoyer dans une autre feuille ou dans un autre classeur le total de chaque colonne (si elles sont identifiées par un en-tête), en fonction des critères choisis (mis en champs de page).
                Je dis une connerie ?
                A+
                0
                1. Contributeur
                  merci pour ta réponse mias je dois automatiquement passé par vba car mon tableau contient des centaines de lignes et la personne qui va l'utiliser est incapable de réaliser ce genre de manipulation. de plus la je montre un exemple avec 2007, mais si la personne choisi de travailler sur 2005....
                  0
              2. Bonjour antic80,
                Ci dessous la procédure :

                Option Base 1

                Sub antic80()
                Dim tableau(12, 15) As String
                Dim total As Integer
                Sheets("par secteur").Select

                lastline = Range("A65365").End(xlUp).Row ' échange colonne "p" par "A"
                '------------------------------------------------------------
                ' je leurs donnent une valeur
                annéedébut = 2007
                mois = "Décembre"
                secteur = "secteur 1"
                '------------------------------------------------------------
                For i = 1 To lastline

                If Cells(i, 2) = annéedébut And Cells(i, 1) = mois And Cells(i, 4) = secteur Then
                Cells(i, 1).Select
                j = j + 1
                For k = 1 To 15
                tableau(j, k) = ActiveCell.Offset(0, k - 1).Value
                Next

                End If
                Next i

                For z = 5 To 12
                If IsNumeric(tableau(1, z)) Then
                For p = 1 To j
                If IsNumeric(tableau(p, z)) Then
                total = total + tableau(p, z)
                ' MsgBox total
                End If
                Next p
                Sheets("test").Select
                If z = 5 Then ' on écrit sur la même ligne
                Range("A65365").End(xlUp).Offset(1, 0).Select
                ActiveCell.Value = tableau(1, 1)
                ActiveCell.Offset(0, 1) = tableau(1, 2)
                ActiveCell.Offset(0, 2) = tableau(1, 4)
                End If
                ActiveCell.Offset(0, z - 2) = total
                ' --- Réinitialiser la variable "total" sur 0
                total = 0
                End If
                Next z

                End Sub

                Chez moi sa marche.
                Bonne fin de semaine.
                0
                1. Contributeur
                  merci pour ta réponse

                  j'ai encore 2 questions

                  tout d'abord je dois saisir les 2 années dans des textbox et choisir le secteur dans une combobox. le probleme est que le reste du code n'arrive pas a récuperer les bonnes valeurs.

                  ensuite comme je choisi 2 années j'aimerais recopier ce code pour la 2e année mais plutot que de m'inscire les 2 années l'une en dessous de l'autre le code m'efface la 1ere ligne.
                  0
                  1. Bonjour antic80,
                    Envoyez moi le/s code/s concerné/s, se sera plus simple.
                    0
                    1. Contributeur
                      en fait c'est ici

                      annéedébut = Année1.Value
                      annéefin = Année2.Value

                      'décembre'

                      j = 0

                      Sheets("par secteur").Select
                      lastline = Range("A65365").End(xlUp).Row ' échange colonne "p" par "A"
                      '------------------------------------------------------------
                      ' je leurs donnent une valeur
                      mois = "Décembre"
                      '------------------------------------------------------------
                      For i = 1 To lastline
                      If Cells(i, 2) = annéedébut And Cells(i, 1) = mois And Cells(i, 4) = "Cergy Village" Then
                      Cells(i, 1).Select
                      j = j + 1
                      For k = 1 To 15
                      tableau(j, k) = ActiveCell.Offset(0, k - 1).Value

                      au niveau de If Cells(i, 2) = annéedébut

                      si j'ecris directement 2006 a la place de annéedébut ca marche

                      si je met annéedébut seulement ca ne marche pas

                      Année1 et Année2 ce sont les noms de mes textbox
                      0