Récupération de données selon couleur texte
Bonjour à tous,
J'ai fait qq posts pour voir si ma question avait déjà été posée et il ne me semble que ça n'est pas le cas.
Voilà, je dois établir des rapports dans Word dans lesquels plusieurs tableaux ont été créés. Ceux-ci reprennent les données venues d'une liste (autre tableau), provenant du même document. Afin de me faciliter la tâche, je souhaiterais éviter les copier/coller, et faire en sorte que mes données soient directement reprises là où elles doivent également figurer.
Avec mes quelques compétences, je me suis résolu à me dire que le plus simple était d'utiliser excel, d'y créer mes tableaux, faire en sorte que mes données soient reprises dans chacun des tableaux, et de, finalement, recopier mes tableaux dans word. Jusque là, sauriez-vous déjà me dire si Excel est le moyen le plus adapté pour réaliser ce genre de chose ?
Par ailleurs, maintenant je me demande comment procéder dans Excel. VBA ou formule ? La complexité du problème vient du fait que je souhaiterait reprendre uniquement les données qui auront été écrites en rouge (texte rouge). Pour résumer, la liste de base comporte qq lignes en rouges, et je souhaiterais que ces qq lignes figurent dans un autre tableau, et si possible qu'elles se suivent directement.
Comment procéder ??
Par la suite, j'aurais encore un autre tableau qui devrait reprendre des données, selon d'autres critères. Je pense que je poserai ma question ultérieurement.. Merci déjà par avance pour votre précieuse aide !
Julien R.
bonjour
quel critère détermine la mise en rouge ?
bonjour
quel critère détermine la mise en rouge ?
Peu importe il me semble non ?! La couleur sera modifiée manuellement. Par contre, si dans la mesure où il n'est pas possible d'ajouter comme condition la couleur du texte, je pourrais envisager la mise en forme conditionnelle. Cependant, dans le doc final, la cellule devra rester blanche, mais le texte devra être rouge. Après si le critère de détermination est nécessaire, il faudra créer une colonne avec "contenant de l'amiante" (rouge), et "ne contenant pas d'amiante" (restera normal).
Avec ces quelques précisions, auriez-vous une suggestion à me proposer ?
Merci d'avance
Julien
re
tu as très bien décrit la bonne solution
l'information est saisie en texte "amiante oui" "amiante non" ou autre code
et ensuite une MFC
tous les tris, filtres ou calculs sont alors trèèèèèèès simples
un exemple : sur un nouveau classeur faire un joli TCD qui extrait les "oui"
dans Word, "insérer Objet Excel" et naviguer vers ce classeur
terminé.
Ok, super. Je vais tester ça et reviendrait si j'ai des soucis.
Un grand merci !
A+
Julien
Bonjour à vous deux!
Tiens cette histoire d'aimiante me dit quelque chose... Je vais chercher dans l'historique du forum pour voir si je ne me fais pas des idées, ça parlait de mise en forme conditionnelle en plus...
EDIT:
Ah ben c'était là!
https://forum.excel-pratique.com/viewtopic.php?f=2&t=111036&p=661116&hilit=amiante#p661116
Rebonjour à tous,
Merci pour vos liens et conseils.
Suite à mes tentatives de sythétisation de données, je suis confronté à de nouvelles difficultés pour lesquelles j'espère que vous pourrez m'aider.
J'ai créé une macro, qui, par simples formules et filtrages me ressort les données désirées, que je peux ensuite recopier dans mon rapport word. Ce qui m'embête un peu, c'est que je dois transité par une feuille de calcul sur laquelle je copie uniquement les cellules visibles, que je colle ensuite dans une troisième feuille de calcul, qui correspond aux données finales. Je souhaiterais, lors du lancement de ma macro, supprimer cette feuille intermédiaire et renommer la feuille de "résultat". J'observe que ces deux opérations ne sont pas supportées par la macro. Est-ce que je fais quelque chose d'erroné, ou est-ce tout simplement impossible ?
Merci pour votre précieuse aide.
Julien R.
Bonjour, Salut à tous !
S'il s'agit d'une action réalisable dans Excel, elle est a-priori faisable au moyen de code... mais sans fichier correspondant à la question, il serait vain de se pencher sur le problème !
Voici le fichier en question. En activant une des trois macros, vous verrez rapidement de quoi m'a question précédente découle.
Merci !
Je vois un tableau dans ton fichier.
Que veux-tu obtenir à partir de ce tableau ?
Il comporte 2 lignes dont le texte est en rouge, sauf colonnes G et I.
Veux-tu obtenir un nouveau tableau qui ne comporterait que ces deux lignes ?
Si c'est le cas, quels éléments de la mise en forme initiale doivent être respectés (ou rétablis) ? (liste exhaustive s'il te plait !)
Et où doit-être placé le nouveau tableau ?
NB- Je ne lis pas le code enregistré, c'est insipide et du temps perdu... Il faut juste savoir exactement ce que l'on a à faire et le coder de façon adéquate.
En fait, via mes formules ainsi que les filtres insérs, j'arrive à obtenir les infos désirées.
Cependant, mon problème actuel est le suivant:
En exécutant l'une des macros, vous verrez apparaître deux nouvelles feuilles. La dernière étant celle que je souhaite conserver.
Ce que je n'arrive pas à faire, c'est inclure dans ma macro la suppression de la liste intermédiaire (la 1ère des feuilles générées), puis renommer directement l'onglet (la feuille) définitive.
Savez-vous si cela est possible via la macro ? Je l'ai essayé plusieurs fois, et j'ai un message d'erreur lorsque j'exécute ma macro..
Merci !
Là on est en train d'entamer un dialogue de sourds !
J'ai posé quelques questions précises relatives à ce que tu veux obtenir à partir de ta configuration de départ, avec tous les détails, permettant de pouvoir réaliser exactement ce que tu veux.
Si tu y réponds, je suis d'accord pour écrire un code qui fasse exactement cela !
Je n'ai aucune intention de me pencher par contre sur le problème que tu penses avoir, ni sur tes macros, qu'elles fonctionnent ou non, dont je considèrerais plutôt que c'est leur simple existence qui constitue un problème et que leur destination naturelle est la poubelle...
Ceci dit, s'il y a erreur, c'est que quelque chose ne va pas ! Tu peux toujours chercher si tu y tiens.
Je ne m'amuserai donc pas à chercher tes erreurs dans la mesure où l'utilité résultante pour écrire un code fonctionnel sera tout à fait nulle ! Donc, ou tu réponds aux questions, j'écris le code adéquat, et par la suite je veux bien alors prendre encore du temps pour expliquer le code et comment on code efficacement en VBA, en évitant en tout état de cause l'enregistreur. Ou tu ne veux pas, et cela me reposera !
Cordialement.
Ok, je veux bien refaire le topo et préciser l'intégralité de mes besoins, quand bien même ma question concerne davantage les possibilités existantes ou non avec les macros, que la réalisation à proprement parlé.
Dans ma feuille de base, j'ai plusieurs données que je vais devoir synthétiser et trier selon certains critères. Jusque là, je crois que l'on se comprend
Les voicis avec les données qui doivent y figurer (dans l'ordre cité ci-dessous) :
1) Niveau / Local /Description + remarques (séparé par ", ") /Urgences
Doivent y figurer uniquement les lignes comportant le "a" dans la colonne Amiante (lignes en rouge)
2) Niveau / Local / Code + description + Type (tjrs séparé d'une virgule + espace)
Doivent y figurer uniquement les lignes dont le Code (colonne Code) commence par un R (lignes en orange)
3) Code / Colonne vide (renommée Photo 1) / Colonne vide (renommée Photo 2) / Niveau + local (séparé d'une virgule + espace) / Remarque / (Description)
Doivent y figurer uniquement les lignes comportant le "a" dans la colonne Amiante (lignes en rouge), et ceci trié selon la colonne Description afin que les lignes soient regroupées selon ce critère. J'ai mis la colone "Description" entre parenthèse, car si on peut faire le tri sur cette colonne sans qu'elle soit visible, ça serait encore mieux.
4) Une seule colonne comportant les informations suivantes (avec retour à la ligne entre chaque donnée):
Code
Niveau
Local
Description
Doivent figurer uniquement les lignes ayant pour code P.. (+numéro).
Dans l'idéal, je souhaiterais pouvoir réaliser une seule macro qui générerait directement ces 4 tableaux (un par feuille), en renommant ces feuilles comme-ceci :
1) Conclusions amiante
2) Réserves amiante
3) Fiches d'identification
4) Prélèvements
Si ceci est réalisable, ça serait fantastique !
Merci et à disposition si question.
Julien
Je ne suis pas sûr de bien comprendre le 4 : C'est bien le contenu des colonnes Code, Niveau, Local et Despription qui doit se retrouver dans une même cellule (si prise en compte selon valeur Code: P...)
Quel intitulé pour les colonnes accueillant un contenu fusionné : Description+Remarque (1), Code+Description+Type (2), Niveau+Local (3), et la colonne unique (4).
Pour les possibilités, hormis que je ne saurais (pour l'instant
Les méthodes les plus efficaces en VBA (je laisse de côté la question de l'opportunité d'utiliser ou non VBA...) passent par des instructions propres à VBA qui ne peuvent faire l'objet d'enregistrement, particulièrement l'utilisation de tableaux, d'où ma question sur la mise en forme à rétablir ou non (que tu as éludée) car ces méthodes n'incorporent pas les formats mais sont toujours plus rapides que des copier-coller (qu'on n'utilise alors que si au total ils s'avèrent plus économiques que rétablir une mise en forme ou que celle-ci est vraiment très complexe).
Cordialement.
C'est du rapide !
Pour le 4ème tableau, effectivement, le contenu des colonnes en question devraient figurer dans une seule et même cellule, avec retour à la ligne entre chacune des données.
Pour les intitulés, j'ai effectivement oublié de préciser les informations. Les voicis:
1) Description+Remarque -> Description
2) Code+Description+Type -> Description
3) Niveau+Local -> Localisation
4) Localisation prélèvement
Les intitulés ne sont pas si importants, puisque les données seront copiées/collées dans un tableau Word par la suite, qui ne comporte pas d'intitulé.
Je te remercie pour les explications. Pour une automatisation de la sorte, je ne connais malheureusement pas toutes les possibilités qu'offre excel, de ce fait, il n'est pas toujours évident de choisir la meilleure solution. Le code VBA étant pour moi plus éxotique que la lune, j'aurais espéré pouvoir me contenter de l'enregistrement d'une macro.
Un grand merci !
Julien
Une dernière question (pour éviter éventuellement un test) : Les "a" en col. Amiante vont se retrouver dans le tableau 1 et le tableau 3 résultants, mais peuvent-ils avoir également un code en "P..." ou "R..." qui pourraient les faire se retrouver simultanément dans le tableau 2 ou le tableau 4 ?
Ou est-ce que ces deux types de conditions s'excluent ?
Si je comprends bien la question, les lignes comportant un "a" peuvent effectivement avoir un code en P ou en R, en plus du code en E. Elles se retrouveront donc également dans les tableaux en 3 et 4.
Par contre, elles n apparaîtront pas dans le tableau 2, car celui-ci comportera uniquement le code en R, ce qui implique que la colonne "a" sera systématiquement vide
Bon ! Ce ne sera pas vraiment le top, dans la mesure où tes tableaux sont tous composés différemments, et où je n'ai pas voulu diversifié les méthodes pour chacun, de façon qu'on continue de s'y retrouver par la suite. Ils sont donc composés élément par élément. J'ai ajouté un peu de mise en forme : centrage de la ligne d'en-tête, centrage des colonnes centrées sur le tableau source, bordures.
Pas encore testé, mais maintenant je ferai ça après manger. Je peux te livre le code si tu veux l'examiner, j'ai placé quelques commentaires-balises pour distinguer les différentes parties. Mais je ne conseille pas de l'utiliser tant que le débogage initial n'est pas fait...
Sub Tableaux()
Dim Tbl1(), Tbl2(), Tbl3(), Tbl4(), Et(1 To 4), TbS, i%, j%, a%, r%, p%
'Mise en place des en-têtes des 4 tableaux
Et(1) = Array("Niveau", "Local", "Description", "Urgence")
Et(2) = Array("Niveau", "Local", "Description")
Et(3) = Array("Code", "Photo 1", "Photo 2", "Localisation", "Remarque")
Et(4) = "localisation prélèvement"
ReDim Tbl1(3, 0)
For i = 0 To UBound(Et(1))
Tbl1(i, 0) = Et(1)(i)
Next i
ReDim Tbl2(2, 0)
For i = 0 To UBound(Et(2))
Tbl2(i, 0) = Et(2)(i)
Next i
ReDim Tbl3(5, 0)
For i = 0 To UBound(Et(3))
Tbl3(i, 0) = Et(3)(i)
Next i
ReDim Tbl4(0, 0): Tbl4(0, 0) = Et(4)
'Récupération tableau source, constitution tableaux selon conditions
TbS = ActiveSheet.Range("A1").CurrentRegion
For i = 2 To UBound(TbS)
If TbS(i, 7) = "a" Then
a = a + 1: ReDim Preserve Tbl1(3, a): ReDim Preserve Tbl3(5, a)
Tbl1(0, a) = TbS(i, 1): Tbl1(1, a) = TbS(i, 2)
Tbl1(2, a) = TbS(i, 4) & ", " & TbS(i, 10): Tbl1(3, a) = TbS(i, 9)
Tbl3(0, a) = TbS(i, 3): Tbl3(3, a) = TbS(i, 1) & ", " & TbS(i, 2)
Tbl3(4, a) = TbS(i, 10): Tbl3(5, a) = TbS(i, 4)
End If
If TbS(i, 3) Like "R*" Then
r = r + 1: ReDim Preserve Tbl2(2, r)
Tbl2(0, r) = TbS(i, 1): Tbl2(1, r) = TbS(i, 2)
Tbl2(2, r) = TbS(i, 3) & ", " & TbS(i, 4) & ", " & TbS(i, 5)
ElseIf TbS(i, 3) Like "P*" Then
p = p + 1: ReDim Preserve Tbl4(0, p)
Tbl4(0, p) = TbS(i, 3) & Chr(10) & TbS(i, 1) & Chr(10) & TbS(i, 2) _
& Chr(10) & TbS(i, 4)
End If
Next i
'Tableau 1
Application.ScreenUpdating = False
With Worksheets.Add
.Name = "Tableau 1"
With .Range("A1").Resize(a + 1, 4)
.Value = WorksheetFunction.Transpose(Tbl1)
.WrapText = True
.Rows(1).HorizontalAlignment = xlCenter
If a > 0 Then
.Columns(1).HorizontalAlignment = xlCenter
.Columns(4).HorizontalAlignment = xlCenter
.Rows("2:" & a + 1).Borders.Weight = xlMedium
End If
End With
End With
'Tableau 2
With Worksheets.Add
.Name = "Tableau 2"
With .Range("A1").Resize(r + 1, 3)
.Value = WorksheetFunction.Transpose(Tbl2)
.WrapText = True
.Rows(1).HorizontalAlignment = xlCenter
If r > 0 Then
.Columns(1).HorizontalAlignment = xlCenter
.Rows("2:" & r + 1).Borders.Weight = xlMedium
End If
End With
End With
'Tableau 3
With Worksheets.Add
.Name = "Tableau 3"
With .Range("A1").Resize(a + 1, 6)
.Value = WorksheetFunction.Transpose(Tbl3)
.WrapText = True
.Rows(1).HorizontalAlignment = xlCenter
If a > 0 Then
.Sort key1:=.Cells(1, 6), order1:=xlAscending, Header:=xlYes 'Tri
.Columns(6).Delete xlShiftToLeft 'Suppression colonne critère tri
.Columns(1).HorizontalAlignment = xlCenter
End If
End With
If a > 0 Then .Range("A2").Resize(a + 1, 5).Borders.Weight = xlMedium
End With
'Tableau 4
With Worksheets.Add
.Name = "Tableau 4"
With .Range("A1").Resize(p + 1, 1)
.Value = WorksheetFunction.Transpose(Tbl4)
.WrapText = True
.Rows(1).HorizontalAlignment = xlCenter
If p > 0 Then .Rows("2:" & p + 1).Borders.Weight = xlMedium
End With
End With
Worksheets(1).Activate
End SubA suivre.
Je comprends vaguement le fonctionnement, mais ça reste un peu du chinois pour moi, malgré tout 😉
Merci pour le boulot !
Si j ai bien compris je peux pas l utiliser comme tel ?
En tout cas, no stress. Je retourne au boulot que lundi et n aurait pas énormément de temps pour regarder ca avant. En tout cas, merci encore !
Julien