Création automatique d'une ligne

sadicla

XLDnaute Occasionnel
Bonjour à tous

Je suis toujours sur ma feuille de métrés et je voudrais si c'est possible, avoir une nouvelle ligne , au fur et à mesure de mes saisies lorsque je passe à la ligne suivante . J'avais au départ fait un tableau de 3000 lignes ( j'ai vu un peu grand je l'avoue ) mais lorsque je fais des filtres quelconque, ou d'autres manipulations simples, il y a d'énormes lenteurs dues sans doute au fait que dans ces 3000 lignes il y a 8 formules en tout, donc 24000 formules c'est trop . C'est pour cette raison que je voudrais pouvoir avoir un tableau qui se construise au fur et à mesure . Oups j'espère que je suis clair ... ( pas sur çà !!! ) . Je mets un exemple de mon fichier . Merci à tous d'avance, et bonne journée .
 

Pièces jointes

  • Feuille de métrés.zip
    164.1 KB · Affichages: 49
  • Feuille de métrés.zip
    164.1 KB · Affichages: 50
  • Feuille de métrés.zip
    164.1 KB · Affichages: 50
Dernière édition:

sadicla

XLDnaute Occasionnel
Re : Création automatique d'une ligne

Oups !!! Mince , pourtant quand je l'ouvre j'ai pas de problème . Je l'ai zippé parce qu'il est trop gros . Je sais pas trop comment faire autrement .
Je le refait avec un autre
 

Pièces jointes

  • Feuille de métrés.zip
    163.2 KB · Affichages: 37
  • Feuille de métrés.zip
    163.2 KB · Affichages: 46
  • Feuille de métrés.zip
    163.2 KB · Affichages: 39
Dernière édition:

job75

XLDnaute Barbatruc
Re : Création automatique d'une ligne

Bonjour sadicla, mutzik,

Voir cette macro dans le code de la feuille Métrés :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Variant
lig = Application.Match("S.TOTAUX", [A:A], 0)
If Not IsNumeric(lig) Then MsgBox "Il faut ""S.TOTAUX"" en colonne A !", 48: Exit Sub
If Cells(lig - 1, 1) = "" Then Exit Sub
Application.EnableEvents = False 'désactive l'action des événements
On Error Resume Next 'sécurité
Rows(lig).Insert
Rows(2).Copy Rows(lig)
Rows(lig).SpecialCells(xlCellTypeConstants).ClearContents
Application.EnableEvents = True
End Sub
Nota : supprimé les bordures supérieures de la ligne 2 (qui est copiée).

A+
 

Pièces jointes

  • Feuille de métrés(1).zip
    166.5 KB · Affichages: 69

Herger

XLDnaute Nouveau
Re : Création automatique d'une ligne

Bonsoir,

J'ai n'ai pas réussi à reproduire cette macro dans mon fichier.
Effecivement je suis interressé par cette fonction, car ceci evite de créer un gros tableau.
Et le principe de copier une ligne modele dès que la dernière ligne est renseignée est très interressante.

Donc dans le fichier joint, je souhaite recopier la ligne A à la fin du tableau.



Merci
 

Pièces jointes

  • TEST.xlsm
    14.1 KB · Affichages: 60
  • TEST.xlsm
    14.1 KB · Affichages: 65
  • TEST.xlsm
    14.1 KB · Affichages: 64

job75

XLDnaute Barbatruc
Re : Création automatique d'une ligne

Bonjour Herger, le fil,

Il y a beaucoup de manières de rendre un tableau évolutif.

La macro du post #4 s'appuie sur la colonne A et la recherche de "S.TOTAUX".

Celle-ci s'appuie sur la dernière ligne contenant au moins une formule :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Long, n As Long
On Error Resume Next
lig = Cells.Find("=*", , xlFormulas, , xlByRows, xlPrevious).Row
If Err Then MsgBox "Pas de formule...": Exit Sub
n = Rows(lig).SpecialCells(xlCellTypeConstants).Count
If Err Then Exit Sub
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive l'action des événements
Rows(lig + 1).Insert
Rows(3).Copy Rows(lig + 1)
Rows(lig + 1).SpecialCells(xlCellTypeConstants).ClearContents
Application.EnableEvents = True
End Sub
Fichier joint.

A+
 

Pièces jointes

  • TEST(1).xls
    41 KB · Affichages: 64
  • TEST(1).xls
    41 KB · Affichages: 65
  • TEST(1).xls
    41 KB · Affichages: 76

sadicla

XLDnaute Occasionnel
Re : Création automatique d'une ligne

