Creer une somme automatique avec evitement

youki

XLDnaute Occasionnel
Bonjour à tous, je suis face à une erreur de programmation de ma part que je n'arrive pas à retrouver.

J'explique, ce script permet de faire la somme de toutes les lignes de "premiereligne" jusqu'a "dernierligne" Seulement la particularité, je désire ne faire la somme que des lignes ou il n'y a pas d'"id" (si la colone A.valeur=vide).

Chaque fois que je ne veux pas qu'une valeur soit sommé je ne mets pas d'idée.

Seulement j'ai deux problèmes que je n'arrive pas à résoudre:
Parfois il saute les cases ou l'id.valeur=vide.
Mais surtout, si j'ai plusieur cases à se suivre sans id cela ne fonctionne pas, j'ai un problème dans les boucles mais je ne vois pas où. Soit il arrete completement la somme à ces lignes et oublie dopnc ainsi certains éléments. Soit il compte quand meme la n-ieme case id.vide ce qui fait une somme fausse.

Code:
'--------------------------------------------------
'FONCTION DE TOTAL
'--------------------------------------------------
Sub total(mode As String)

'Numero de départ =  a partir de là ou il faut faire la somme
Dim numeroDeDepart As Long
Dim numeroArret As Long
Dim numeronouvo As Long
Dim haut As Variant
Dim bas As Variant
Dim formule As Variant

'initialisation des variables
bool = True
numeroDeDepart = premiereLigne.Row
numeronouvo = numeroDeDepart
formule = ""

'debut de la boucle sur les colones
For y = 8 To 30
If y = 8 Then
'________________________________________________
 'On Fait le calcul sur une ligne
     For i = 6 To (numeroDerniereLigne - numeroDeDepart)

        'Recherche des cases sans ID
        If premiereLigne.Offset(i, 0) = "" Then
        
            numeroArret = premiereLigne.Offset(i, 0).Row - 1
            'definition de la case de depart pour la somme
            haut = Cells(numeronouvo, y).Address(RowAbsolute:=False, ColumnAbsolute:=False)
            'definition de la case de fin pour la somme
            bas = Cells(numeroArret, y).Address(RowAbsolute:=False, ColumnAbsolute:=False)
            
            If numeronouvo < numeroArret Then
                formule = formule & haut & ":" & bas & ","
                numeronouvo = numeroArret + 2
            End If
            
            'gestion des erreurs si sous total apres finforfait
            While bool = True
                If Range("A" & numeronouvo).Value <> "" Then
                    bool = False
                Else
                    If numeronouvo <= numeroDerniereLigne Then
                        numeronouvo = numeronouvo + 1
                        i = numeronouvo
                    Else
                        bool = False
                    End If
                End If
            Wend
        Else
            numeroArret = i
        End If
        numeroArret = i
    Next i
    'finalisation de la formule de somme
    haut = Cells(numeronouvo, y).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    bas = Cells(numeroDerniereLigne, y).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    
    'si on fini juste apres un total ou un forfait on modifie la formule.(evitement de redondance)
    If (Range("B" & numeroArret + 1).Value) = "___ Fin forfait ___" Or (Range("B" & numeroArret + 1).Value) = "Sous Total" Then
        
        'on vire la dernière virgule
        formule = virgule(formule)
        formule = "= Sum(" & formule & ")"
    Else
        formule = formule & haut & ":" & bas
        formule = "= Sum(" & formule & ")"
    End If
'On insere la formule et on la copie pour la dupliquer sur les autres colones = gain de temps proc (ça se sent!!)
    Cells(numeroDerniereLigne + 1, y).Select
    With Selection
    .Formula = formule
    .Copy
    End With
'________________________________________________
 End If

'Bricolage pour eviter les calculs sur des strings
    If y = 9 Then
        y = 12
    End If
    If y = 17 Then
        y = 19
    End If
    If y = 20 Or y = 21 Then
        y = 22
    End If
    
    Cells(numeroDerniereLigne + 1, y).Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
Next y
'detection de total ou soustotal
If mode = "final" Then

    Range("B" & numeroDerniereLigne + 1).Value = "TOTAL HT:"
    colone
    Range("A" & numeroDerniereLigne & ":AD" & numeroDerniereLigne).Select
    With Selection.Font
        .Bold = True
        .Size = 12
    End With

    'on fait un jolie cadre autour
    Range("A6:AD" & numeroDerniereLigne).Select
    With Selection.Borders(xlEdgeLeft)
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    
    'nettoyage du construction_devis
    Range("A" & numeroDerniereLigne + 1 & ":AD" & numeroDerniereLigne + 10).Select
    Selection.Delete Shift:=xlUp
    
ElseIf mode = "inter" Then
'--------------------------------------------------
'FONCTION DE SOUSTOTAL
'--------------------------------------------------
    Range("B" & numeroDerniereLigne + 1).Value = "Sous Total"
    colone
    Range("A" & numeroDerniereLigne & ":AD" & numeroDerniereLigne).Select
    Selection.Font.Bold = True
    Range("A" & numeroDerniereLigne + 1).Select
    
End If
End Sub

Si vous avez une idée
 

Discussions similaires

Réponses
2
Affichages
267

Statistiques des forums

Discussions
312 310
Messages
2 087 134
Membres
103 480
dernier inscrit
etaniere