Fonction Somme en VBA

Bonjour,

Non toujours pas :

Range("N" & i).Value = Range("N" & i).Value - Range("P" & i).Value

"La méthode 'Range' de l'objet Worksheet a échoué"

Private Sub CommandButton1_Click()
   Dim i As Long
   For i=0 To 2500
      Cells(15,i) = Cells(15,i).Value-Cells(17,i).Value
   Next
End Sub

Bonjour à tous

Je n'ai que survolé

Mais @ Imoka

Sub somme()
    Dim tabe()
    tabe = Range("E1:E")
    Dim tabf()
    tabf = Range("F1:F")
    Dim i As Byte
    For i=0 To < Ubond(tabe)
        tabe(i) = tabe(i) - tabf(i)
    Next
    For i=0 To < Ubond(tabe)
        Range(i, 5) = tabe(i)
    Next
End Sub

Tu avais mis Ubond au lieyu de UBound

Bye

Mince, j’avais pas vu.

Bonjour à tous,

J'allais intervenir également. Pour l'erreur 1004, c'est parce que la boucle commence à 0 au lieu de 1 et qu'il n'y a pas de ligne 0 sur la feuille Excel.

@ImoKa : Sinon, il s'agit juste de petites fautes de syntaxe : ubound comme l'a fait remarquer Patty5046 et notamment le fait que lorsqu'on charge un tableau depuis une plage, il est en 2 dimensions et en base 1 !

Donc il aurait fallu avoir :

Sub somme()
with activesheet 'avec feuille active
    dl = .Cells(.rows.count, 1).end(xlup).row '<<< dernière ligne non vide >>> prend du temps sur toute la colonne !
    tabe = .Range("E1:E" & dl) 'ou .range("E:E") ou .columns(5) ou .range("E1:E1000")
    tabf = .Range("F1:F" & dl)
    For i = lbound(tabe) To Ubound(tabe)
        tabe(i, 1) = tabe(i, 1) - tabf(i, 1)
    Next i
    .Range("E1").resize(ubound(tabe)) = tabe
end with
End Sub

Cdlt,

Bonsoir à vous,

J'ai mis ton code 3GB et j'ai une petite erreur sur :

tabe(i, 14) = tabe(i, 14) - tabf(i, 16)

En supposant que j'ai bien compris qu'il fallait remplace le "1" par le numéro de colonne concernée soit N , colonne 14 et 16 pour la colonne P

Merci

Non pour 14 et 16

C’est 15 et 17

Bonsoir Thrrybo,

Non, justement, il faut laisser le 1. Le 1 indique qu'il s'agit de la colonne 1 du tableau dynamique. Les 2 tableaux tabe et tabf n'ont qu'une colonne, bien qu'ils soient en 2D.

En revanche, il faut changer les lettres plus haut : E par O (15è colonne de la feuille) et F par Q (17è colonne).

Sub somme()
with activesheet 'avec feuille active
    dl = .Cells(.rows.count, 1).end(xlup).row '<<< dernière ligne non vide >>> prend du temps sur toute la colonne !
    tabe = .Range("O1:O" & dl)
    tabf = .Range("Q1:Q" & dl)
    For i = lbound(tabe) To Ubound(tabe)
        tabe(i, 1) = tabe(i, 1) - tabf(i, 1)
    Next i
    .Range("O1").resize(ubound(tabe)) = tabe
end with
End Sub

Il serait possible de faire ceci également :

Sub somme()
with activesheet 'avec feuille active
    dl = .Cells(.rows.count, 1).end(xlup).row '<<< dernière ligne non vide >>> prend du temps sur toute la colonne !
    t = .Range("O1:Q" & dl)
    For i = lbound(t) To Ubound(t)
        t(i, 1) = t(i, 1) - t(i, 3) '1ere col - 3eme col du tableau t à 3 colonne (O, P, Q)
    Next i
    .Range("O1").resize(ubound(t), 1) = t 'on ne restitue que la première colonne à l'aide du resize
end with
End Sub

Cdlt,

D'accord,

J'ai cependant toujours l'erreur 13 incompatibilité de type sur

For i = LBound(tabe) To UBound(tabe)

Quel est le type de i ? Il faut bien dim i as long (ou non déclarée)

Alors,

Ca fonctionne mais :

1 - je suis con parce que je n'ai pas pris toutes les colonnes en compte. Mais soit..

2 - mon tableau commence à la ligne 16 et de mon côté, j'ai bien essayé de changer cela mais évidemment, erreur..

Et j'essaye de mon côté d'ajouter les colonnes manquantes

je n'ai pas pris toutes les colonnes en compte.

Qu'est-ce qu'il faudrait exactement ? J'ai cru lire que certaines colonnes contenaient des formules.

Est-ce que c'est un tableau structuré ? Ca pourrait être mieux pour rendre le code dynamique.

Un nouvel essai si les colonnes 15 et 17 ne contiennent que des valeurs numériques et aucune formule :

Sub somme()
with activesheet.usedrange 'avec zone utilisée sur la feuille active
    t = .formula
    For i = lbound(t) To Ubound(t)
        t(i, 15) = t(i, 15) - t(i, 17)
    Next i
    .formula = t
end with
End Sub

Cdlt,

Ma colonne 17 comme tu dis contient une formule.

J'ai adapté ton code à mes colonnes

