Récupération de tables à partir d'un tableau
Bonjour,
J'ai une situation pour laquelle je me dis qu'il doit exister un moyen simple que je ne connais pas de faire la manipulation dont j'ai besoin : Je dispose d'un tableau de valeurs (avec des entêtes de colonnes et de lignes avec une valeur à chaque intersection). Je souhaite retrouver une liste de lignes définissant ce tableau. En quelque sorte je souhaite réaliser l'opération inverse d'une tableau croisé dynamique.
Voir l'exemple joint.
Merci d'avance pour toutes les astuces que vous pourrez m'indiquer.
Cordialement,
Bonjour Stormbringer,
Je pense que j'ai ce qu'il te faut. Pour cela, j'ai besoin de l'onglet "Entrée" pour les données d'entrée et de l'onglet "Sortie" pour les données de sortie.
J'ai écrit pour cela la macro suivante :
Sub Détail()
Dim L As Currency, C As Currency, C1 As Currency, Ligne As Currency
Dim LigCoinHautGauche As Currency, ColCoinHautGauche As Currency
Dim LigCoinBasGauche As Currency, ColCoinBasGauche As Currency
Dim LigCoinBasDroite As Currency, ColCoinBasDroite As Currency
Dim LigCoinHautDroite As Currency, ColCoinHautDroite As Currency
'Définition du plus petit rectangle contenant l'ensemble des données d'entrées (y compris celles qui ont été effacées !!!)
'=========================================================================================================================
Sheets("Entrée").Select
Application.ReferenceStyle = xlR1C1 'Les colonnes sont notées 1, 2, 3
ActiveSheet.UsedRange.Select
'Coin haut gauche
'----------------
Cells(ActiveSheet.UsedRange.Row, ActiveSheet.UsedRange.Column).Select
LigCoinHautGauche = ActiveSheet.UsedRange.Row + 2
ColCoinHautGauche = ActiveSheet.UsedRange.Column
'Coin bas gauche
'---------------
Cells(ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row, ActiveSheet.UsedRange.Column).Select
LigCoinBasGauche = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
ColCoinBasGauche = ActiveSheet.UsedRange.Column
'Coin bas droite
'---------------
Cells(ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row, ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column).Select
LigCoinBasDroite = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
ColCoinBasDroite = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
'Coin haut droite
'----------------
Cells(ActiveSheet.UsedRange.Row, ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column).Select
LigCoinHautDroite = ActiveSheet.UsedRange.Row + 2
ColCoinHautDroite = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
Application.ReferenceStyle = xlA1 'les colonnes sont notées A, B, C ....
'Enregistrement des données d'entrée dans une table interne
'==========================================================
ReDim données(LigCoinBasGauche, ColCoinBasDroite) As Variant
For L = LigCoinHautGauche To LigCoinBasGauche
For C = ColCoinHautGauche To ColCoinBasDroite
données(L, C) = Cells(L, C)
Next C
Next L
'Ecriture des données en sortie
'==============================
Sheets("Sortie").Select
Cells.ClearContents
'1ère ligne de titre
'-------------------
Cells(8, 1) = "Données de sortie"
Range("A8:c8").HorizontalAlignment = xlCenterAcrossSelection
'2e ligne de titres
'------------------
Cells(10, 1) = "Ligne"
Cells(10, 2) = "Colonne"
Cells(10, 3) = "Valeur"
'Mise en place des lignes détail
'-------------------------------
Ligne = 10
L = 3
Do While L < LigCoinBasGauche
C = ColCoinHautGauche
L = L + 1
Do While C < ColCoinBasDroite
C = C + 1
If données(L, C) <> "" Then
Ligne = Ligne + 1
Cells(Ligne, 1) = données(L, 1)
Cells(Ligne, 2) = données(3, C)
Cells(Ligne, 3) = données(L, C)
End If
Loop
Loop
'Suppression des lignes inutiles
'-------------------------------
Rows("1:7").Select
Selection.Delete Shift:=xlUp
Range("A1").Select
End Sub
Bonjour,
Une tentative avec formules matricielles.
Les différentes plages sont nommées avec la fonction DECALER pour pouvoir s'adapter à l'évolution du tableau.
Pour les n° de lignes :
=SI(LIGNES($1:1)>NBVAL(tablo);"";INDEX(nom_lignes;PETITE.VALEUR(SI(tablo<>"";(tablo<>"")*LIGNE(nom_lignes));LIGNES($1:1))-3))Formule matricielle à valider par CTRL + MAJ + ENTREE
Pour les n° de colonnes :
=SI(LIGNES($1:1)>NBVAL(tablo);"";INDEX(nom_colonnes;MOD(PETITE.VALEUR(SI(tablo<>"";(tablo<>"")*LIGNE(nom_lignes)+COLONNE(nom_colonnes)/100);LIGNES($1:1));1)*100-1))Formule matricielle à valider par CTRL + MAJ + ENTREE
Pour les valeurs du tableau :
=SI(LIGNES($1:1)>NBVAL(tablo);"";INDEX(tablo;EQUIV($A26;nom_lignes;0);EQUIV($B26;nom_colonnes;0)))Le plus simple est de tester avec le fichier joint
@+
Bonjour,
Je vous remercie beaucoup pour ces réponses. J'avoue que je m'attendais à ce qu'une fonction toute faite existe sur Excel, mais je vois que ce n'est pas le cas, et vos réponses sont très complètes je vous en remercie.
J'avais posé ma question sans me présenter un minimum, je vais donc essayer de réparrer cette erreur. Je suis donc nouvellement arrivé sur le forum. Je ne suis pas un utilisateur assidu d'Excel, mais plutot un utilisateur du dimanche. Je touche un peu aux macros, en utilisant beaucoup la fonction enregistrement, ce qui me permet de mieux comprendre VBA mais sans pouvoir aller très loin. Et comme vous l'aurez compris je ne maitrise pas bien les formules matricielles.
Encore merci et à bientôt.
Stormbringer