Afficher plusieurs données dans une cellule

Bonjour,

Premier post sur le forum, après recherche je n'ai pas trouvé de sujet similaire, je me permets d'ouvrir un topic pour le coup.

Ci joint, vous trouverez un fichier d'exemple avec la mise en forme des données qui m'est imposée.

Contexte:

Je dispose de données qui représentent le % d'un type de défaut ( appelé Rc ici) par rapport un numéro de couche ( C1,C2,..., C12) et par rapport à un numéro de coupe ( Coupe 1,..., Coupe 4).

Ces données sont fournies sur une ligne et pour une ligne correspond à une pièce.

Je me retrouve avec des colonnes se succédant sous la forme:

C1 Coupe 1 Rc/ C2 Coupe 1 Rc/.... / C12 Coupe 1 Rc/ C1 Coupe 2 Rc/..../ C12 Coupe 4 Rc

Ce format m'est imposé par le document le document que j'utilise.

Besoin:

Afin d'établir un indicateur de performance de la pièce, il faudrait que je puisse faire remonter les informations suivantes:

- Pour chaque coupe ( Coupe 1, ..., Coupe 4), afficher dans une case les couches ( C1, ..., C12) qui présente un % compris entre 30 et 50 % :

Par ex: Si Coupe 1 C1 = 35, Coupe 1 C2 = 12, Coupe 1 C3 = 45, Coupe 1 C4 = 55

La cellule de la colonne Coupe 1 devra afficher: C1; C3

- Une fois que l'on a identifié les couches à problème, j'aimerais faire une case synthèse pour la pièce ou j'afficherais les informations suivantes:

Coupe 1: les couches Ci avec le défaut

Coupe 2: les couches Ci avec le défaut

Coupe 3: les couches Ci avec le défaut

Coupe 4: les couches Ci avec le défaut

Etant encore un novice sur Excel, je ne sais pas s'il est possible de réaliser ce genre d'opération. Mes compétences en macro et VBA sont proches du néant ( à mon grand regret). Je dispose de quelques base de C++ lointaines qui pourront m'aider à comprendre une partie du langage Macro ou VBA.

J'ai essayé d'utiliser des boucles SI et des opérateurs ET/OU mais cela demande d'écrire un nombre énorme de conditions imbriquées , cette solution ne me semble pas viable.

Quelqu'un pourrait éclairer ma lanterne sur une fonction ou un bout de code capable de réaliser ce type d'opération ?

S'il y a besoin d'explications supplémentaires, n'hésitez. J'espère avoir été suffisamment clair.

Je remercie d'avance les âmes charitables qui m'aideront, je m'arrache les cheveux depuis quelques jours sur ce genre de problème.

Bonne journée,

Hypno

26exemple.xlsx (10.07 Ko)

Bonjour avec cette macro vous obtenez le résultat suivant, cela vous convient-il ?

Sub rp()
  Feuil2.Cells.Delete
  Dim a, b, f As Worksheet
  Set f = Feuil1
  a = f.UsedRange
  For i = 2 To UBound(a)
    For j = 1 To Feuil1.Cells.SpecialCells(xlCellTypeLastCell).Column
      If a(i, j) >= 30 And a(i, j) <= 50 Then
        With Feuil2
          b = Split(a(1, j), vbLf, , vbTextCompare)
          .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = "Pièce " & i - 1
          .Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = b(0)
          .Cells(Rows.Count, 3).End(xlUp).Offset(1, 0) = b(1)
          .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = b(2)
          .Cells(Rows.Count, 5).End(xlUp).Offset(1, 0) = a(i, j)
        End With
      End If
    Next
  Next
End Sub
sans titre

Bonjour,

Une autre proposition, identique, ou presque à la solution de Machin (que je salue).

Cdlt.

snip 20151109011125

Tout d'abord merci d'avoir pris le temps de répondre à ma question.

Ce n'est pas tout à fait ce que j'avais en tête pour l'affichage, mais ces 2 solutions me plaisent bien car elle génère un tableau dans une autre feuille qui pourra être exploité sous forme de TCD au besoin.

Au final, vos solutions vont plus loin que ce que j'avais en tête, il faut maintenant que je comprenne les syntaxes de vos solutions pour essayer d'adapter ces solutions à mon fichier.

Merci beaucoup pour le temps que vous avez passé sur mon problème! Si jamais je sèche sur l'adaptation du code, je me permettrais de refaire appel à vous ( si cela ne pose pas de problème).

Je vois pour tester cette solution sur mon fichier et je ferais la cloture du topic si j'arrive à un résultat concluant.

Le mieux c'est de présenter un fichier au reflet exact de l'original afin que la/les macros puissent être personnalisées du premier coup, sans qu'il y ait forcément une adaptation à faire

D'accord je ne savais pas qu'il était possible d'avoir des réponses avec une solution "clé en main"! D'où le fait que je souhaite l'adapter pour mon fichier.

J'ai volontairement masquer et vider les cellules "inutile" car cela reste avant tout un document du boulot pour moi.

J'ai mi les colonnes avec les données du tableau qui nous intéresse en vert. (Colonne CDF à CFA)

Si possible j'aimerais remplacer la colonne Pièce i, par les colonnes Sangle et référence ( colonne C et E du fichier). Cela posera t il un problème que ces 2 colonnes ne sont pas "solidaire" du tableau de valeur dont on se sert ? il est possible d'insérer ces colonnes à la suite si besoin.

D'un point de vue compréhension et apprentissage, serait ce trop demandé que d'avoir quelques commentaires sur les lignes de code ? Voulant apprendre à me servir d'Excel (Macro et VBA inclus) cela m'aiderait beaucoup! Cette partie la est vraiment optionnelle!