Hello le monde
Un grand merci à toi Job75 !!! C'est tout à fait ce que je cherchais à faire . Super cette macro , la classe !!! . Ah quand on est doué, tout est possible en Excel ... Encore une fois bravo et merci . Bon week end .

EDIT1 : Question , afin d'éviter toute fausse manoeuvre ( oui ce fichier va être utilisé par quelqu'un d'autre que moi, et d'un niveau beaucoup plus faible que moi , c'est pas peu dire ... ) par quel moyen puis-je bloquer la ligne 2 ,celle qui sert de modèle, afin que ma collègue ne puisse pas l'effacer accidentellement ?? Merci encore . Avec la protection complète de la ligne, çà ne va pas

EDIT2 : Pourquoi lorsque je fais un "aperçu avant impression" est-ce si long ?? J'ai mon sablier qui tourne au moins pendant 15 secondes alors que mon tableau est vide . En fait tout est lent . Il doit y avoir dans cette feuille des restant de je ne sais pas quoi qui freine le tout . Peut-être pourrais-tu me l'épurer ?? J'ai la trouille de virer quelque chose qui ne faut pas . Merci

EDIT3 : Pardon mais c'est à l'utilisation que je découvre les quelques petits problèmes . Les totaux dans ma ligne "S.TOTAUX" ne semblent plus se faire .
 

Pièces jointes

  • Feuille de métrés.zip
    164.1 KB · Affichages: 44
  • Feuille de métrés.zip
    164.1 KB · Affichages: 32
  • Feuille de métrés.zip
    164.1 KB · Affichages: 33
Dernière édition:

job75

XLDnaute Barbatruc
Re : Création automatique d'une ligne

Bonjour sadicla,

1) Pour sécuriser la ligne modèle, on peut la placer dans la feuille masquée (VeryHidden) Ligne copiée :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Variant
lig = Application.Match("S.TOTAUX", [A:A], 0)
If IsError(lig) Then MsgBox "Il faut ""S.TOTAUX"" en colonne A !", 48: Exit Sub
If Cells(lig - 1, 1) = "" Then Exit Sub
Application.EnableEvents = False 'désactive l'action des événements
On Error Resume Next 'sécurité
Rows(lig).Insert
Sheets("Ligne copiée").Rows(1).Copy Rows(lig)
Rows(lig).SpecialCells(xlCellTypeConstants).ClearContents
Application.EnableEvents = True
End Sub

Sub MasqueAfficheFeuille()
Sheets("Ligne copiée").Visible = xlVeryHidden 'masque la feuille
'Sheets("Ligne copiée").Visible = True 'affiche la feuille
End Sub
Nota : on peut essayer de supprimer la ligne 2... Elle se réinsère automatiquement...

Edit : IsError est quand même plus simple que Not IsNumeric...

2) Vos formules de la ligne "S.TOTAUX" n'étaient pas correctes, utiliser en B3 et suivantes :

Code:
=SOUS.TOTAL(9;DECALER(B$1;;LIGNE()-1))
3) Votre fichier était trop lourd car la feuille Métrés était vérolée : la Dernière cellule était en IL65536 !!!

Je n'ai pas trouvé d'autre solution que de la refaire complètement.

Fichier joint.

A+
 

Pièces jointes

  • Feuille de métrés relookée(1).xls
    70 KB · Affichages: 64
Dernière édition:

sadicla

XLDnaute Occasionnel
Re : Création automatique d'une ligne

Re Job75
Tout d'abord un grand merci de me suivre comme çà, ç'est très sympa . Il y a quand même quelques problèmes de totaux qui restent .

EDIT : si c'est pas abuser , puis-je avoir comme format des nouvelles lignes ajoutées celui de mon exemple ligne 2
 

Pièces jointes

  • Copie de Feuille de métrés relookée(1)-1.xls
    57.5 KB · Affichages: 62
Dernière édition:

Herger

XLDnaute Nouveau
Re : Création automatique d'une ligne

Bonjour,

Je n'arrives pas à utiliser le code donné par Job75, de plus lorsque je renseigne une ligne il n'y a pas de création d'une nouvelle ligne.

Pouvez vous m'aider sur mon fichier?

Et comme je suis ignare sur les macros et les codes VBA je n'arrive pas à analyser pourquoi ils ne fonctionnent pas.
Est ce que vous connaissez un endroit pour apprendre les macros et VBA? Pour que déja je cherche seul dans un premier temps.
 

Pièces jointes

  • TEST(1).xls
    41 KB · Affichages: 50
  • TEST(1).xls
    41 KB · Affichages: 45
  • TEST(1).xls
    41 KB · Affichages: 46

