VBA boucle sur les lignes

Bonjour,

J'ai réussi à initialiser une variable pour faire une somme en ligne mais je n'arrive pas à recopier ce code VBA vers le bas.

Est ce que quelqu'un a une solution ?

Je vous transmet également le fichier Excel.

Merci d'avance

Voici le code qui pose problème :

Voici mon code vba :

Dim i As Long

Dim compteur As Integer

Dim Lig As Integer

x = 0

compteur = 0

For i = 2 To 5

x = x + Cells(i, 2)

compteur = compteur + 1

Next i

Cells(2, 6) = x

Cells(2, 7) = x / compteur

End Sub

Bonjour,

Il me semble que tu te compliques un peu...

Sub SommeLignesColonnes()
    Dim x(2 To 6), y(2 To 5), i%, j%
    With ActiveSheet
        For i = 2 To 6
            For j = 2 To 5
                x(i) = x(i) + .Cells(i, j)
                y(j) = y(j) + .Cells(i, j)
            Next j
        Next i
        .Cells(2, 6).Resize(5).Value = WorksheetFunction.Transpose(x)
        .Cells(7, 2).Resize(, 4).Value = y
        For i = 2 To 6
            x(i) = x(i) / 4
        Next i
        .Cells(2, 7).Resize(5).Value = WorksheetFunction.Transpose(x)
        For i = 2 To 5
            y(i) = y(i) / 5
        Next i
        .Cells(8, 2).Resize(, 4).Value = y
    End With
End Sub

En recueillant les valeurs dans 2 tableaux, une double boucle sur l'ensemble des cellules te permet d'engranger tous les résultats.

Pour bien voir le mécanisme, j'ai dimensionné les tableaux : x sur les numéros de lignes (additions par lignes) et y sur les numéros de colonnes (additions par colonnes).

Comme les indices des tableaux et les numéros de lignes et colonnes se correspondent, pas de corrections d'indices à opérer.

Chaque valeur de la ligne i sera additionnée à x(i) et chaque valeur de la colonne j à y(j), soit la valeur de la cellule (i, j) est additionnée à x(i) d'une part et y(j) d'autre part.

En faisant varier i de 2 à 6 et j de 2 à 5, on balaie toutes les cellules du tableau.

A l'issue de cette première phase, on dispose de 2 tableaux contenant toutes les valeurs cherchées (les sommes), il n'y a plus qu'à les affecter...

