Somme automatique et code VBA
Bonjour à tous,
je suis un débutant, avec un niveau faible en excel. J'essaie d'apprendre en piochant à droite à gauche des infos et grâce à des bouquins sur excel.
J'ai créé un document répertoriant l'ensemble de mes charges d'entreprise, au mois et au trimestre.
Je fais une somme automatique d'une plage de cellules en colonne (Voir fichiers joints)
Si je n'ai pas assez de lignes, j'ai créé un code VBA pour ajouter une ligne (bouton Ligne) , et un code VBA pour supprimer une ligne (bouton Efface)
Lorsque j'ajoute une ligne, la somme automatique en bas de la colonne est toujours sur la même plage, or, ce que j'aimerai, c'est que cette somme prenne en compte cette nouvelle cellule.
Sur le premier document la somme (cellule D9) est l'addition (D6:D8)
Sur le deuxième document la somme (cellule D10) est toujours l'addition (D6:D8) or il faudrait que ce soit (D6:D9)
Est ce que la manip à faire peut se réaliser juste en utilisant des formules excel (ce serait plus simple pour moi) ou bien par l'intermédiaire de VBA ?
Je ne sais pas si j'ai été assez clair. Je rajoute en dessous le code VBA pour chacun des boutons.
Sub Ajoutligne()
'
' Ajoutligne Macro
'
' Touche de raccourci du clavier: Ctrl+l
x = ActiveCell.Row
Set Ligne = Columns("A:S").Rows(x)
Ligne.Select
Selection.Copy
Set Lignead = Columns("A:S").Rows(x + 1)
Lignead.Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Subub EffaceL()
'
' EffaceL Macro
' Efface une ligne dans la feuille "Charges Fixes Trimestre"
'
x = ActiveCell.Row
Set Ligne = Columns("A:S").Rows(x)
Ligne.Select
Selection.Delete Shift:=xlUp
End SubSi vous avez une astuce, merci de m'aider.
Jérôme.
Bonjour
Essaie ce code :
Sub Ajoutligne()
x = ActiveCell.Row
Range(Cells(x, "A"), Cells(x, "S")).Insert Shift:=xlDown
Range(Cells(x + 1, "A"), Cells(x + 1, "S")).Copy Cells(x, "A")
Range(Cells(x + 1, "A"), Cells(x + 1, "S")).ClearContents
Application.CutCopyMode = False
End SubMerci GMB.
Je viens de voir ton code, je vais l'essayer.
Mais avant voici une formule que j'ai trouvé sur le net:
=SOMME(INDIRECT("D6:D"&LIGNE()-1))
Elle me permet de faire un somme automatique dans la colonne D sur une plage de cellules dont le nombre varie.
Si tu regardes mon illustration plus haut, la cellule D9 est la somme (D6:D8). Avec cette formule, si je clique sur le bouton "Ligne", je rajoute une ligne dans mon tableau (c'est un copier/coller) et donc le cellule D10 est la somme de (D6:D9). En gros c'est ce que je voulais, que la nouvelle ligne soit prise en compte dans la somme. Par contre, je croyais avoir finalisé mon projet, mais non... car il se créer un décalage dans le tableau en dessous... et les autres qui suivent.
La formule de la somme (cellule D17) a savoir "=SOMME(INDIRECT("D14:D"&LIGNE()-1))" devrait devenir après l'ajout de ligne "=SOMME(INDIRECT("D15:D"&LIGNE()-1))" or ce n'est pas le cas.
Tout cela est surement très confus, je vais essayer ton code.
A +,
Jérôme.
Ton code est bien, fonctionne comme celui que j'avais créé, sauf qu'il est plus propre et affiche une ligne vierge de toute valeur.
Mais mon problème de décalage dans les sommes automatiques de mes tableaux est toujours là. Pour le premier en haut de la feuille, pas de problème car le cellule de départ est toujours la même "=SOMME(INDIRECT("D6
Par contre pour celui en dessous, la cellule de départ, après rajout d'une ligne, ne devrait être plus "=SOMME(INDIRECT("D14
Comment faire pour que se fasse cette incrémentation (ou soustration) de la cellule de départ en fonction de l'ajout ou suppression de lignes ?
Bonjour,
Pourquoi pas tout simplement:
=SOMME(D$6:D8)Jean-Eric a écrit :Bonjour,
Pourquoi pas tout simplement:
=SOMME(D$6:D8)
C'est tout simple et çà marche !!!
Merci beaucoup. Je croyais justement que "$" avait pour but de figer une cellule, de l'empêcher de s'incrémenter etc...
Merci à tout les deux, vous m'avez permis d'avancer à grand pas pour finaliser mon projet.
J'ai une dernière question:
Comment protéger les 3 lignes bleus qui représentent les sommes des mois et le total des trimestres en fin de chaque tableau, tout en leur permettant d'être déplacé verticalement en fonction que j'insère ou supprime une ligne de valeur (cellules roses) ?
Je ne voudrai pas, par mégarde, les supprimer en appuyant sur le bouton macro "efface", car c'est irréversible, ou modifier les formules qu'elles contiennent.
J'ai déverrouillé les cellules roses (celles dans lesquelles je rentre des valeurs) et protégé la feuille. Le résultat est le suivant: Je peux entrer des valeurs, les sommes se font, mais si j'ajoute une ligne, ou supprime une ligne via les 2 boutons reliés à mes macros, ces deux manip ne s'exécutent pas et un message d'erreur me renvoyant vers Visual Basic s'affiche. Le fait d'insérer une ligne oblige excel a décaler ces lignes bleus or comme elles sont verrouillées, il ne peux pas !
Re,
Un peu hors contexte, mais regarde ma vision de tes tableaux.
Pour un suivi mensuel, trimestriel, etc... de tes charges.
1 - Feuille "Informations" pour liste déroulantes
2 - Feuille "Données" pour la base de données des dépenses (utilisation d'un tableau dynamique)
3 - Feuille "TCD" ; feuille de synthèse mensuelle et trimestrielle TTC (un exemple
A te relire.
Cdlt.
Bonjour,
Jean Eric ton modèle est pas mal, mais je préfère le mien pour une meilleure visibilité.
J'ai résolu mon problème. J'arrive à faire fonctionner les deux macros malgré que des cellules soient verrouillées. J'ai tout simplement ajouter en début des macros "Worksheets("Charges Fixes Trimestre 1").Unprotect" et en fin "Worksheets("Charges Fixes Trimestre 1").protect"
J'ai une dernière question au sujet de la macro de GMB:
Sub Ajoutligne()
Worksheets("Charges Fixes Trimestre 1").Unprotect
x = ActiveCell.Row
Range(Cells(x, "A"), Cells(x, "S")).Insert Shift:=xlDown
Range(Cells(x + 1, "A"), Cells(x + 1, "S")).Copy Cells(x, "A")
Range(Cells(x + 1, "A"), Cells(x + 1, "S")).ClearContents
Application.CutCopyMode = False
Worksheets("Charges Fixes Trimestre 1").protect
End SubElle permet d'ajouter une ligne au niveau de la ligne notée "X" d'une cellule active, quelle qu'en soit la colonne. J'aimerai restreindre cette possibilité uniquement à une cellule active qui se trouve dans la colonne A.
Comment traduire cela en VBA? En ajoutant une condition du style "si X = ActiveCell.Row et ActiveCell dans la colonne A ..."
Bonjour
Tu écris :
. J'aimerai restreindre cette possibilité uniquement à une cellule active qui se trouve dans la colonne A.
Comment traduire cela en VBA? En ajoutant une condition du style "si X = ActiveCell.Row et ActiveCell dans la colonne A ..."
Cela pourrait donner cette variante :
Sub Ajoutligne()
Worksheets("Charges Fixes Trimestre 1").Unprotect
x = ActiveCell.Row
If ActiveCell.Column = 1 Then
Range(Cells(x, "A"), Cells(x, "S")).Insert Shift:=xlDown
Range(Cells(x + 1, "A"), Cells(x + 1, "S")).Copy Cells(x, "A")
Range(Cells(x + 1, "A"), Cells(x + 1, "S")).ClearContents
End If
Worksheets("Charges Fixes Trimestre 1").Protect
End SubMerci beaucoup, cela fonctionne parfaitement. Parfois çà a l'air si simple...
çà donne envie d'apprendre le VBA et excel, le potentiel de ce logiciel est énorme.