Copier ligne
Bonjour je souhaite réussir à copier une ligne d'un tableau filtré feuil x dans une ligne de tableau ré-cap feuil y au moyen d'une commande buttons sur le feuil x
Jusque-là je pense pouvoir me débrouiller avec divers recherches sur le net mais ...
Bien évidemment les choses se compliquent car les cellules de la ligne feuil 1 ne sont pas organisées comme les cellules de la ligne qui accueillera les donnés feuils y est de-plus certaines cellules feuil x doivent être multipliées par un certain facteur avant de s'afficher feuil y est pour rajouter une cerise sur le gâteau une fois la ligne copiée avec les cellules multipliées et dans la bonne organisation feuil y la prochaine copie par le moyen de ce commande buttons ne doit pas supprimer la ligne précédemment copiée mais doit s'ajouter sur la ligne du dessous tous en respectant les mêmes condition
ci-jointe: l'excel en question
explication sur le cas concret
feuil x =feuil 4 feuils y = feuil 1
La premier ligne de départ doit etres la ligne 3 en feuil y
exemple :
colonne b feuil 4 doit correspondait à colonne A feuil 1
colonne e feuil 4 doits correspondre à colonne E feuil 1
et / où
en plus du déplacement certaine colonne pour exemple g feuil 4 doits être multipliée par le nombre de la cellule( Q; 2)
Désolé de mon faible niveau et merci pour tous aide quel qu’elle soit
Bonsoir Boudet,
Ci-joint un premier jet pour voir si ce genre de chose te conviendrait.
Je reprends juste 4 informations, il suffira de rajouter le contenu voulu si l'idée est la bonne.
D'ailleurs quelques question/informations:
- la référence de plan est bien unique? ou il faudrait plutôt partir sur le PN? ou rien du tout est unique et tu veux avoir des doublons? dans le macro actuellement on empêche ça
- Oublie pas faire un bouton pour retirer des références dans ton fichier recap (ou tout supprimer d'un coup) ou si tu le fais manuellement il faudra bien faire attention à ne pas laisser de ligne vide sinon la macro ne fonctionnera pas comme prévue
- Actuellement pas de soucis mais attention, le fait de reprendre les informations dans la feuille1 active le "Private Sub Worksheet_Change(ByVal Target As Range)" associé à celle-ci, si tu modifies/ajoutes des fonctions les deux peuvent entrer en conflit et donner n'importe quoi, garde un oeil la dessus
J'ai essayé de rendre au plus clair le code ce qui peut paraitre extrême et pénible mais cela sera plus facile à comprendre je pense, d'ailleurs ci-dessous le code pour ceux qui n'ouvrent pas les fichiers:
Sub RepriseLigne()
'----------------------DECLARATION DES VARIABLES---------------------------
'informations pour la feuille recap Y/feuille1
Dim RECAP_NOM_FEUILLE As String
Dim RECAP_PREMIERE_LIGNE_TABLEAU As Integer
Dim RECAP_COLONNE_DESIGNATION As Integer, RECAP_COLONNE_NB_PLAN As Integer, RECAP_COLONNE_PN As Integer, RECAP_COLONNE_DN As Integer, RECAP_COLONNE_DIAMETRE As Integer
'informations pour la feuille data X/feuille4
Dim DATA_NOM_FEUILLE As String
Dim DATA_PREMIERE_LIGNE_TABLEAU As Integer
Dim DATA_COLONNE_TYPE_PLANS As Integer, DATA_COLONNE_PN As Integer, DATA_COLONNE_DN As Integer, DATA_COLONNE_DIAMETRE As Integer
Dim DATA_REFERENCE_SELECTIONNEE As String, DATA_LIGNE_SELECTIONNE As Integer
'variable diverses
Dim BALAYAGE_LIGNE As Integer
'------------------------INITIALISATION DES VARIABLES-------------------
'informations pour la feuille recap Y/feuille1
RECAP_NOM_FEUILLE = "Feuil1"
RECAP_PREMIERE_LIGNE_TABLEAU = 3
RECAP_COLONNE_DESIGNATION = 1
RECAP_COLONNE_NB_PLAN = RECAP_COLONNE_DESIGNATION + 1
RECAP_COLONNE_PN = RECAP_COLONNE_NB_PLAN + 1
RECAP_COLONNE_DN = RECAP_COLONNE_PN + 1
RECAP_COLONNE_DIAMETRE = RECAP_COLONNE_DN + 1 'colonne 5
'informations pour la feuille data X/feuille4
DATA_NOM_FEUILLE = "Feuil4"
DATA_PREMIERE_LIGNE_TABLEAU = 4
DATA_COLONNE_TYPE_PLANS = 2
DATA_COLONNE_PN = DATA_COLONNE_TYPE_PLANS + 1
DATA_COLONNE_DN = DATA_COLONNE_PN + 1
DATA_COLONNE_DIAMETRE = DATA_COLONNE_DN + 1 'colonne 5
'---------------------------- MACRO-----------------------------------
'le activecell.row renvoie le numéro de ligne sélectionné sur la feuille, on l'utilise pour aller chercher la réréfence du plans et on garde tout en mémoire
DATA_LIGNE_SELECTIONNE = ActiveCell.Row
DATA_REFERENCE_SELECTIONNEE = Sheets(DATA_NOM_FEUILLE).Cells(DATA_LIGNE_SELECTIONNE, DATA_COLONNE_TYPE_PLANS)
'CHECK SECURITE, il faut être au minimum sur la première ligne et que la ligne ne soit pas vide sur la feuille data X/Feuille4
If ActiveCell.Row <= DATA_PREMIERE_LIGNE_TABLEAU Or DATA_REFERENCE_SELECTIONNEE = "" Then
'on préviens l'utilisateur et on sort sans rien faire
MsgBox "Action impossible, veuillez sélectionner une ligne avec une référence valide", vbCritical
Exit Sub
End If
'on vérifie que l'utilisateur à sélectionner la bonne réf en lui posant la question
'peut être supprimé si ce controle ne te sert à rien, cela dépend si le fait d'ajouter une mauvaise réf n'est pas trop un souci ou dur à retirer
If MsgBox("Voulez-vous ajouter la référence " & DATA_REFERENCE_SELECTIONNEE & "?", vbYesNo) = vbYes Then
'on trouve la première ligne disponible en partant de la premiere ligne du tableau recap
BALAYAGE_LIGNE = RECAP_PREMIERE_LIGNE_TABLEAU
Do Until Sheets(RECAP_NOM_FEUILLE).Cells(BALAYAGE_LIGNE, RECAP_COLONNE_DESIGNATION).Value = ""
'on vérifie qu'on a pas déja la ref dans la liste recap
If Sheets(RECAP_NOM_FEUILLE).Cells(BALAYAGE_LIGNE, RECAP_COLONNE_DESIGNATION).Value = DATA_REFERENCE_SELECTIONNEE Then
'on préviens l'utilisateur et on sort sans rien faire
MsgBox "Action impossible: référence déjà incluse dans le fichier recap", vbCritical
Exit Sub
End If
BALAYAGE_LIGNE = BALAYAGE_LIGNE + 1
Loop
'si on arrive ici alors la référence n'existe pas encore et on est sur la première ligne du tableau recap qui est vide, on ajoute donc la référence
'la designation de la feuille recap correspond au type plans de la feuille data, pour le restant on a la même nom
Sheets(RECAP_NOM_FEUILLE).Cells(BALAYAGE_LIGNE, RECAP_COLONNE_DESIGNATION).Value = Sheets(DATA_NOM_FEUILLE).Cells(DATA_LIGNE_SELECTIONNE, DATA_COLONNE_TYPE_PLANS).Value
Sheets(RECAP_NOM_FEUILLE).Cells(BALAYAGE_LIGNE, RECAP_COLONNE_PN).Value = Sheets(DATA_NOM_FEUILLE).Cells(DATA_LIGNE_SELECTIONNE, DATA_COLONNE_PN).Value
Sheets(RECAP_NOM_FEUILLE).Cells(BALAYAGE_LIGNE, RECAP_COLONNE_DN).Value = Sheets(DATA_NOM_FEUILLE).Cells(DATA_LIGNE_SELECTIONNE, DATA_COLONNE_DN).Value
Sheets(RECAP_NOM_FEUILLE).Cells(BALAYAGE_LIGNE, RECAP_COLONNE_DIAMETRE).Value = Sheets(DATA_NOM_FEUILLE).Cells(DATA_LIGNE_SELECTIONNE, DATA_COLONNE_DIAMETRE).Value
End IfEdit: il y aura une correction à faire je viens de voir ca en me relisant sur le :
'CHECK SECURITE, il faut être au minimum sur la première ligne et que la ligne ne soit pas vide sur la feuille data X/Feuille4
If ActiveCell.Row <= DATA_PREMIERE_LIGNE_TABLEAU Or DATA_REFERENCE_SELECTIONNEE = "" Then
il y a une erreur, c'est plutôt
sinon on ne pourras pas sélectionner la première ligne 4ActiveCell.Row < DATA_PREMIERE_LIGNE_TABLEAU
ECG