Plutôt que faire des boucles d'affectation, tu peux procéder à une affectation directe sur une plage de même dimension. S'agissant de tableaux à une dimension, ils produiront des valeurs sur une même ligne, donc il conviendra de transposer x alors que y sera affectable sans transposition. Pour dimensionner les plages, on le fait à partir de la première cellule en utilisant Resize (qui s'avère toujours compatible avec cette méthode).

3e phase, on repasse chaque tableau dans une boucle pour opérer les divisions et on affecte à la colonne suivante ou la ligne au-dessous, de la même façon.

On aurait pu opérer avec des tableaux à 2 dimensions, les servir pour les sommes puis opérer les divisions et procéder à une affectation plus globale des résultat (ce sera un autre exercice !

NB- Il est souhaitable de réserver les modules de feuilles aux procédures évènementielles, les macros ordinaires ont leur place dans des modules standard.

Cordialement.

Grand merci pour vos explications même si cela nécessite un temps de réflexion afin de bien comprendre la logique.

Effectivement cela marche.

Bonjour,

même si cela nécessite un temps de réflexion afin de bien comprendre la logique

mais une fois fait, c'est tout bénéf... Quand tu passes à VBA, au lieu de procéder en manuel sur Excel, sors aussi des outils proprement Excel pour privilégier les moyens proprement VBA... Ce que tu peux faire avec des tableaux et des boucles sera plus rapide en VBA que l'utilisation de fonctions Excel, du copier-coller, etc. (on y revient s'il n'y a pas autre chose pour aboutir...). Et c'est moins complexe qu'il peut y paraître : replace-toi à la maternelle, avec des bûchettes, gomettes, formes, etc. et tu arriveras le plus souvent assez vite à une solution...

Bonne journée.

Re bonjour

Peut on obtenir la même chose en découpant le principe des boucles sur les lignes puis les boucles sur les colonnes sans passer par la procédure des tableaux même si cela peut être plus long.

D'avance merci

C'est ce que tu avais commencé, non !

Sub SommeLignes()
    Dim x%, i%, j%
    With ActiveSheet
        For i = 2 To 6
            For j = 2 To 5
                x = x + .Cells(i, j)
            Next j
            .Cells(i, 6) = x
            .Cells(i, 7) = x / 4
            x = 0
        Next i
    End With
End Sub

Mais il te faut toujours 2 boucles imbriquées. La première défile les lignes, la seconde défile les colonnes pour chaque ligne et tu reportes le total à la fin de chaque ligne (et le quotient) et tu réinitialises ta variable résultat avant de passer à la ligne suivante.

Cordialement.

Merci pour ta réponse.

Le code que tu viens de communiquer concerne les lignes qui se recopient vers le bas.

Comment dois je faire si je dois inclure le code des colonnes à recopier vers la droite sans paser par la case tableau.

Merci d'avance.

Bien à toi

Bonjour.

Rajouter une variable j qui boucle sur les colonnes et qui va englober le tout

Pour j de 1 à N

Pour i de 1 à M

truc

Prochain i

Prochain j

Bonne journée.

La procédure Lignes ci-dessus, additionne ligne par ligne et produit les résultats dans les colonnes suivantes (F et G) sur chaque ligne.

Pour faire la même chose avec les colonnes, tu défiles les colonnes dans une première boucle (2 à 5), pour chaque colonne tu défiles les lignes (2 à 6) et tu poses les résultats dans les lignes suivantes (7 et 8) pour chaque colonne.

edit : le 8 (huit) s'est transformé en smiley...

Re bonjour

Le code ci dessous concerne les lignes à recopier vers le bas :

Sub SommeLignes()

Dim x%, i%, j%

With ActiveSheet

For i = 2 To 6

For j = 2 To 5

x = x + .Cells(i, j)

Next j

.Cells(i, 6) = x

.Cells(i, 7) = x / 4

x = 0

Next i

End With

End Sub

A l'intérieur de ce code comment dois je faire pour paramétrer mes sommes des colonnes à recopier vers la droite.

Merci d'avance

Bien à toi.


Ok c'est tout bon j'y suis arrivé.

C'est plus long mais je ne souhaitais pas passer par la case tableau.

Grand merci encore

Je t'avais déjà répondu, c'est l'inverse ! La procédure citée additionne par ligne et met les résultats à droite !

Re bonjour,

Comme je te le disais j'y suis arrivé mais par contre chaque procédure fait l'objet d'une routine.

Une routine pour les lignes (mon code) :

Sub SommeLignes()

Dim x, i, j

With ActiveSheet

For i = 2 To 6

For j = 2 To 5

x = x + Cells(i, j)

Next j

Cells(i, 6) = x

Cells(i, 7) = x / 4

'x = 0

Next i

End With

End Sub

Une routine pour mes colonnes (mon code) :

Sub SommeColonnes()

Dim x, i, j

With ActiveSheet

For j = 2 To 5

For i = 2 To 6

x = x + Cells(i, j)

Next i

Cells(7, j) = x

Cells(8, j) = x / 4

'x = 0

Next j

End With

End Sub

Si on peut fusionner les deux routines sans passer par la case Tableau alors grand grand merci d'avance.

Pour ta procédure Colonnes, le diviseur est 5 (et non 4)...

Le désavantage de ces procédures réside dans le fait que tu procèdes à une affectation à la fin de chaque ligne ou de chaque colonne. Tu multiplies donc les interactions du programme avec Excel. Or, VBA sera d'autant plus rapide que ces interactions sont réduites au minimum (prélèvement de données, traitement sans interaction, affectation à la fin).

D'où la supériorité des tableaux sur la plupart des autres méthodes !

J'ai toujours tendance à penser qu'un code dépourvu de tableaux, de boucles (et de quelques autres instructions) est un code qui n'utilise pas les outils que VBA met à ta disposition, et donc ne peut être optimal !

Cordialement.

NB- Ceci dit, pour faire les deux dans la même procédure, il te suffit de les mettre bout à bout.... !

Bonjour,

le code peut être simplifier :

Christophe88 a écrit :

Re bonjour,

Sub SommeLignes()

Dim x, i, j

With ActiveSheet

For i = 2 To 6

For j = 2 To 5

x = x + Cells(i, j)

Next j

Cells(i, 6) = x

Cells(i, 7) = x / 4

'x = 0

Next i

End With

End Sub

par juste :

For i = 2 To 6
x= Application.WorksheetFunction.Sum(Range(Cells(i, 2), Cells(i, 5)))
Cells(i, 6).Value = x
Cells(i, 7).Value = x/4
Next i

pareil pour les colonne

Si tu veux mon avis, l'utilisation d'une fonction de feuille de calcul est justement moins rapide...

MFerrand a écrit :

Si tu veux mon avis, l'utilisation d'une fonction de feuille de calcul est justement moins rapide...

en effet "Application.WorksheetFunction.Sum" est une fonction de feuille de calcul de base(la fonction "SOMME")

j'ai continuer en vba vu qu'en haut c'était comme sa

C'est bien ce que je disais : travail avec tableaux et variables en VBA est toujours plus rapide...

Il ne faut pas se laisser tromper par la longueur du code, quand tu fais appel à Excel, tu as tout un code derrière la même ligne de commande que tu ne vois pas...

Rechercher des sujets similaires à "vba boucle lignes"