Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Angelusyfaire

XLDnaute Nouveau
Bonjour,

Je souhaite intégrer une macro à un bouton et étant nouveau dans le VBA's world je demande toute l'aide possible d'avoir.

Suite à un clic une macro se déclanche pour insérer une ligne au bon endroit d'un tableau dans la bonne feuille.

Suite à un clic une macro se déclanche pour que, si dans la cellule C3= P, alors selectionner la feuille P si dans la cellule C3 = M alors selectionner la feuille M
Puis, rechercher dans la colonne D feuille M ou P (selon C3) le numéro de dossier en C4 feuille 1 dans la colonne D PUIS rechercher la version en C5 feuille 1 dans la feuille M ou P (selon C3)

Une fois la ligne sélectionnée insérer juste en dessous la ligne 16 de la feuille 1

Si il n'y a pas de bon numéro de dossier (C4 feuille 1) alors rechercher dans la feuille M ou P (selon C3 feuille 1) la valeur la plus proche (N-1) avec une version la plus haute pour insérer la ligne 16 juste en dessous (exemple si dossier numéro 10 existe pas rechercher le dossier numéro 9 avec la version la plus haute pour insérer juste en dessous la ligne avec le nouveau numéro de dossier).


J'ai mis un fichier excel en pièce jointe pour illustrer mon problème.

Merci beaucoup pour toute l'aide que vous pourrez m'accorder.
 

Pièces jointes

  • Bouton intégrer le document.xls
    17.5 KB · Affichages: 40

Abel

XLDnaute Accro
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour Angelusyfair,

Un exemple, un peu agricole mais qui a l'air de fonctionner.
je suis sur xl2003.

Abel.

Edit : j'oubliais, bienvenue ici bas.
 

Pièces jointes

  • Ex_Angelusyfair_Ajoutligne.xls
    33 KB · Affichages: 33
  • Ex_Angelusyfair_Ajoutligne.xls
    33 KB · Affichages: 52
  • Ex_Angelusyfair_Ajoutligne.xls
    33 KB · Affichages: 48

Angelusyfaire

XLDnaute Nouveau
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour,

Merci pour cette réponse très rapide !

Seulement je pense m'être mal exprimé. Je souhaite intégrer la ligne 16 de la feuille 1 dans, soit le tableau en M soir le tableau en P en fonction de ce qu'il se trouve dans la cellule C3 dans le feuille 1
exemple: si il y a un P en C3 alors la ligne 16 va être insérée dans la feuille P et au bon endroit c'est a dire soir juste après la ligne qu'il nous faut c'est a dire : Si c'est le dossier 9 version 2 qui est a mettre dans P alors la ligne 16 sur la feuille 1 va aller se mettre dans la feuille P juste en dessous de la ligne avec le dossier 9 version 1

Un autre exemple : Si on a le dossier 9 version 1 a mettre dans P cette fois ci alors j'aimerais que le dossier aille se mettre dans la feuille P juste en dessous du dossier inférieur (dossier 8 si il existe ou 7 ou 6 ...) et pour que la ligne ne s'insère pas dans les dossiers 8 il faut aussi tenir compte de la version donc en gros insérer juste en dessous des dossiers 8 et donc de la dernière version des dossiers 8

ça a l'air très compliqué comme ça mais fort utile. Merci de m'aider en tout cas :)

Et merci pour la bienvenue ;)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour Angelusyfaire et bienvenu, bonjour Abel, bonjour le forum,

Une autre proposition avec gestion d'éventuelles erreurs...

[Édition]
Arf... On s'est croisés et mon fichier ne conviendra pas non plus. Ça m'apprendra à écouter Abel...
 

Pièces jointes

  • Angelus_v01.xls
    36 KB · Affichages: 44
Dernière édition:

Angelusyfaire

XLDnaute Nouveau
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Merci Robert de prendre part à mon problème !

En effet j'ai du mal exprimer mon besoin. Cependant ta macro m'aide aussi beaucoup pour les messages d'erreur, celui-ci ne sera pas vain.

Merci encore à tous de m'aider c'est très gentil et ça me permet de mieux comprendre le VBA !!
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour le fil, bonjour le forum,

Dans la version 2 le tableau en B3:C5 devient inutile. La plage B16 : C16 est copiée à la fin puis un tri se fait pour ranger par ordre croissant les numéros de dossier puis par odre croissant les versions...
 

