Formule (VBA?) pour convertir plage de cellules en une seule colonne (et un peu plus)
5 réponses
Thomas Boivin
Bonjour,
Je me d=E9patouille depuis quelques temps afin de cr=E9er un fichier excel =
qui puisse faire la liaison entre un stock et les r=E9f=E9rences d'articles=
chez divers fournisseurs (et par extension leurs tarifs) afin de cr=E9er p=
lusieurs tableaux =E0 importer dans un logiciel de compta et que ces tablea=
ux soient tous issus de la m=EAme base et que cette base demande un minimum=
de mise =E0 jour.
J'ai pas mal avanc=E9 sur certains points donc je ne pars pas de z=E9ro mai=
s je cherche =E0 convertir une plage de donn=E9es en une seule colonne qui =
contiendrait les cellules non-vides (ou diff=E9rentes de z=E9ro) de cette p=
lage avec, si possible en bonus sur la colonne suivante, le titre de la col=
onne d'o=F9 est issue cette r=E9f=E9rence, voire m=EAme la valeur qui se tr=
ouve dans une colonne donn=E9e sur la m=EAme ligne (mais pour ce dernier po=
int j'ai d=E9j=E0 la formule et =E7a peut se faire =E0 part m=EAme apr=E8s =
coup). Je me donc suis d'abord plong=E9 dans RechercheV (pas assez puissant=
) puis index/Equiv (rapidement prise de t=EAte) mais avant de me lancer dan=
s un script VBA, je voudrais savoir si c'est possible sans cr=E9er de table=
au interm=E9diaire parce que l=E0, j'en suis venu =E0 cr=E9er un TCD pour c=
haque colonne (une par fournisseurs, et ils sont quelques dizaines) vu qu'i=
l oublie les cellules vides et que pour l'instant, =E7a me permet =EAtre un=
tableau interm=E9diaire plus facile =E0 exploiter que mon tableau de base =
qui occupe all=E8grement ses 50 colonnes X 2000 lignes. Ou alors si je peux=
avoir un TCD un peu pointu qui me fasse le boulot (mais pas juste colonne =
par colonne), je prends tout de suite sauf qu'apr=E8s, il faut encore que =
=E7a me permette de facilement retrouver deux r=E9f=E9rences du tableau san=
s avoir =E0 faire une copie manuelle des cellules non-vides d'une colonne p=
uis faire une formule par colonne fournisseur etc etc. LE but =E9tant de do=
nner un outil, o=F9 on ai juste =E0 renseigner la r=E9f=E9rence produit du =
fournisseur qui correspond =E0 la notre.
En gros, si je peux r=E9sumer l'id=E9e, =E7a donnerait (je donne l'exemple =
en CSV):
Tableau 1 =E0 exploiter (qui liste les r=E9f=E9rences fournisseurs par arti=
cle):
D=E9j=E0, la premi=E8re question c'est "Est-ce-que c'est possible sans cr=
=E9er de script?"
Si c'est non, je veux bien m'incliner et programmer mon bout de script pour=
obtenir ce que je veux, =E7a devrait pas =EAtre trop sorcier non plus. Mai=
s si je peux avoir un peu d'aide sur cette =E9tape, =E7a me faciliterait gr=
andement la vie.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
isabelle
bonjour Thomas,
j'ai présumé que les données sont sur la feuil1 et le résultat est mit sur la feuil2
Sub Macro1() Dim c As Range, i As Integer i = 1 For Each c In Range("B2:E7") If c <> "" Then i = i + 1 Sheets("Feuil2").Cells(i, 1) = c Sheets("Feuil2").Cells(i, 2) = Sheets("Feuil1").Cells(c.Row, 1) Sheets("Feuil2").Cells(i, 3) = Sheets("Feuil1").Cells(1, c.Column) End If Next End Sub
isabelle
bonjour Thomas,
j'ai présumé que les données sont sur la feuil1 et le résultat est mit
sur la feuil2
Sub Macro1()
Dim c As Range, i As Integer
i = 1
For Each c In Range("B2:E7")
If c <> "" Then
i = i + 1
Sheets("Feuil2").Cells(i, 1) = c
Sheets("Feuil2").Cells(i, 2) = Sheets("Feuil1").Cells(c.Row, 1)
Sheets("Feuil2").Cells(i, 3) = Sheets("Feuil1").Cells(1, c.Column)
End If
Next
End Sub
j'ai présumé que les données sont sur la feuil1 et le résultat est mit sur la feuil2
Sub Macro1() Dim c As Range, i As Integer i = 1 For Each c In Range("B2:E7") If c <> "" Then i = i + 1 Sheets("Feuil2").Cells(i, 1) = c Sheets("Feuil2").Cells(i, 2) = Sheets("Feuil1").Cells(c.Row, 1) Sheets("Feuil2").Cells(i, 3) = Sheets("Feuil1").Cells(1, c.Column) End If Next End Sub
isabelle
Thomas Boivin
Merci pour la réponse rapide, je vais tester cette macro, ça me donne d e quoi démarrer. Je pense que j'aurais réussi à sortir ce bout de scr ipt en creusant un peu mais ça me fait vraiment gagner beaucoup de temps. Par contre, j'ajouterai "0" et " " à côté de "", comme ça j'évit erai d'autres cas gênants.
T.
Le vendredi 20 septembre 2013 17:35:45 UTC+2, isabelle a écrit :
bonjour Thomas,
j'ai présumé que les données sont sur la feuil1 et le résultat es t mit
Merci pour la réponse rapide, je vais tester cette macro, ça me donne d e quoi démarrer. Je pense que j'aurais réussi à sortir ce bout de scr ipt en creusant un peu mais ça me fait vraiment gagner beaucoup de temps. Par contre, j'ajouterai "0" et " " à côté de "", comme ça j'évit erai d'autres cas gênants.
T.
Le vendredi 20 septembre 2013 17:35:45 UTC+2, isabelle a écrit :
bonjour Thomas,
j'ai présumé que les données sont sur la feuil1 et le résultat es t mit
Merci pour la réponse rapide, je vais tester cette macro, ça me donne d e quoi démarrer. Je pense que j'aurais réussi à sortir ce bout de scr ipt en creusant un peu mais ça me fait vraiment gagner beaucoup de temps. Par contre, j'ajouterai "0" et " " à côté de "", comme ça j'évit erai d'autres cas gênants.
T.
Le vendredi 20 septembre 2013 17:35:45 UTC+2, isabelle a écrit :
bonjour Thomas,
j'ai présumé que les données sont sur la feuil1 et le résultat es t mit
Alors, j'ai adapté à mon fichier et ça fonctionne comme je le voulais à un détail près : la macro parcourt la table ligne après ligne et j'aimerais la parcourir de colonne en colonne, voici ma tentative de modif ication (à noter que si on enlève la boucle avec le j et ".Columns(j)", la macro fonctionne.
"
Sub Test() ' ' Test Macro
Dim c As Range, i As Integer, j As Integer i = 1 j = 1
For j = 1 To Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns.Count
For Each c In Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns(j) Select Case c Case Is <> "", " ", "'", "0" i = i + 1 Sheets("Test").Cells(i, 1) = Range("CodesStockArticles").Cells(1, c. Column) Sheets("Test").Cells(i, 4) = c Sheets("Test").Cells(i, 5) = Range("CodesStockArticles").Cells(c.Row , 8) End Select Next
Next j
End Sub
"
Je suis sûr que c'est un détail à modifier mais j'ai beau parcourir d ivers forums et sites, je ne trouve pas. J'ai essayé de créer une varia ble contenant le nombre de colonne de ma première sélection ( par ex. n col = Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns.Count ), mais sa ns succès.
Au pire, je ferais un tri après coup.
T.
Alors, j'ai adapté à mon fichier et ça fonctionne comme je le voulais à un détail près : la macro parcourt la table ligne après ligne et j'aimerais la parcourir de colonne en colonne, voici ma tentative de modif ication (à noter que si on enlève la boucle avec le j et ".Columns(j)", la macro fonctionne.
"
Sub Test()
'
' Test Macro
Dim c As Range, i As Integer, j As Integer
i = 1
j = 1
For j = 1 To Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns.Count
For Each c In Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns(j)
Select Case c
Case Is <> "", " ", "'", "0"
i = i + 1
Sheets("Test").Cells(i, 1) = Range("CodesStockArticles").Cells(1, c. Column)
Sheets("Test").Cells(i, 4) = c
Sheets("Test").Cells(i, 5) = Range("CodesStockArticles").Cells(c.Row , 8)
End Select
Next
Next j
End Sub
"
Je suis sûr que c'est un détail à modifier mais j'ai beau parcourir d ivers forums et sites, je ne trouve pas. J'ai essayé de créer une varia ble contenant le nombre de colonne de ma première sélection ( par ex. n col = Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns.Count ), mais sa ns succès.
Alors, j'ai adapté à mon fichier et ça fonctionne comme je le voulais à un détail près : la macro parcourt la table ligne après ligne et j'aimerais la parcourir de colonne en colonne, voici ma tentative de modif ication (à noter que si on enlève la boucle avec le j et ".Columns(j)", la macro fonctionne.
"
Sub Test() ' ' Test Macro
Dim c As Range, i As Integer, j As Integer i = 1 j = 1
For j = 1 To Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns.Count
For Each c In Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns(j) Select Case c Case Is <> "", " ", "'", "0" i = i + 1 Sheets("Test").Cells(i, 1) = Range("CodesStockArticles").Cells(1, c. Column) Sheets("Test").Cells(i, 4) = c Sheets("Test").Cells(i, 5) = Range("CodesStockArticles").Cells(c.Row , 8) End Select Next
Next j
End Sub
"
Je suis sûr que c'est un détail à modifier mais j'ai beau parcourir d ivers forums et sites, je ne trouve pas. J'ai essayé de créer une varia ble contenant le nombre de colonne de ma première sélection ( par ex. n col = Range("CodesArticles[[FOUR01]:[FOUR032]]").Columns.Count ), mais sa ns succès.
Au pire, je ferais un tri après coup.
T.
MichD
Bonjour,
As-tu essayé comme ceci :
'--------------------------------------- Sub Macro1() Dim c As Range, Col As Range, i As Integer i = 1 For Each Col In Range("B2:E7").Columns For Each c In Col.Cells If c <> "" Then i = i + 1 Sheets("Feuil2").Cells(i, 1) = c Sheets("Feuil2").Cells(i, 2) = Sheets("Feuil1").Cells(c.Row, 1) Sheets("Feuil2").Cells(i, 3) = Sheets("Feuil1").Cells(1, c.Column) End If Next Next End Sub '---------------------------------------
'---------------------------------------
Sub Macro1()
Dim c As Range, Col As Range, i As Integer
i = 1
For Each Col In Range("B2:E7").Columns
For Each c In Col.Cells
If c <> "" Then
i = i + 1
Sheets("Feuil2").Cells(i, 1) = c
Sheets("Feuil2").Cells(i, 2) = Sheets("Feuil1").Cells(c.Row, 1)
Sheets("Feuil2").Cells(i, 3) = Sheets("Feuil1").Cells(1,
c.Column)
End If
Next
Next
End Sub
'---------------------------------------
'--------------------------------------- Sub Macro1() Dim c As Range, Col As Range, i As Integer i = 1 For Each Col In Range("B2:E7").Columns For Each c In Col.Cells If c <> "" Then i = i + 1 Sheets("Feuil2").Cells(i, 1) = c Sheets("Feuil2").Cells(i, 2) = Sheets("Feuil1").Cells(c.Row, 1) Sheets("Feuil2").Cells(i, 3) = Sheets("Feuil1").Cells(1, c.Column) End If Next Next End Sub '---------------------------------------
Là j'essayai d'évaluer certaines fonctions matricielles (RECHERCHEV ou INDEX/EQUIV ) que j'utilisais pour remplir d'autres cellules mais je me ren ds compte que je peux utiliser les fonctions Range de façon bien plus pui ssante... :)
Au final, je crois que je vais réussir à créer une macro qui devrait me remplir automatiquement les trois quarts de mon tableau, ce qui n'étai t même pas le but initial. Donc, c'est grâce à vous deux, merci.
T.
Le lundi 23 septembre 2013 14:36:10 UTC+2, MichD a écrit :
Bonjour,
As-tu essayé comme ceci :
Excellent, ça fonctionne. :)
Merci beaucoup.
Là j'essayai d'évaluer certaines fonctions matricielles (RECHERCHEV ou INDEX/EQUIV ) que j'utilisais pour remplir d'autres cellules mais je me ren ds compte que je peux utiliser les fonctions Range de façon bien plus pui ssante... :)
Au final, je crois que je vais réussir à créer une macro qui devrait me remplir automatiquement les trois quarts de mon tableau, ce qui n'étai t même pas le but initial. Donc, c'est grâce à vous deux, merci.
T.
Le lundi 23 septembre 2013 14:36:10 UTC+2, MichD a écrit :
Là j'essayai d'évaluer certaines fonctions matricielles (RECHERCHEV ou INDEX/EQUIV ) que j'utilisais pour remplir d'autres cellules mais je me ren ds compte que je peux utiliser les fonctions Range de façon bien plus pui ssante... :)
Au final, je crois que je vais réussir à créer une macro qui devrait me remplir automatiquement les trois quarts de mon tableau, ce qui n'étai t même pas le but initial. Donc, c'est grâce à vous deux, merci.
T.
Le lundi 23 septembre 2013 14:36:10 UTC+2, MichD a écrit :