Fonction Somme en VBA

Bonjour,

Après 1 petite semaine de repos..

C'est fonctionnel même si une chose m'échappe :

With ActiveSheet
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    t = .Range("N16:P249" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 1) = t(i, 1) + t(i, 3)
    Next i
    .Range("N16:N249").Resize(UBound(t), 1) = t
End With
Range("O16:O2490").ClearContents
End If
End Sub

J'ai mon tableau qui va de la ligne 16 à la ligne 2490. J'indiquais donc :

("N16:P2490" & dl)
("N16:N2490")

Sauf que ça agrandissait mon tableau jusqu'à la ligne 24900, soit 10 fois plus.

A la fin j'ai fini par mettre "249" pour que ça agisse sur tout le tableau , 2490 soit 10 fois plus également. J'y comprends rien pour le coup mais ça fonctionne..

Et un grand merci à vous tous pour votre aide

Bonjour Thrrybo,

Merci pour ce retour !

Pour les explications :

dl = .Cells(.Rows.Count, 1).End(xlUp).Row

renvoie la ligne (.row), ou plus exactement la dernière ligne non vide de la cellule obtenue avec la méthode .end(xlup) - déplacement global, équivalent du ctrl + flèche - à partir de la cellule en colonne 1 en partant de la dernière ligne (.cells(.rows.count, 1)).

Donc dl vaut au minimum 1. Sa valeur dépend de l'absence ou non de valeurs en colonne 1...

Pour coller un tableau, on peut utiliser plusieurs méthodes :

La première :

.Range("N16:N2490") = t

La référence est totalement statique dans le code. C'est donc ce qu'il y a de moins bien car si le nombre de lignes du tableau varie, on est embêté...

La seconde :

.Range("N16").Resize(UBound(t), 1) = t

La référence est partiellement statique (colonne N, ligne de départ 16). Le nombre de lignes est quant à lui dynamique car on retaille la plage "N16" au nombre de lignes que contient le tableau t (ubound(t)) grâce à la méthode resize.

Si on suppose que t contient 5 lignes, alors range("N16").resize(ubound(t)) vaut range("N16:N21"). Le second argument de resize, qui correspond à la largeur (nombre de colonnes), qui vaut 1 en l'occurrence, est facultatif ici.

Il y a d'autres méthodes qui sont plus ou moins équivalentes...

En tout cas, la référence de la plage ne peut pas être 24900 car cela signifierait que dl vaut 0, ce qui est impossible, à moins que dl ait été déclarée mais jamais affectée. La référence de la plage est la concaténation de la partie statique "N16:N2490" et de la partie variable dl. Si dl vaut 1, la réf vaut "N16:N24901".

En tout cas, tant mieux si le code marche mais j'avais donné un code précédemment pour un tableau structuré, ce qui est déjà bien plus simple et surtout préférable car bien plus dynamique en général. Peut-être que tu y gagnerais en le comprenant et en l'utilisant.

Bonne continuation,

Re bonjour,

Je reviens tout de même ici parce que j'essaye tant bien que mal de rendre le code aussi dynamique que possible comme l'as proposé 3GB mais rien à faire, toujours une erreur qui se présent et c'est excessivement agaçant à la longue..

Voici tout ce que j'ai essayé jusqu'à présent en me basant sur les codes que vous aviez déjà fait.

With ActiveSheet
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    t = .Range("N16:P" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 1) = t(i, 1) + t(i, 3)
    Next i
    .Range("N16").Resize(UBound(t), 1) = t
End With
With ActiveSheet
  t = .Range("TABstock")
      t("TABstock[STK. AN. INIT.]") = t("TABstock[STK. AN. INIT.]") + t("TABstock[DIFFERENCE]")
    .Range("TABstock[STK. AN. INIT.]").Resize = t
End With
With ActiveSheet
  t = .Range("TABstock")
      t("TABstock[STK. AN. INIT.]") = t("TABstock[STK. AN. INIT.]") + t("TABstock[DIFFERENCE]")
    .Range("TABstock[STK. AN. INIT.]").Resize(UBound(t)) = t
End Wit
With ActiveSheet.Range("TABstock")
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    t = .Range("TABstock" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 8) = t(i, 8) + t(i, 10)
    Next i
    .Columns(8).Resize(UBound(t)) = Application.Transpose(t)
End With
With ActiveSheet
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    t = .Range("TABstock" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 8) = t(i, 8) + t(i, 10)
    Next i
    .Range("TABstock[STK. AN. INIT.").Resize(UBound(t), 1) = t
End With

Et d'autres variantes dont je ne me souviens même pas..

J'aimerais m'approcher au plus près du 2ème qui reprend le nom des en-têtes comme cela, même si une colonne s'interpose à l'avenir, ça ne posera pas de problème.

Changer "N16:P" par le nom et colonne de mon tableau me paraissait simple et surtout logique mais il semblerait que non et c'est frustrant..

Bonjour Thrrybo,

Peux-tu essayer comme ceci :

With activesheet
    tA = .Range("TABstock[STK. AN. INIT.]")
    tB = .Range("TABstock[DIFFERENCE]")
    for i = lbound(tA) to ubound(tA)
        tA(i, 1) = tA(i, 1) + tB(i, 1)
    next i
    .Range("TABstock[STK. AN. INIT.]") = tA
End With

Cdlt,

Bonsoir 3GB,

J'ai une incompatibilité de type sur

for i = lbound(t) to ubound(t)

Ne dois-je pas déclaré (t) quelque part ?

t = .Range("TABstock") ?

Merci

EDIT : Ca fonctionne avec cette ligne en plus.

Bonjour,

J'avais oublié de modifier cette ligne, reprise du précédent code. Je l'ai modifiée sur mon dernier commentaire donc plus besoin de la ligne rajoutée.

Cdlt,

Rechercher des sujets similaires à "fonction somme vba"