Pièces jointes

  • Angelus_v02.xls
    37.5 KB · Affichages: 53

Angelusyfaire

XLDnaute Nouveau
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

C'est juste PARFAIT !!!!!

10 000 Merci !!! C'est exactement ce que je voulais !! Par contre je ne saisi pas tout dans ton codage je vais surement avoir besoin d'aide pour ça :D

Déjà un truc que j'ai vu, dans le message d'erreur si le nom de l'onglet existe pas la lettre en B16 c'est pas reprise dans le message d'erreur du clic j'ai remplacé C3 par B16 le résultat est juste parfait !! :D

Jusqu'à là c'est bon !!

Ensuite :

Code:
dl = o.Cells(Application.Rows.Count, 4).End(xlUp).Row

Pour cette ligne si je comprend bien on défini dl comme étant les cellules a selectionner dans l'onglet def par "o"
Mais a quoi sert (application.row.count,4)
Et End(xlUp).Row

Code:
o.Range(o.Cells(dl + 1, 3), o.Cells(dl + 1, 5)).Insert shift:=xlShiftDown
Pour celle là je ne comprend pas pourquoi pour coller on doit mettre un o.cells(dl+1,3) et un o.Cells(dl + 1, 5) ça sélectionne la plage de réception de la copie ?

Et enfin :

Code:
pl.Sort Key1:=o.Range("D3"), Order1:=xlAscending, _
   Key2:=o.Range("E3"), Order2:=xlAscending,

Peux tu m'expliquer tout ça ?

Encore MERCI !!! ça m'aide énormément !! j'espère m'améliorer dans le VBA en tout cas ça me donne bien envi tout ça !!

Edit : Je viens de me rendre compte de quelque chose. il me manque une dernière chose.

Je souhaite faire en sorte qu'après avoir intégré la ligne on sélectionne dans o.sheet l'ensemble des même duméro de dossier (f.sheet "C16") et que l'on grise l'ensemble des lignes sélectionné sauf la dernière qui se trouve être notre ligne ajoutée.

