XL 2019 création macro : remplissage automatique tableau à partir de données

alorent

XLDnaute Nouveau
Bonjour à tous,
Voici un exemple avec données factices pour expliquer mon prb :
Variable 1Variable 2Variable 3
Individu 1610
Individu 2203
J'aimerais obtenir grâce à une macro j'imagine :
Variable en première positionVariable en deuxième positionVariable en troisième position
Individu 1Variable 2Variable 1Variable 3
Individu 2Variable 1Variable 3Variable 2
Je le fais avec des formules excel jusqu'ici mais c'est long, j'ai bcp de lignes... Pourriez-vous m'aider s'il vous plait ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Alorent,
Même avec beaucoup de lignes, cela peut être rapide, avec :
VB:
=SIERREUR(INDEX($B$1:$D$1;EQUIV(GRANDE.VALEUR($B2:$D2;J$1);$B2:$D2;0));"")
Essayez avec cette PJ de 1000 lignes. Quand vous modifiez un nombre l'actualisation est immédiate.
Le tableau d'entrée est en feuille Entrée, la sortie en ... Sortie.
La nécessité de recopier le tableau est d'éviter les exæquo avec l'ajout d'un petit offset sur chaque valeur.
 

Pièces jointes

  • Alorent2.xlsx
    129.8 KB · Affichages: 13
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
For the fun ! :)
Une version VBA. Ne nécessite pas de colonnes supplémentaires.
Temps de traitement sur mon PC pour 1000 lignes 70ms. Ce qui me semble acceptable.
VB:
Sub Transfert()
Dim DL%, L%, i%, j%, tablo(), tablo2(), Nom(), T0
T0 = Timer
Application.ScreenUpdating = False
DL = Range("A65500").End(xlUp).Row
tablo = Range("A1:D" & DL)
ReDim tablo2(DL, 3)
ReDim Nom(4)
For L = 2 To UBound(tablo)
    Nom(2) = Cells(1, 2): Nom(3) = Cells(1, 3): Nom(4) = Cells(1, 4)
    For i = 2 To 4
        For j = 2 To 4
            If tablo(L, i) > tablo(L, j) Then
                buffer1 = tablo(L, j): buffer2 = Nom(j)
                tablo(L, j) = tablo(L, i): Nom(j) = Nom(i)
                tablo(L, i) = buffer1: Nom(i) = buffer2
            End If
        Next j
    Next i
    tablo2(L - 2, 0) = tablo(L, 1)
    For i = 1 To 3
        tablo2(L - 2, i) = Nom(i + 1)
    Next i
Next L
Range("$F$2").Resize(DL, 4) = tablo2
[E4] = "Temps de transfert : " & Round(1000 * (Timer - T0)) & "ms."
End Sub
 

Pièces jointes

  • Alorent3.xlsm
    70.7 KB · Affichages: 4

Discussions similaires

Réponses
7
Affichages
349

Statistiques des forums

Discussions
312 215
Messages
2 086 328
Membres
103 180
dernier inscrit
Vcr