Les commentaires m'aideraient à dupliquer éventuellement la macro à un autre type de défaut.

Je joins le document "type" sur lequel je vais utiliser la macro.

Merci encore

15exemple-bis.xlsx (231.16 Ko)

Pour les explications...Pour ma part j'en donnerai un peu plus tard car pour le moment il faut arriver à se comprendre et pour vous, vous habituer à être précis. Vous souhaitez afficher les n°de sangle...Pas de problème, mais faut-il enlever quelque chose ? Sur la photo qu'est-ce qu'il faut enlever ou rajouter ? (Pensez que nous sommes extérieur fichier et que nous avons autant de compétences qu'un livreur de pizza face à votre ficher...)

sans titre

Bonjour,

Une nouvelle proposition à tester.

Cdlt.

16exemple-bis.xlsm (233.69 Ko)

edit : pour les commentaires, on verra ton retour.

Machin: Je m'excuse si je n'ai pas été assez précis dans mon explication.

Concernant l'image jointe, la colonne C ( Paramètre 1) n'est plus nécessaire si l'on a les colonnes Références et Sangle. La colonne Paramètre 3, je n'y avais pas pensé mais c'est une information qui peut toujours être utile. Pour répondre au mieux, je dirais que la solution présentée convient très bien, il faudrait juste retirer le Paramètre 1 qui n'apporte pas une information "utile" étant donné que l'on a le N° sangle et la référence pour identifier à quelle pièce appartient le défaut considéré.

La solution proposée me convient très bien comme ca. Merci pour ces réponses rapides et les explications qui vont avec.

Jean Eric: Votre proposition marche très bien aussi. C'est le genre de solution que je cherchais. Merci beaucoup pour cette réponse complémentaire.

Merci beaucoup à vous deux!

Voici le code qu'il faut placer dans votre fichier. J'ai expliqué avec mon langage donc si cela vous semble chinois...C'est normal.

Sub rp()
  Dim a, b, f As Worksheet
'effacer le contenu de la feuille 2
  Feuil2.Cells.Delete
'Ecrire sur la première ligne les entêtes de colonnes de A a F
  Feuil2.Range("A1:F1") = Array("Sangle", "Référence", "Paramètre 1", "Paramètre 2", "Parametre 3", "Pourcentage")
'Désigner que f sera = à la feuil6 soit la feuille nommée "tableau "
  Set f = Feuil6
'Mise en mémoire de la f (donc la feuille tableau) dans un tableau virtuel appelé a
  a = f.UsedRange
'Pour une valeur de i = 4 à la dernière ligne de la feuille virtuelle a
  For i = 4 To UBound(a)
'Pour une valeur de j = 1878 au numéro de la dernière colonne utilisé
    For j = 1878 To f.Cells.SpecialCells(xlCellTypeLastCell).Column
'si dans ma feuille virtuelle a à la position i et j soit (4,1878) qui correspond à la ligne 4 et à la 1878 ieme colonne ma valeur et superieur à 30 et inferieur à 50 alors
      If a(i, j) >= 30 And a(i, j) <= 50 Then
        With Feuil2
'je découpe les informations de la case à l'intersection de la ligne 3 et la colonne j (j = 1848) pour y déposer dans un nouveau tableau virtuel
          b = Split(a(3, j), vbLf, , vbTextCompare)
'dans ma première cellule non vide de la feuill2 en colonne A je range la valeur située à l'intersection de la ligne i et de la colonne 3 (on range cette valeur parce qu'elle répond à la condition, si elle n'y répondrai pas, la macro n'aurai pas lu ses lignes d'instructions)
          .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = a(i, 3)
'idem colonne B
          .Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = a(i, 5)
'idem colonne C sauf qu'ici on va placer la valeur du petit tableau "b" qui fait référence à la cellule de la ligne 3 avec les coupes et les faces...
          .Cells(Rows.Count, 3).End(xlUp).Offset(1, 0) = b(0)
          .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = b(1)
          .Cells(Rows.Count, 5).End(xlUp).Offset(1, 0) = b(2)
          .Cells(Rows.Count, 6).End(xlUp).Offset(1, 0) = Round(a(i, j), 2)
        End With
      End If
    Next
  Next
set f = Nothing
End Sub

Les "next" servent à incrémenter les valeur de i et de j à chaque tour de façon explorer les lignes une à une

Merci pour les commentaires sur les lignes de code. Je comprends un peu mieux la macro maintenant même si certaines subtilités m'échappent mais cela est du à mon manque de formation sur Excel. Après lecture des explications, je peux affirmer qu'écrire cette macro seul était hors de mes compétences actuelles! Mais ca me motive pour apprendre à me servir d'Excel et rendre la pareil

Cela m'enlève une belle épine du pied. Merci!

Faux ! Ce n'est pas hors de vos compétences. Vos compétences sont indépendantes du savoir (et fort heureusement) car in fine...Vba c'est comme les mathématiques, il suffit de connaître ,d'appliquer et de s'appliquer...

Disons qu'au jour d'aujourd'hui je n'en ai pas vu suffisamment pour réaliser ce code tout seul, c'est un simple constat. Rien de décourageant pour moi, il faut bien commencer un jour.

Mais comme vous le dites si bien, il ne me reste plus qu'à apprendre, appliquer et m'appliquer. Je commencerais par les bases plutôt qu'un code comme celui que je viens de voir car trop de notions m'échappent encore.

Rechercher des sujets similaires à "afficher donnees"