J'essaie de formater un tableau dans ma feuille Excel. Le goel fait plutôt le contraire d'un SUMIF
, pour chaque élément de ma table et son numéro x
, j'aimerais créer des x
lignes de cet élément dans une autre table. Comme une capture d'écran peut être plus explicite qu'une longue boîte de dialog, voici ce que je veux réaliser:
En cas d'apparition du fruit, il ne doit pas être affiché dans la table GOAL
.
Les arrays Base
et Goal
sont écrits dans ma feuille excel et servent d'exemple, la table Current Result
est faite avec cette formule:
Version française (j'utilise un Excel français):
{=SIERREUR( INDEX( B$5:B$100; PETITE.VALEUR( SI( SI( ($C$5:$C$100>0); VRAI; FAUX ); LIGNE(B$5:B$100)-LIGNE(B$5)+1 ); LIGNES(B$5:B5) ) ); "" )}
Version anglaise (ne l'avez pas testé):
{=IFERROR( INDEX( B$5:B$100; SMALL( IF( IF( ($C$5:$C$100>0); TRUE; FALSE ); ROW(B$5:B$100)-ROW(B$5)+1 ); ROWS(B$5:B5) ) ); "" )}
Pouvez-vous me donner des indications sur la façon dont je pourrais réaliser cela? Je n'y ai aucun moyen de le faire sans utiliser VBA et seulement des formules?
Note: On m'a demandé de faire cela au travail, je n'ai jamais utilisé Excel dans toute ma vie et je ne connais rien de VBA. C'est pourquoi je suis un peu perdu avec cette tâche. J'ai généralement codé en Python ou C ++. J'utilise Excel 2010.
J'ai réussi à atteindre mon objective en utilisant VBA, voici le code que j'ai utilisé:
Public Sub GenerateTable() ' This routing will copy rows based on the quantity to a new sheet. Dim rngSinglecell As Range Dim rngQuantityCells As Range Dim intCount As Integer Dim countCell As Integer ' Set this for the range where the Quantity column exists. This works only if there are no empty cells Set rngQuantityCells = Sheets("Feuil3").Range("C5", Sheets("Feuil3").Range("C5").End(xlDown)) countCell = 4 For Each rngSinglecell In rngQuantityCells ' Check if this cell actually contains a number If IsNumeric(rngSinglecell.Value) Then ' Check if the number is greater than 0 If rngSinglecell.Value > 0 Then ' Copy this row as many times as .value For intCount = 1 To rngSinglecell.Value ' Copy the row into the next emtpy row in sheet2 countCell = countCell + 1 Intersect(Range(rngSinglecell.Address).EntireRow, Columns("B:D")).Copy Destination:=Sheets("Feuil3").Range("G" & CStr(countCell)) Next End If End If Next End Sub
Et voici la sortie:
Solution basée sur la réponse de Matt en double .