Copie de donnée dans un autre Onglet
Bonjour amis utilisateur d'Excel,
Voilà j'ai un fichier à traiter sur Excel et je ne sais pas par où commencer ni comment faire.
Ma situation :

(Les données étant peut être sensible j'ai flouté)
Donc j'ai ce tableau général que l'utilisateur rempli jusqu'à la case bleu fluo qui correspond à un délai
Puis :

j'aimerai que les lignes entières soit directement copié dans différent onglet par tranche de durée pour l'analyse
Que dois-je faire ? ou sinon vers quoi me tourner pour savoir ?
Merci d'avance
Bonne journée
Piou
Bonjour Piou et bienvenu, bonjour le forum,
Commence par nous envoyer un fichier Excel anonymisé. Ou essaie de régler ton problème sur un forum Photochope avec tes captures d'écran...
Voici le fichier
En gros je voudrais que les lignes de donnée de l'onglet général soit les seules que l'on remplisse et que les autres dans chacun des onglet se remplissent en fonction du délai affiché colonne "Délai de résolution total"
Exemple : la ligne de l'onglet 1 nous donne un délai total de 70 jours
je retrouve donc toute les infos de cette ligne dans l'onglet "Analyse +00 Jours"
Merci déjà pour ton retour sur le premier message
Le problème est que tu veux ça en automatique et comme la colonne AC contient des formules je suis obligé d'utiliser l'événement Calculate qui agit chaque fois qu'il y a un recalcul dans l'onglet et je crains que ça ne convienne pas car les lignes seront dispatchées plusieurs fois...
De plus tu proposes un fichier sans aucune donnée correspondant à un des trois cas!? N'importe quoi...
Je te propose une solution avec un bouton et en rajoutant colonne avec un marqueur dans l'onglet Données Générales. Ça ne sera plus automatique mais chaque fois que tu cliquera sur sur boutons les données seront dispatchées et marquées. Par la suite, seules les données non marquées seraient dispatchées.
J'attends donc un fichier convenable pour te proposer une solution si celle-ci te convient...
Bonjour,
Merci de ton retour, j'ai supprimé les 3000 lignes et j'ai manqué de regarder que les délais n'étaient pas bon.
Je te renvoie un fichier avec des délais corrects.
Merci déjà pour l'aide que tu m'apportes
Piou
Bonjour Piou, bonjour le forum,
En pièce jointe ton fichier modifié. J'ai remplacé les tableaux par des tableaux structurés (ListObject), rajouté une colonne Marqueur a la fin dans l'onglet Données Générales et rajouté le bouton Dispatcher. Clique sur ce bouton...
Le code :
Option Explicit
Private Sub CommandButton1_Click() 'bouton "Dispatcher"
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TS As ListObject 'déclare la variable TS (Tableau Source)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim T As ListObject 'déclare la variable T (Tableau)
Dim I As Integer 'déclare la variable I (Incrément)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (Ligne)
ActiveCell.Select 'enlève le focus au bouton
Set OS = Worksheets("Données Générales") 'définit l'onglet source OS
Set TS = OS.ListObjects(1) 'définit le tableau source TS
For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I du tableau TS
Select Case TS.DataBodyRange(I, 29).Value 'agit en fonction de la donnée ligne I colonne 29 (Délai de résolution total)
Case Is > 300 'cas supérieur à 300
Set O = Worksheets("Analyse +300 Jours") 'définit l'onglet O
Set T = O.ListObjects(1) 'définit le tableau T
Case Is > 200 'cas supérieur à 200
Set O = Worksheets("Analyse +200 Jours") 'définit l'onglet O
Set T = O.ListObjects(1) 'définit le tableau T
Case Is > 100 'cas supérieur à 100
Set O = Worksheets("Analyse +100 Jours") 'définit l'onglet O
Set T = O.ListObjects(1) 'définit le tableau T
Case Is > 0 'cas supérieur à 0
Set O = Worksheets("Analyse +00 Jours") 'définit l'onglet O
Set T = O.ListObjects(1) 'définit le tableau T
End Select 'fin de l'action en fonction de la donnée ligne I colonne 29 (Délai de résolution total)
If Not UCase(TS.DataBodyRange(I, 34).Value) = "X" Then 'condition 1 : si le marqueur en colonne 34 est différent de "X"
Set R = T.ListColumns(1).Range.Find("") 'définit la recherche (recherche du vide dans la première colonne de T)
If R Is Nothing Or T.ListRows.Count = 0 Then 'condition 2 : si aucune occurrence n'est trouvée ou si T ne contient aucune ligne
T.ListRows.Add 'ajoute une ligne à T
LI = T.ListRows.Count 'définit la ligne LI (dernière ligne de T)
Else 'sinon (au moj s une occurrence a été trouvée)
LI = R.Row - T.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-têtes de T)
End If 'fin de la condition 2
TS.DataBodyRange(I, 34).Value = "X" 'écrit X dans la colonne 34 (Marqueur)
T.DataBodyRange(LI, 1).Resize(1, 33).Value = TS.DataBodyRange(I, 1).Resize(1, 33).Value 'récupère les données de TS dans T
End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle
End Sub
Le fichier :
Merci Beaucoup ThauThème,
Ca marche très bien.
Je ne mis connais pas en VBA mais je comprend le code avec tes annotations
Je m'y pencherai plus tard car c'est intéressant.
Bonne continuation à toi et encore merci
Piou