Et pour finir après tout sera bon : rajouter dans la ligne L-1 et dans une nouvelle colonne la date du jour (une espère de date d'archivage) de sorte a ce que la la dernière ligne grisé ai une date dans une nouvelle colonne.

C'est possible ? :s

En tout cas un GRAND et GROS MERCI !!
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonsoir le fil, bonsoir le forum,

Code:
dl = o.Cells(Application.Rows.Count, 4).End(xlUp).Row

Bon, commençons par le commencement... Pour spécifier (atteindre ou sélectionner) une cellule on peut le faire en utilisant Range("Adresse") ou Cells(Ligne, Colonne). Range("A1") et Cells(1, 1) signifient donc la même chose.
Le commentaire de la ligne ci-dessus disait : "Définit la dernière ligne éditée dl de la colonne 4 (=D)"
Pour atteindre la dernière ligne éditée d'une colonne, on peut commencer par se placer dans la dernière cellule de cette colonne. Avec les anciennes versions d'Excel on écrivait : Range("D65536") pour la dernière ligne de la colonne D. Pour être en harmonie avec les anciennes et nouvelles versions, qui ont beaucoup plus de lignes, il est préférable écrire : Cells(Application.Rows.Count, 4). Ensuite, on remonte (xlUp) jusqu'à le dernière (End) ligne éditée. Le curseur atteint cette dernière ligne que l'on récupère avec le .Row. Donc la ligne de code : dl = o.Cells(Application.Rows.Count, 4).End(xlUp).Row permet d'attribuer à la variable dl, le numéro de la dernière ligne éditée de la colonne D de l'onglet o.

Pour mentionner une plage de cellules des colonnes C à E, dont la ligne est variable (dl), on peut écrire : Range("C" & dl & ": E" & dl) qui, si dl = 12, équivaut à la plage C12:E12. On peut aussi la mentionner par : Range(Cellule de départ, Cellule de fin) soit, Range(Cells(dl , 3), Cells(dl, 5)). Ça équivaut aussi à la plage C12:E12 si dl = 12.
Le o devant indique que l'on se réfère à l'onglet o. donc o.Range(o.Cells(dl+1, 3), o.Cells(dl+1, 5)) est donc la plage C13:E13 de l'onglet o si dl = 12.

La dernière partie correspond à un simple tri de la plage pl avec, en premier critère la cellule D3 par ordre croissant et en second critère la cellule E3 par ordre croissant.

Je regarde pour tes autres problèmes...
 

Abel

XLDnaute Accro
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Re,

Alors voilà, le temps d'une Duvel, un encas et une variable qui aurait du être publique et qui ne l'était pas (1 h quand même là dessus. Heu ... là, c'est toujours pareil ! Y a que moi qu'a le droit de rigoler sauf peut être un peu Robert à condition que ça ne dépasse pas le léger rictus. LEGER J'AI DIT, ROBERT !!!)

Bon, je mets quand même mon tripatouillage en ligne. On sait jamais.

Abel.

Edit : j'oubliais, il faut que les tableaux en soient triés en ordre croissant (j'aurais pu inclure ce tri dans les procédures).
 

Pièces jointes

  • Ex_Angelusyfair_Ajoutligne.xls
    48.5 KB · Affichages: 49
  • Ex_Angelusyfair_Ajoutligne.xls
    48.5 KB · Affichages: 54
  • Ex_Angelusyfair_Ajoutligne.xls
    48.5 KB · Affichages: 55
Dernière édition:

Abel

XLDnaute Accro
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour tout le monde,

Une autre façon de faire mais qui, me semble't-il, se rapproche de ce qu'à fait Robert.
C'est toujours aussi agricole mais ça semble fonctionner.

Et puisqu'il était fait je le mets aussi en ligne, des fois que ...

Abel.
 

Pièces jointes

  • Ex_Angelusyfair_Ajoutligne2.xls
    54.5 KB · Affichages: 50

Angelusyfaire

XLDnaute Nouveau
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour,

Merci a vous deux de m'aider comme ça !
@Robert : Merci pour les explications j'ai tout compris c'est génial ! J'attend avec impatience ta réponse pour mes autres problèmes :D

@Abdel : Merci aussi ta façon 2 m'interesse aps mal pour le fait d'aller sur l'onglet cible après avoir appuyé sur le bouton. Je vais regarder ton code pour ça et essayer rassembler tout ça ^^

Il ne me reste plus que le problème pour griser les ligne et mettre la date et normalement la macro sera finie.
Un grand merci à vous deux pour participer et faire vivre autant ce forum !
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour le fil, bonjour le forum,

En pièce jointe la version 3 avec le code ci-dessous :
Code:
Public Sub Macro1()
Dim f As Object 'déclare la variable f (onglet Feuil1)
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim nd As String 'déclare la variable nd (Numéro du Dossier)
Dim v As String 'déclare la variavle v (Version)

Set f = Sheets("Feuil1") 'définit l'onglet f
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set o = Sheets(f.Range("B16").Value) 'définit l'onglet o (génère une erreur si cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une ereur a été générée
    Err = 0 'annule l'ereur
    MsgBox "L'onglet " & f.Range("C3").Value & " n'existe pas !" 'message
    f.Select 'sélectionne l'onglet f (au cas où...)
    f.Range("C3").Select 'sélectionne la cellule C3 de l'onglet f
    Exit Sub 'sort de la procédure
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des ereurs
nd = CStr(f.Range("C16").Value) 'définit le numéro de dossier nd
v = CStr(f.Range("D16").Value) 'définit la version v
dl = o.Cells(Application.Rows.Count, 4).End(xlUp).Row 'définit la dernière ligne dl de la colonne 4 (=D)
f.Range("B16:D16").Copy 'copie B16:D16
o.Range(o.Cells(dl + 1, 3), o.Cells(dl + 1, 5)).Insert shift:=xlShiftDown 'insère dans la ligne li
Application.CutCopyMode = False 'supprime le clignotement des cellule copiées
Set pl = o.Range(o.Cells(3, 3), o.Cells(dl + 1, 5)) 'définit la plage pl
pl.Interior.ColorIndex = xlNone 'enlève la couleur à la plage pl
'tri la plage pl par ordre croissant de numéro de dossier et par ordre croissant de version
pl.Sort Key1:=o.Range("D3"), Order1:=xlAscending, _
   Key2:=o.Range("E3"), Order2:=xlAscending, _
   Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
o.Range("C2").AutoFilter field:=2, Criteria1:=nd 'filtre le tableau para rapport au numéro de dossier
pl.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 15 'colore la plage visible de gris
'si le nombre de ligne visible est supérieur à 1, ajoute la date en coloone F de l'avant dernière cellule de la plage visible
If pl.SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then o.Cells(pl.SpecialCells(xlCellTypeLastCell).Row - 1, 6).Value = Date
o.Range("C2").AutoFilter field:=3, Criteria1:=v 'filtre la plage visible par rapport à la version
pl.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = xlNone 'supprime la couleur de la ligne visible
o.Range("C2").AutoFilter 'supprime le filtre
o.Select 'sélectionne l'Onglet
End Sub
Le fichier :
 

Pièces jointes

  • Angelus_v03.xls
    36 KB · Affichages: 49

Angelusyfaire

XLDnaute Nouveau
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonjour Robert et à tous !

Déjà merci beaucoup ! c'est juste génial tu es vraiment doué !
Par contre tout le code ne marche pas. En effet si on ajoute un fichier dossier 1 V1 ça marche très bien on ajoute un dossier 1 V1 parfait la première ligne se met en gris !! c'est parfait. :D

Ensuite j'ajoute un dossier 2 V1 parfait la date ne se met pas mais par contre ça retir tout le gris des autres lignes ?! Qu'en penses tu ? tu penses que ça viens de quoi ?

En tout cas un très GRAND merci est de rigueur :D
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer une ligne dans un tableau dans une nouvelle feuille avec une macro

Bonsoir le fil, bonsoir le forum,

J'ai mal interprété ta demande et je pensais que tu voulais du gris uniquement sur la dernière modif. En plus il y avait une erreur pour la plage pl et les dates n'accompagnaient pas le tri.
Le nouveau code :
Code:
Public Sub Macro1()
Dim f As Object 'déclare la variable f (onglet Feuil1)
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim nd As String 'déclare la variable nd (Numéro du Dossier)
Dim v As String 'déclare la variavle v (Version)Set f = Sheets("Feuil1") 'définit l'onglet f


On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set o = Sheets(f.Range("B16").Value) 'définit l'onglet o (génère une erreur si cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une ereur a été générée
    Err = 0 'annule l'ereur
    MsgBox "L'onglet " & f.Range("C3").Value & " n'existe pas !" 'message
    f.Select 'sélectionne l'onglet f (au cas où...)
    f.Range("C3").Select 'sélectionne la cellule C3 de l'onglet f
    Exit Sub 'sort de la procédure
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des ereurs
nd = CStr(f.Range("C16").Value) 'définit le numéro de dossier nd
v = CStr(f.Range("D16").Value) 'définit la version v
dl = o.Cells(Application.Rows.Count, 4).End(xlUp).Row 'définit la dernière ligne dl de la colonne 4 (=D)
f.Range("B16:D16").Copy 'copie B16:D16
o.Range(o.Cells(dl + 1, 3), o.Cells(dl + 1, 5)).Insert shift:=xlShiftDown 'insère dans la ligne li
Application.CutCopyMode = False 'supprime le clignotement des cellule copiées
Set pl = o.Range(o.Cells(3, 3), o.Cells(dl + 1, 6)) 'définit la plage pl
'tri la plage pl par ordre croissant de numéro de dossier et par ordre croissant de version
pl.Sort Key1:=o.Range("D3"), Order1:=xlAscending, _
   Key2:=o.Range("E3"), Order2:=xlAscending, _
   Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
o.Range("C2").AutoFilter field:=2, Criteria1:=nd 'filtre le tableau para rapport au numéro de dossier
pl.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 15 'colore la plage visible de gris
'si le nombre de ligne visible est supérieur à 1, ajoute la date en coloone F de l'avant dernière cellule de la plage visible
If pl.SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then o.Cells(pl.SpecialCells(xlCellTypeLastCell).Row - 1, 6).Value = Date
o.Range("C2").AutoFilter field:=3, Criteria1:=v 'filtre la plage visible par rapport à la version
pl.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = xlNone 'supprime la couleur de la ligne visible
o.Range("C2").AutoFilter 'supprime le filtre
o.Select 'sélectionne l'Onglet
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 180
Membres
103 152
dernier inscrit
Karibu