With ActiveSheet 'avec feuille active
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row '<<< dernière ligne non vide >>> prend du temps sur toute la colonne !
    t = .Range("L1:P" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 3) = t(i, 3) + t(i, 5) - t(i, 2) + t(i, 1) '1ere col - 3eme col du tableau t à 3 colonne (O, P, Q)
    Next i
    .Range("N1").Resize(UBound(t), 1) = t 'on ne restitue que la première colonne à l'aide du resize
End With

la présentation de mon tableau :

L M N O P

J'ai donc ajouté les colonnes que j'ai oublié et je fais donc

N = N + P - M + L en sachant que P peut-être négatif et qu'il contient une formule.

Maintenant en faisant cela, le code s'exécute mais je n'arrive pas au bon résultat.

LMNOP
820554532-10

Mon but étant que N ai le même résultat que O

554 + (-10) - 20 + 8 = 532

Pourtant il affiche 8 dans N

*Et oui c'est un tableau structuré

Et donc aussi autre problème, c'est que je suis toujours coincé sur la ligne 1 et que mon tableau commence à la ligne 16 ==> 2500

roh non attendez

Il se fait tard et je m'embrouille complètement. Je remets ça à demain, ou plutôt à tout à l'heure.

Merci

Bonjour,

Une nuit de repos ne fait pas de mal^^.

D'accord, dans ce cas, voici un essai avec le nom du tableau structuré à adapter :

With activesheet.range("nomtableau") '<<< remplacer par nom du tableau structuré
    tbl = .value
    redim t(1 to ubound(tbl))
    For i = LBound(t) To UBound(t)
        t(i) = tbl(i, 14) - tbl(i, 16) 'N - P avec début en A
    Next i
    .columns(14).Resize(UBound(t)) = application.transpose(t) 'N si début en A
End With

Ici, je suppose que le tableau structuré commence en colonne A et va au moins jusqu'à la colonne P.

Je passe par une seconde variable tableau pour ne pas vous embrouiller.

Cdlt,

Bonjour,

La nuit était nécessaire parce que je me suis complètement embrouillé dans mes colonnes à force et je vous fais faire des codes pour rien...

Votre précédent code :

Private Sub CommandButton1_Click()
With ActiveSheet
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    t = .Range("N1:P" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 1) = t(i, 1) - t(i, 3)
    Next i
    .Range("N1").Resize(UBound(t), 1) = t
End With
End Sub

Ce code-ci fonctionne mais je n'arrive pas à le faire commencer à la 1ere ligne du tableau (ligne 16)

J'ai donc voulu faire ceci mais...

With ActiveSheet.Range("Tableau1")
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    t = .Range("Tableau1" & dl)
    For i = LBound(t) To UBound(t)
        t(i, 1) = t(i, 1) - t(i, 3)
    Next i
    .Columns(13).Resize(UBound(t)) = Application.Transpose(t)
End With

Mon tableau commence en colonne B jusque P

Et en reprenant exactement votre dernier code, incompatibilité de type sur

t(i) = tbl(i, 12) - tbl(i, 13) + tbl(i, 14) + tbl(i, 16)

Et donc hier je disais bien n'importe quoi, je n'avais nullement besoin de rajouter de colonnes supplémentaires au calcul. Ca ne concerne que N et P.

Merci,

Bonjour,

Prenez mon dernier code pour la suite, en ne modifiant rien, si ce n'est les numéros de colonne.

Dans ce cas, il faut que vous choisissiez les colonnes qui vous intéressent dans votre tableau structuré et vous modifiez uniquement la partie à droite du signe égal sur cette ligne :

        t(i) = tbl(i, 14) - tbl(i, 16) 'deviennent 13 et 15 a priori

et cette ligne :

.columns(14).Resize(UBound(t)) = application.transpose(t) '14 devient 13

Pourquoi ne pas faire commencer votre tableau en colonne A ?

Oui, il doit y avoir une incompatibilité de type si certaines des colonnes contiennent des données non numériques.

Cdlt,

J'ai commencé mon tableau en B parce qu'au départ, je n'étais pas encore sûr du nombre de colonnes dans mon tableau et élargir la colonne A me permet de garder mon tableau +- centré, je préfère esthétiquement ^^

Pour l'incompatibilité de type, cela arrive si une cellule contenant une formule n'affiche rien ? Mettre "0" par défaut avec SIERREUR ?

Et donc dans le code j'ai juste mis 13 et 15 puisque le tableau commence en B.

C'est bien ce que j'ai à présent

With ActiveSheet.Range("Tableau1") '<<< remplacer par nom du tableau structuré
    tbl = .Value
    ReDim t(1 To UBound(tbl))
    For i = LBound(t) To UBound(t)
       t(i) = tbl(i, 13) - tbl(i, 15) 'N - P avec début en A
    Next i
    .Columns(13).Resize(UBound(t)) = Application.Transpose(t) 'N si début en A
End With

Si le résultat d'un SIERREUR est "", ça provoque normalement une incompatibilité de type car "" est une chaine de caractère. Mais avec 0 non :

=SIERREUR(formule;) '<<< ok en principe

Je pense que le problème est là car ça avait marché précédemment.

Toujours pas.

Sur la ligne 1 il veut bien, dans le tableau non. Pourtant le format de cellule est identique à première vue.

J'ai même essayé avec la formule dans la colonne P en ligne 1 et ça fonctionne aussi. Avec SI ou SIERREUR ça ne pose aucun problème mais effectivement j'ai du indiqué 0 au lieu de ""

Rechercher des sujets similaires à "fonction somme vba"