XL 2013 Recopier entêtes avec valeurs (formule matricielle)

jay72000

XLDnaute Nouveau
Bonjour amis passionnés,

Mon point bloquant, je cherche a adapter une formule matricielle.
La formule me supprime bien les valeurs vide de la ligne, le problème est que j'aimerais récupérer les entêtes de ligne associées a ces valeurs ?

Comment faire aussi pour la formule matricielle ne récupère que les chiffres surtout pas de lettre ?
Des fois il y a des initiales mais la formule doit considérer la case vide.
Enfin si on étire la formule comment ne pas avoir de formule d'erreur.

Une idée

Je vous transmets mon fichier

Merci beaucoup
 

Pièces jointes

  • Formule matricielle 3.xls
    24.5 KB · Affichages: 11
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Jay, bonjour le forum,

Par formule je ne sais pas faire. Un proposition VBA si ça peut t'intéresser :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Set O = Worksheets("BASE") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
O.Range("D12:H13").ClearContents 'efface les ancienne données
K = 1 'initialise la variable K
For COL = 2 To UBound(TV, 2) 'boucle sur toutes les colonnes COL du tableau des valeurs TV (en partant de la secodne)
    If TV(2, COL) <> 0 And IsNumeric(TV(2, COL)) = True Then 'condition : si la donnée ligne 2 colonne COL de TV n'est pas nulle
        ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (2 lignes, K colonnes)
        TL(1, K) = TV(1, COL) 'récupère l'entête dans la ligne 1 de TL
        TL(2, K) = TV(2, COL) 'récupère la valeur dans la ligne 2 de TL
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
Next COL 'prochaine colonne de la boucle
'si K est supérieure à 1, renvoie le tableau TL dans la cellule D12 redimensionnée
If K > 1 Then O.Range("D12").Resize(2, K - 1).Value = TL
End Sub
 

jay72000

XLDnaute Nouveau
Bonjour Jay, bonjour le forum,

Par formule je ne sais pas faire. Un proposition VBA si ça peut t'intéresser :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Set O = Worksheets("BASE") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
O.Range("D12:H13").ClearContents 'efface les ancienne données
K = 1 'initialise la variable K
For COL = 2 To UBound(TV, 2) 'boucle sur toutes les colonnes COL du tableau des valeurs TV (en partant de la secodne)
    If TV(2, COL) <> 0 And IsNumeric(TV(2, COL)) = True Then 'condition : si la donnée ligne 2 colonne COL de TV n'est pas nulle
        ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (2 lignes, K colonnes)
        TL(1, K) = TV(1, COL) 'récupère l'entête dans la ligne 1 de TL
        TL(2, K) = TV(2, COL) 'récupère la valeur dans la ligne 2 de TL
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
Next COL 'prochaine colonne de la boucle
'si K est supérieure à 1, renvoie le tableau TL dans la cellule D12 redimensionnée
If K > 1 Then O.Range("D12").Resize(2, K - 1).Value = TL
End Sub



Merci Robert, je ne l'avais pas envisagé.
Pour le coup de je viens d'essayer avec ton code cela fonctionne tres bien.
Petite demande je viens de rajouter une ligne, est ce que tu peux modifier la macro qu'elle fonctionne de la même manière mais que tu reprennes les entêtes associées.
Peux tu afficher le résultat dans l'onglet résultats.

Un grand merci
 

Pièces jointes

  • Formule matricielle 3 avec macro.xlsm
    16 KB · Affichages: 3

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Le code adapté :

VB:
Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim COL As Integer 'déclare la variable COL (Incrément)
Dim KT As Integer 'déclare la variable KT (incrément)
Dim KB As Integer 'déclare la variable KB (incrément)
Dim TLT() As Variant 'déclare la variable TLT (Tableau des Lignes Tapis)
Dim TLB() As Variant 'déclare la variable TLB (Tableau des Lignes Bulles)

Set OS = Worksheets("BASE") 'définit l'onglet OS
Set OD = Worksheets("RESULTATS") 'définit l'onglet OD
TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
OD.Columns("B:Y").ClearContents 'efface les ancienne données
KT = 1 'initialise la variable KT
KB = 1 'initialise la variable KB
For COL = 2 To UBound(TV, 2) 'boucle sur toutes les colonnes COL du tableau des valeurs TV (en partant de la secodne)
    If TV(2, COL) <> 0 And IsNumeric(TV(2, COL)) = True Then 'condition : si la donnée ligne 2 colonne COL de TV n'est pas nulle
        ReDim Preserve TLT(1 To 2, 1 To KT) 'redimensionne le tableau des lignes TLT (2 lignes, KT colonnes)
        TLT(1, KT) = TV(1, COL) 'récupère l'entête dans la ligne 1 de TLT
        TLT(2, KT) = TV(2, COL) 'récupère la valeur dans la ligne 2 de TLT
        KT = KT + 1 'incrémente KT (ajoute une colonne au tableau des lignes TLT)
    End If 'fin de la condition
    If TV(3, COL) <> 0 And IsNumeric(TV(3, COL)) = True Then 'condition : si la donnée ligne 3 colonne COL de TV n'est pas nulle
        ReDim Preserve TLB(1 To 2, 1 To KB) 'redimensionne le tableau des lignes TLB (2 lignes, KB colonnes)
        TLB(1, KB) = TV(1, COL) 'récupère l'entête dans la ligne 1 de TLB
        TLB(2, KB) = TV(3, COL) 'récupère la valeur dans la ligne 2 de TLB
        KB = KB + 1 'incrémente KB (ajoute une colonne au tableau des lignes TLB)
    End If 'fin de la condition
Next COL 'prochaine colonne de la boucle
'si KT est supérieure à 1, renvoie le tableau TLT dans la cellule B2 redimensionnée
If KT > 1 Then OD.Range("B2").Resize(2, KT - 1).Value = TLT
'si KB est supérieure à 1, renvoie le tableau TLB dans la cellule B4 redimensionnée
If KB > 1 Then OD.Range("B4").Resize(2, KB - 1).Value = TLB
End Sub
 

jay72000

XLDnaute Nouveau
Merci robert le code marche très bien.
J'essai maintenant de l'adapter a mon fichier original.
Il y a 2 lignes vides entre les semaines et les valeurs d'audit.
J'ai donc donc essayé de modifier le code mais j'ai un message d'erreur
Je cherchais donc a décaler de la 2 ème à la 4 ème ligne , j'ai remplacé les valeurs 2 par 4 mais j'ai une erreur à cette ligne du code :

If TV(4, COL) <> 0 And IsNumeric(TV(4, COL)) = True Then 'condition : si la donnée ligne 2 colonne COL de TV n'est pas nulle

Pouvez vous m'expliquer, merci
 

Pièces jointes

  • Formule matricielle 3 avec macro2.xlsm
    25.1 KB · Affichages: 2

Discussions similaires

Réponses
2
Affichages
336

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 214
Membres
103 158
dernier inscrit
laufin