VBA : Comportement erratique d'une fonction somme

bertrand1202

XLDnaute Occasionnel
Bonjour

Ayant refait une fonction pour sommer des valeurs, (je ne suis pas très doué), je ne comprends pas pourquoi la macro ne démarre pas à la ligne A7 comme je lui ai indiqué et pourquoi elle ne s'arrçete que 15 ligne après la dernière ligne contenant des valeurs.

Je vous joins le fichier.

Merci de vos explications. Je ne saisis pas pourquoi elle démarre ailleurs que l'endroit range a7.
Vos explications me permettront d'avancer.
 

Pièces jointes

  • testb.xls
    29.5 KB · Affichages: 62
  • testb.xls
    29.5 KB · Affichages: 63
  • testb.xls
    29.5 KB · Affichages: 64

bertrand1202

XLDnaute Occasionnel
Re : VBA : Comportement erratique d'une fonction somme

Re

quand on met range("a").end(xlup) , a quel endroit excel va-t-il rechercher la premiere valeur si il n'y en a pas .

Si on lui indique range a7, il n'en tient pas compte.

Quel est l'avantage de mettre .end(xlup).row , ça ne marche pas toujours?

J'essaie de cadrer les connaissances ,en faisant de stest, je ne comprends plus trop où il faut aller

Merci à vous.
+
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Bonsoir Bertrand1202,

Déjà pour que ta macro soit plus clair, pense à faire des retraits de lignes comme dans l'exemple ci-dessous (ta macro : identique - juste changé la présentation) :

Code:
Sub testbsomme()
Dim c As Byte
Dim vcellule As Range
Dim vsom As Long
Dim i As Integer
Dim derlign As Long
derlign = Range("a65536").End(xlUp).Row

[COLOR="DimGray"][B][I]For[/I][/B][/COLOR] i = 1 To 25
    [COLOR="Red"][B]For[/B][/COLOR] Each vcellule In Range("a7:a" & "a65000").End(xlUp)

        [COLOR="Blue"][B]For[/B][/COLOR] c = 1 To derlign
            vsom = vsom + vcellule.Offset(vcellule(i).Row, c)
            vcellule.Offset(vcellule(i).Row, 0) = vsom
        [COLOR="Blue"][B]Next[/B][/COLOR] c

        vsom = 0

    [COLOR="Red"][B]Next[/B][/COLOR] vcellule
[COLOR="DimGray"][B][I]Next[/I][/B][/COLOR] i

End Sub

C'est pas plus clair?

Sinon, concernant ton soucis, peux-tu nous dire ce que tu veux obtenir? Que dois faire la macro?

A te lire
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Hello Bertrand1202

Bertrand1202 à dit:
Quel est l'avantage de mettre .end(xlup).row , ça ne marche pas toujours?

Si tu l'utilise correctement, cette fonction marche tout le temps!

La bonne façon de l'écrire est la suivante (comme tu l'as si bien fais au début de ta macro) :
Code:
[B][COLOR="Gray"]Range("A65536")[/COLOR][/B].[COLOR="Red"][B]End(xlUp)[/B][/COLOR].[COLOR="Blue"][B]Row[/B][/COLOR]

Ce qui signifie :
"Excel, va sur la cellule A65536, puis remonte jusqu'à la première cellule pleine trouvé. Une fois la cellule trouvé, donne moi le numéro de la ligne

Bref, comme tu l'as deviné, si tu ne mets pas Range("A65536"), il ne sera pas à partir d'où commencer.

Evidement, tu peux écrire :
Code:
Range("A65536").End(xlUp).Row

De façon différente, comme par exemple de la façon suivante :
Code:
[A65536].End(xlUp).Row

Ce qui signifie exactement la même chose. C'est juste une façon d'écrire plus compact!

Evidement, cela tout cela te donne le numéro de la ligne, donc après il ne faut pas oublier le numéro (ou le nom) de la colonne.

Ce qui donne :
DernièreLigneDuTableau = [A65536].End(xlUp).Row

Range("A1:A" & DernièreLigneDuTableau ).select

-> permet de sélectionner la zone de A1 jusqu'à la cellule de la colonne A, ligne : la dernière du tableau.

Pour information :
Code:
Range("[COLOR="Red"][B]A[/B][/COLOR][COLOR="Blue"][B]1[/B][/COLOR]:[COLOR="Gray"][B]A[/B][/COLOR]" & [COLOR="Orange"][B]DernièreLigneDuTableau[/B][/COLOR] ).select
et
Code:
Range(Cells([COLOR="Blue"][B]1[/B][/COLOR], [COLOR="Red"][B]1[/B][/COLOR]), Cells([COLOR="Orange"][B]DernièreLigneDuTableau[/B][/COLOR], [COLOR="Gray"][B]1[/B][/COLOR])).Select
font exactement la même chose!

