Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Formule (VBA?) pour convertir plage de cellules en une seule colonne (et un peu plus)

5 réponses
Avatar
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):


Article;GROSSISTE1;GROSSISTE2;GROSSISTE3;GROSSISTE4
CRAYON;C01;CR884;
CANAPE;CAN4;CANTTCUIR;
POELE;;TEFOL57;;TEFLONFLON
STYLO;;;
BATMOBILE;IMBATMAN;;0
AGRAFEUSE;;STAPLES;


Tableau 2 =E0 obtenir:

REFERENCE;Article;Fournisseur
C01;CRAYON;GROSSISTE1
CAN4;CANAPE;GROSSISTE1
IMBATMAN;BATMOBILE;GROSSISTE1
CR884;CRAYON;GROSSISTE2
CANTTCUIR;CANAPE;GROSSISTE2
TEFOL57;POELE;GROSSISTE2
STAPLES;AGRAFEUSE;GROSSISTE2
TEFLONFLON;POELE;GROSSISTE4


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.


D'avance merci.

T.

5 réponses

Avatar
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
Avatar
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

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
Avatar
Thomas Boivin
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.
Avatar
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
'---------------------------------------


MichD
---------------------------------------------------------------
Avatar
Thomas Boivin
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 :
Bonjour,



As-tu essayé comme ceci :