job75

XLDnaute Barbatruc
Re : Création automatique d'une ligne

Re,

J'avais écrit trop vite les formules de la ligne "S.TOTAUX", voici la bonne en B3, à recopier à droite :

Code:
=SOUS.TOTAL(9;DECALER(B$1;1;;LIGNE()-2))
Fichier (2).

A+
 

Pièces jointes

  • Feuille de métrés relookée(2).xls
    71 KB · Affichages: 54

sadicla

XLDnaute Occasionnel
Re : Création automatique d'une ligne

Super Job75 comme çà c'est nikel . Une dernière petite chose, il faudrait que la ligne cachée servant de modèle soit mise en forme différemment, un peu comme mon exemple du dessus . Comment faire pour la faire apparaitre afin que je puisse modifier les différents formats ?? En tout cas bravo et merci .

EDIT : Désolé je me rends compte que je commence à devenir ch...t , donc si c'est le cas ne me réponds pas , tu en as déjà suffisamment fait , mais j'ai un dernier problème, j'applique des filtres sur les colonnes des "codes" en G et H et avant le filtre s'arrêtait avant la ligne "S.TOTAUX" de telle façon que j'avais les sous totaux remplis à chaque type de filtre appliqué.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Création automatique d'une ligne

Re sadicla,

Effectivement le filtre automatique englobait systématiquement la ligne "S.TOTAUX" qui se masquait donc en filtrant.

Pour que ça ne se produise pas, il faut une ligne complètement vide au-dessus de "S.TOTAUX".

Et repositionner le filtre quand une ligne est ajoutée :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Variant, piece As Variant
lig = Application.Match("S.TOTAUX", [A:A], 0)
If IsError(lig) Then MsgBox "Il faut ""S.TOTAUX"" en colonne A !", 48: Exit Sub
If Cells(lig - 1, 1) = "" Then Exit Sub
Application.EnableEvents = False 'désactive l'action des événements
Me.AutoFilterMode = False 'désactive le filtre automatique
On Error Resume Next 'sécurité
piece = Cells(lig - 1, 1) 'mémorise
Rows(lig).Insert
Sheets("Ligne copiée").Rows(1).Copy Rows(lig - 1).Resize(2) 'colle sur 2 lignes
Cells(lig - 1, 1) = piece
Rows(lig).ClearContents
[A1:N1].Resize(lig - 1).AutoFilter 'replace le filtre automatique
Application.EnableEvents = True
End Sub

Sub MasqueAfficheFeuille()
Sheets("Ligne copiée").Visible = xlVeryHidden 'masque la feuille
'Sheets("Ligne copiée").Visible = True 'affiche la feuille
End Sub

Nota : bien sûr pour afficher la feuille Ligne copiée lancez la 2ème macro avec la 3ème ligne activée.

Fichier (3).

A+
 

Pièces jointes

  • Feuille de métrés relookée(3).xls
    76.5 KB · Affichages: 57

job75

XLDnaute Barbatruc
Re : Création automatique d'une ligne

Re,

Ah il faut ajouter un test pour le cas où l'on supprime toutes les lignes (lig = 2) :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Variant, piece As Variant
lig = Application.Match("S.TOTAUX", [A:A], 0)
If IsError(lig) Then MsgBox "Il faut ""S.TOTAUX"" en colonne A !", 48: Exit Sub
If Cells(lig - 1, 1) = "" Then Exit Sub
Application.EnableEvents = False 'désactive l'action des événements
Me.AutoFilterMode = False 'désactive le filtre automatique
On Error Resume Next 'sécurité
piece = Cells(lig - 1, 1) 'mémorise
Rows(lig).Insert
If lig = 2 Then 'si l'on a supprimé toutes les lignes...
  Sheets("Ligne copiée").Rows(1).Copy Rows(lig)
Else
  Sheets("Ligne copiée").Rows(1).Copy Rows(lig - 1).Resize(2) 'colle sur 2 lignes
  Cells(lig - 1, 1) = piece
End If
Rows(lig).ClearContents
[A1:N1].Resize(lig - 1).AutoFilter 'replace le filtre automatique
Application.EnableEvents = True
End Sub

Sub MasqueAfficheFeuille()
Sheets("Ligne copiée").Visible = xlVeryHidden 'masque la feuille
'Sheets("Ligne copiée").Visible = True 'affiche la feuille
End Sub
Fichier (4).

A+
 

Pièces jointes

  • Feuille de métrés relookée(4).xls
    77 KB · Affichages: 59

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 321
Messages
2 087 266
Membres
103 501
dernier inscrit
talebafia