Recherche de valeurs dans plusieurs colonnes

Fermé
Qoods - 15 juin 2016 à 12:13
 Qoods - 16 juin 2016 à 22:01
Bonjour à tous,

Je voudrais gagner un temps fou en recherche et j'ai besoin de vous.

J'ai 34 colonnes dont leur contenu est un ensemble de champs mais tous les champs ne sont pas forcément présents dans chaque colonne.

Admettons les champs suivants : 1, 2, 3, 4, 5, 6, 7
Admettons les colonnes avec les noms suivants : A, B, C, D
(Je mets des points pour combler les vides)
Exemple :
A B C D
---------
1 3 1 3
2 2 5 5
3 .. 7
4
5

Je voudrais savoir s'il était possible de transposer l'affichage de façon à avoir les champs qui passent en tête de colonne et les noms des colonnes qui passent en valeurs ?

Exemple :
1 2 3 4 5 6 7
---------------
A A A A A . C
C B B .. C .
.. .. D . D .


Merci d'avance

1 réponse

thev Messages postés 1883 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 6 novembre 2024 691
Modifié par thev le 15/06/2016 à 23:16
Bonsoir,

Je pense que ce code VBA devrait répondre au problème (avec ce code, il faut ajouter la référence Microsoft scripting runtime)


' Ajouter la référence Microsoft scripting runtime
Sub transposer_noms()

Dim champs As New Dictionary
Dim champ As Object
Dim début_champs, plage, plage_noms, plage_champs As Range
Dim i, c As Integer
Dim clé As Variant
Dim noms() As String

Set début_champs = [A1]
Set plage_utilisée = ActiveSheet.UsedRange
Set plage_noms = plage_utilisée.Rows(1) 'noms : en ligne 1 '
Set plage_champs = plage_utilisée.Offset(1).Resize(plage_utilisée.Rows.Count - 1) 'champs : des lignes 2 à la dernière utilisée

'ajout des champs en clé avec pour chaque clé le tableau des noms associés
i = 0
For Each champ In plage_champs.Cells

If Not IsEmpty(champ.Value) Then
If Not champs.Exists(champ.Value) Then
ReDim noms(1)
noms(0) = plage_noms.Columns(champ.Column).Value
champs.Add Key:=champ.Value, Item:=noms
Else
noms = champs(champ.Value)
i = UBound(noms)
ReDim Preserve noms(i + 1)
noms(i) = plage_noms.Columns(champ.Column)
champs(champ.Value) = noms
End If
End If

Next

If champs.Count > 0 Then
'initialisation de la nouvelle plage des champs
plage_utilisée.Clear
' remplissage champs de la feuille active à partir de la variable range "début_champs"
début_champs.Resize(, champs.Count).Value = champs.Keys
c = 0
For Each clé In champs.Keys
noms = champs(clé)
début_champs.Offset(1, c).Resize(UBound(noms)).Value = Application.Transpose(noms)
c = c + 1
Next
End If

End Sub



 
0
Merci Thev, j'avais réussi à trouver une solution avec les matrices :)
Bonne journée
0