Macro VBA copier/insérer une ligne (sans utiliser le n° de ligne) au dessus d'un Tota

ZAGADOUNE

XLDnaute Nouveau
... tout ça sans utiliser les n° de ligne ?

En fait je voudrais faire une macro simple pour Copier/Inserer une ligne juste au dessus d'une ligne Total (de colonne), en copiant/insérant la dernière ligne au dessus de cette ligne total (bien sur, la ligne à copier/insérer contient des formules et des formats à conserver)

Je suis débutant en VBA, et je galère: tout ce que j'arrive à faire c'est donner un nom à la 1° cellule de ma ligne Total et à y aller avec Range('"nom")

Help.... merci
 

Dranreb

XLDnaute Barbatruc
Re : Macro VBA copier/insérer une ligne (sans utiliser le n° de ligne) au dessus d'un

Bonsoir.
tout ce que j'arrive à faire c'est donner un nom à la 1° cellule de ma ligne Total et à y aller avec Range('"nom")
Ça prouve donc que vous savez l'isoler par une expression Range. Déclarez donc Dim PlgTot As Range, faites dans le code :
Set PlgTot = VotreExpressionRange
Puis allez y avec PlgTot au lieu d'y aller avec Range('"nom"). Allez y avec PlgTot.Offset(-1) par exemple.
Cordialement.
 

ZAGADOUNE

XLDnaute Nouveau
Re : Macro VBA copier/insérer une ligne (sans utiliser le n° de ligne) au dessus d'un

Bonsoir.Ça prouve donc que vous savez l'isoler par une expression Range. Déclarez donc Dim PlgTot As Range, faites dans le code :
Set PlgTot = VotreExpressionRange
Puis allez y avec PlgTot au lieu d'y aller avec Range('"nom"). Allez y avec PlgTot.Offset(-1) par exemple.
Cordialement.

Merci mais je suis "vraiment" débutant en VBA; j'ai écrit:

SUB Insereligne ()
'
' Insereligne Macro
' Macro enregistrée le 15/04/2012 par
''
Set PlgTot ("CA"/I)
PlgTot.Offset (-1)
Selection.Copy
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
End Sub

... et bien sur, ça bugue sur la permière ligne ... merci pour votre aide "pas à pas" !!
 

Dranreb

XLDnaute Barbatruc
Re : Macro VBA copier/insérer une ligne (sans utiliser le n° de ligne) au dessus d'un

Montrez moi celui de vos codes qui marchait, mais que vous ne voulez plus pour ne pas créer un nom, inutile pour ça puisqu'on peut faire autrement.
P.S. Non seulement le code que vous avez donné est totalement étranger à la création d'un nom dans le classeur, mais il est tellement éloigné d'une programmation correcte que je n'arrive même pas à y discerner ce que vous voulez faire. Quant à localiser une ligne de total, comment voulez vous que je vous dise ? Ça dépend d'une multitude de facteurs que je ne vois pas dans votre fichier non joint !
À +
 
Dernière édition:

ZAGADOUNE

XLDnaute Nouveau
Re : Macro VBA copier/insérer une ligne (sans utiliser le n° de ligne) au dessus d'un

En fait, j'ai créé un tableau tout simple de prix de revient d'un banquet à faire saisir par les Maitres d'Hotel après chaque manifestation (colonnes "quantités", "prix unitaire", "total"), avec 6 sous totaux successifs sur la même feuille (marchandises consommées, personnel cuisine, personnel salle ...etc) .
Je voulais juste qu'ils puissent ajouter une ou plusieurs lignes juste au dessus de chaque sous-total en cliquant sur un bouton (situé sur chaque ligne sous total), sans perturber le total général de la feuille (bien sur, la feuille doit être protégée et les lignes colonnes masquées pour une meilleure présentation)
Simple pour un pro comme vous, compliqué pour moi !! (ci-joint mon petit fichier)
merci d'avance
 

Pièces jointes

  • Analyse rentabilité Banquets Test simple.xls
    62 KB · Affichages: 213
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Macro VBA copier/insérer une ligne (sans utiliser le n° de ligne) au dessus d'un

Bonjour.
Je vous conseille d'utiliser la fonction SOUS.TOTAL(9;... plutôt que SOMME(...
L'avantage c'est qu'elle ne tient pas compte dans le calcul de la somme des cellules qui utilisent déjà la fonction SOUS.TOTAL, donc sommes globales plus faciles à spécifier.

J'y reviendrai à la fin, dans une modification récent de ce message.
En attendant ce code peut convenir :
VB:
Sub InsérerLigne()
Dim AC As Shape, Ligne As Range, Cel As Range
Application.Calculation = xlCalculationManual
Set AC = ActiveSheet.Shapes(Application.Caller)
Set Ligne = AC.TopLeftCell.EntireRow
Ligne.Copy: Ligne.Insert
For Each Cel In Ligne.Cells
   If Not Cel.HasFormula Then Cel.ClearContents
   Next Cel
AC.Top = Ligne.Top + Ligne.Height - 1
Ligne.Columns(1).Select
Application.Calculation = xlCalculationAutomatic
End Sub
Affectez la aux boutons de formulaire, faites déborder ceux si légèrement sur la dernière ligne sur le modèle de laquelle on doit créer une nouvelle, changer leurs propriétés en "Déplacer sans dimensionner avec les cellules" et "ne pas imprimer l'objet.

P.S. Cela dit, il serait peut être aussi bien de ne pas mettre de bouton ni de macro et de laisser les gens insérer des lignes devant les lignes de totaux (d'ailleurs il y en aura qui le feront, croyant que les boutons ne les concernent pas !).
Pour que cela n'entraine pas de désordre dans les sous totaux, après suppression de toutes les lignes inutiles :
Soit E11 le sous sous total Prestation:
Code:
=SOUS.TOTAL(9;E$7:DECALER(E11;-1;0))
Soit E15 le sous sous total Suppléments:
Code:
=SOUS.TOTAL(9;E$11:DECALER(E15;-1;0))
Soit E16 le sous total Nourriture et boisson:
Code:
=SOUS.TOTAL(9;E$7:DECALER(E16;-1;0))
Vous voyez, sauf pour certaines qui partent du titre, les plage englobée vont toujours d'un sous total jusqu'à la cellule qui précède, comme ça plus de problème en cas d'insertion n'importe où, même devant !
À +
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 175
Messages
2 085 952
Membres
103 058
dernier inscrit
florentLP