Avantage de la fonction Cells par rapport à la fonction Range, c'est plus facile d'écrire une variable pour le numéro de la ligne ET le numéro de la colonne.

Comme tu as pu le voir, pour la fonction Cells, il faut mettre en premier le numéro de la ligne et en second, le numéro de la colonne (contrairement à la fonction Range qui est l'inverse).

C'est plus clair? Mon explication est compréhensible?

A te lire

Cordialement
 
Dernière édition:

bertrand1202

XLDnaute Occasionnel
Re : VBA : Comportement erratique d'une fonction somme

Bonsoir Excel lent

Je souhaite tout d'abord faire apparaitre en colonne a le total des colonnes b à f.
J'ai donc fait la macro, elle ne ravaille que si dans la colonne a , je met un lettre ou un chiifre sur la ligne dela dernier ligne et que je la lance.
Je cherche à comprendre pourquoi elle ne démarre pas en A7 d'une part et quelle est l'incidence de définir range(xx").end(xlup). normalemment elle doit remonter à la première ligne non vide, or au cas présent, aucune ligne n'est remplie dans la colonne A . Comment le système réagit il. Que faut il faire pour que la Macro démarre en a7 et nsuite tinne compte de toutes les lignes (de b à f) qui comportent des données.

Je cherche surtout à comprendre le mécanisme pour puvoir le reprooduire sans erreur.

Merci de ton aide et désolé pour ces questions qui peuvent paraître stupides.

Merci encore
 

bertrand1202

XLDnaute Occasionnel
Re : VBA : Comportement erratique d'une fonction somme

Bonsoir Excel Lent

merci pour les explications, je ne savais pas que pour range cà fonctionnait colonne et ligne.

En ce qui concerne mon pb, c'est qu'il n'y a pas cellule remplie en colonne A.

Merci en tout as de tes explications, c'est clair, mais j'ai encore du mal à intégrer tout .

Merci
@+
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Salut Bertrand1202,

Lorsque tu nommes une zone de cellule, tu dois écrire ceci :
Code:
Range("A7:A50")

Si tu veut mettre une variable à la place de 50, il te faut écrire alors :
Code:
[I]NuméroDeLaDernièreLigne[/I] = Range("A65536").End(xlUp).Row

Range[B][COLOR="Red"]([/COLOR][/B]"A7:A" & [I]NuméroDeLaDernièreLigne[/I][COLOR="Blue"][B])[/B][/COLOR]

Tu as vu où j'ai ouvert et fermé ma parenthèse de la fonction Range?

Evidement tu peux compiler les deux lignes de la façon suivante :
Code:
Range[B][COLOR="Red"]([/COLOR][/B]"A7:A" & Range("A65536").End(xlUp).Row[COLOR="Blue"][B])[/B][/COLOR]

Tu as vu ce que j'ai fais?

J'ai remplacé NuméroDeLaDernièreLigne par sa fonction : Range("A65536").End(xlUp).Row

Mais je n'ai pas touché aux parenthèses! Elles sont ouvertes et fermé exactement au même endroit!

Or toi, dans ton code tu as :
Range("a7:a" & "a65000").End(xlUp)

Tu vois les deux soucis dans ce code?

Premier soucis :
Code:
Range("a7:a" & "a65000")
revient à écrire
Code:
Range("a7:aa65000")

Second soucis :
Range("a7:a" & "a65000").End(xlUp)

Tu as mis le End(xlUp) à l'extérieur de la parenthèse au lieu de l'intérieur. Voici la bonne façon de l'écrire :
Range("a7:a" & range("a65000").End(xlUp))

Voila pour ton soucis majeur.

Je me penche sur le reste et revient.

Bonne fin de soirée
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Re,

bertrand1202 à dit:
merci pour les explications, je ne savais pas que pour range cà fonctionnait colonne et ligne
?

Dans le code :
Range("A5")

On voit clairement que A représente le nom de la colonne? Et que le 5 est le numéro de la ligne?

A mon avis, j'ai voulu aller trop vite! Je reprend du départ :

Pour Range, on écrit :
Range("A5")

Pour Cells, c'est l'inverse :
Cells(5,1)

5 -> est le numéro de la ligne
1 -> est le numéro de la colonne. 1 = colonne A 2 = colonne B ...

Voici pour les cellules.

Maintenant concernant les zones de cellules (contiguë). Par exemple la zone de la cellule A1 à A50 :
Range(Range("A1"), Range("A50"))

Qui peut s'écrire ainsi aussi :
Range(Cells(1,1), Cells(50,1))

Bertrand1202 à dit:
désolé pour ces questions qui peuvent paraître stupides
Non, c'est juste qu'il faut bien débuter un jour! Si tu ne comprend pas, n'hésite pas à le dire.

Concernant ta macro, le soucis est de trouver la colonne dont la dernière rempli est la plus grande! Mais il s'agit des colonnes B à F. Donc le fait de partir sur la colonne A dans ton code n'était pas une bonne idée!

Je reviens, à tout à l'heure.

Bon apprentissage
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Re-bonsoir Bertrand1202,

Alors ce bricolage? Attention a ne pas te taper sur les doigts avec le marteau ;)

Voici ci-dessous un code qui fonctionne et fais ce que tu souhaites :

Code:
Sub testbsomme()
Dim DernièreLigne As Long
Dim i As Long
Dim Colonne As Byte

[COLOR="Green"]    ' Cherche le numéro de la dernière ligne rempli, concernant la colonne B[/COLOR]
    DernièreLigne = Range("B65536").End(xlUp).Row

    For Colonne = 3 To 6 [COLOR="Green"]'chercher si l'une des colonnes 3 (=C) à 6(=F) fini plus bas que colonne B[/COLOR]
      If Cells(65536, Colonne).End(xlUp).Row > DernièreLigne Then [COLOR="Green"]'si le numéro de la dernière ligne occupé de la colonne ... est plus bas?[/COLOR]
         DernièreLigne = Cells(65536, Colonne).End(xlUp).Row [COLOR="Green"]'alors, mettre ce chiffre dans la variable [I]DernièreLigne[/I] à la place du chiffre précédemment dedans[/COLOR]
      End If
    Next Colonne
  
[COLOR="Green"]    ' Ecrire en A... la somme de B... à F... (même ligne)[/COLOR]
    For i = 7 To DernièreLigne [COLOR="Green"]' Ecrire les sommes B à F pour les lignes 7 à la dernière ligne occupé de la zone B à F[/COLOR]
       Range("A" & i) = Range("B" & i) + Range("C" & i) + Range("D" & i) + Range("E" & i) + Range("F" & i)  
    Next i

End Sub

Ci-joint la macro dans son élément naturel!

Ca te convient?

Rassures-toi, avec le temps, tu pourras faire pareil tout seul.

Bonne fin de soirée

Edition : Salut Staple1600. Et ben!!! Quand il s'agit d'épater les débutants, tu ne fais pas dans le détail!

C'est malin, maintenant il va falloir que tu expliques toutes les fonctions que tu as utilisé ainsi que leurs fonctionnement à l'intérieur de ton code! :D
 

Pièces jointes

  • testb modifié.xls
    22.5 KB · Affichages: 53
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Bonjour



Histoire de s'amuser un peu et pour rejoindre Excel-lent ;)

Code:
Sub les_ranges()
Dim aa As Range, bb As Range, cc As Range
Dim dd As Range, ee As Range, ff As Range, m$
Set aa = Cells(1, 1): Set bb = Range("A1")
Set cc = Cells(1, "A"): Set dd = Range(Cells(1, 1), Cells(1, 1))
Set ee = [A1]: Set ff = Range(Cells(1, 1), Cells(1, "A"))

m = "Cells(1, 1) ->" & vbTab & vbTab & vbTab & aa.Address(0, 0) & vbCrLf
m = m & "Range(""A1"") ->" & vbTab & vbTab & vbTab & bb.Address(0, 0) & vbCrLf
m = m & "Cells(1, ""A"") ->" & vbTab & vbTab & vbTab & cc.Address(0, 0) & vbCrLf
m = m & "Range(Cells(1, 1), Cells(1, 1)) ->" & vbTab & vbTab & dd.Address(0, 0) & vbCrLf
m = m & "Range(Cells(1, 1), Cells(1, ""A"")) ->" & vbTab & ee.Address(0, 0) & vbCrLf
m = m & "[A1] -> " & vbTab & vbTab & vbTab & vbTab & ee.Address(0, 0)

MsgBox m, vbInformation, "Equivalences d'écritures"

End Sub


PS: juste à titre illustratif , ce n'est pas une solution à la question posée
 

Staple1600

XLDnaute Barbatruc
Re : VBA : Comportement erratique d'une fonction somme

Re



Cette fois-ci ma solution à ta question


Code:
Sub MACRO_SOMME_VALEURS()
    With Range("A1:A1" & [A65536].End(xlUp).Row).SpecialCells(xlCellTypeBlanks)
        .FormulaR1C1 = "=SUM(RC[1]:RC[255])"
        .Value = .Value
    End With
End Sub
Et pour garder les formules

Code:
Sub MACRO_SOMME_AVEC_FORMULES()
Range("A1:A1" & [A65536].End(xlUp).Row).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=SUM(RC[1]:RC[255])"
End Sub
PS: ces solutions fonctionnent avec des données disposées comme dans ton fichier joint dans ton premier message
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel