Transpose avec condition
Bonjour à tous,
pour mon premier contact avec le forum
je vous soumets un sujet qui circule mais dont les solutions
proposées ne m'ont pas permis de résoudre mon projet
(sans doute à cause de mon ignorance)
des propositions en VBA ou en formules me conviennent
un grand merci par avance de vous intéresser à mon sujet
j'ai un fichier 2 colonnes
Col A (Noms 12000 lignes) col B (10 Critères répartis sur les 12000 lignes)
je souhaiterai repartir les critères par nom (1 critère par colonne)
les critères manquants sont remplacés par '--
merci pour ta réponse Thihii
mais non
il faut que chaque info soit distribuée dans une colonne unique
et par nom
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Ci-joint une proposition à tester, en VBA.
Quelques précisions :
- le nom est déterminé quand la colonne "A" est identique à la colonne "B" (contrairement aux autres infos, pas de "Nom :")
- les infos d'une même société doivent être à la suite dans le premier onglet
- pour déterminer la colonne où on écrit le résultat, se base sur le "titre" de la colonne "B" (ex : "Code postal :")
- si la colonne n'existe pas, on ajoute une nouvelle colonne dans l'onglet final
Bonne soirée
Bouben
Bonsoir à tous,
A tester, n'oublie pas de créer la feuille de restitution.
Option Explicit
Sub test()
Dim a, b(), i As Long, n As Long, t As Long, dico As Object, x
Set dico = CreateObject("Scripting.Dictionary")
a = Sheets("Transpose").Range("a1").CurrentRegion.Value
ReDim b(1 To UBound(a, 1), 1 To UBound(a, 1))
n = 1: t = 1: b(1, 1) = "Nom"
With CreateObject("Scripting.Dictionary")
For i = 2 To UBound(a, 1)
If Not dico.exists(a(i, 1)) Then
n = n + 1: dico(a(i, 1)) = n
b(n, 1) = a(i, 1)
End If
If a(i, 2) Like "*:*" Then
x = Split(a(i, 2), ":")
x(0) = Trim$(x(0))
If Not .exists(x(0)) Then
t = t + 1: .Item(x(0)) = t
b(1, t) = x(0)
End If
b(dico(a(i, 1)), .Item(x(0))) = a(i, 2)
End If
Next
End With
Application.ScreenUpdating = False
'restitution et mise en forme
With Sheets("Feuil1")
.Cells.Clear
With .Cells(1).Resize(n, t)
.Value = b
.Font.Name = "calibri"
.Font.Size = 10
.VerticalAlignment = xlCenter
.BorderAround Weight:=xlThin
.Borders(xlInsideVertical).Weight = xlThin
On Error Resume Next
With .SpecialCells(4)
.Value = " - "
.HorizontalAlignment = xlCenter
End With
On Error GoTo 0
With .Rows(1)
.BorderAround Weight:=xlThin
.HorizontalAlignment = xlCenter
.Interior.ColorIndex = 40
.Font.Size = 11
End With
.Columns.AutoFit
.Columns(1).ColumnWidth = 11
End With
.Activate
End With
Application.ScreenUpdating = True
End Sub
klin89
Bonjour Klin89
merci de la rapidité de la réponse
super travail
ça répond à ma demande
cependant dans le code tu t’appuies sur les ":" pour la recherche
ce qui a pour effet complémentaire de supprimer
tout ce qu'il y a derrière http ou https dans le résultat
est il possible de remédier à ça
je comprend dans les grandes lignes, grâce à tes commentaires dans le code
mais je suis incapable d'amener les modifications souhaitables
Bonjour
laucsap a écrit :cependant dans le code tu t’appuies sur les ":" pour la recherche
En vue de ta présentation je pense que c est une manière peu complexe et la plus rapide
Bien sur il existe autre vérification (prise en compte : faute des frappes, espaces entres les mots, oublier de : , … ect) et ca rende le code encore plus complexe
Alors si toutes les autre titre des infos sont précédé par une ":" essayer ca :
AMIR a écrit :Bonjour
laucsap a écrit :cependant dans le code tu t’appuies sur les ":" pour la recherche
En vue de ta présentation je pense que c est une manière peu complexe et la plus rapide
Bien sur il existe autre vérification (prise en compte : faute des frappes, espaces entres les mots, oublier de : , … ect) et ca rende le code encore plus complexe
Alors si toutes les autre titre des infos sont précédé par une ":" essayer ca :
Merci Amir ta solution fonctionne parfaitement
bien sur avec les restrictions que tu as décrites
je vais d'abord faire un peu de ménage dans ma base
standardiser les syntaxes des différentes colonnes et cellules
et rajouter une boucle pour ne pas avoir à appuyer 6800 fois sur le bouton bleu
encore Merci
bouben a écrit :Bonsoir,
Ci-joint une proposition à tester, en VBA.
Quelques précisions :
- le nom est déterminé quand la colonne "A" est identique à la colonne "B" (contrairement aux autres infos, pas de "Nom :")
- les infos d'une même société doivent être à la suite dans le premier onglet
- pour déterminer la colonne où on écrit le résultat, se base sur le "titre" de la colonne "B" (ex : "Code postal :")
- si la colonne n'existe pas, on ajoute une nouvelle colonne dans l'onglet final
Bonne soirée
Bouben
bouben a écrit :Bonsoir,
Ci-joint une proposition à tester, en VBA.
Quelques précisions :
- le nom est déterminé quand la colonne "A" est identique à la colonne "B" (contrairement aux autres infos, pas de "Nom :")
- les infos d'une même société doivent être à la suite dans le premier onglet
- pour déterminer la colonne où on écrit le résultat, se base sur le "titre" de la colonne "B" (ex : "Code postal :")
- si la colonne n'existe pas, on ajoute une nouvelle colonne dans l'onglet final
Bonne soirée
Bouben
Merci Bouben
j'ai dégrossi mes 73000 lignes à traiter grâce à ton code
sur lequel je reviendrai pour l'analyser plus en détail et le comprendre mieux