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

Bonjour,
Je me dépatouille depuis quelques temps afin de créer un fichier excel =
qui puisse faire la liaison entre un stock et les références d'articles=
chez divers fournisseurs (et par extension leurs tarifs) afin de créer p=
lusieurs tableaux à importer dans un logiciel de compta et que ces tablea=
ux soient tous issus de la même base et que cette base demande un minimum=
de mise à jour.
J'ai pas mal avancé sur certains points donc je ne pars pas de zéro mai=
s je cherche à convertir une plage de données en une seule colonne qui =
contiendrait les cellules non-vides (ou différentes de zéro) de cette p=
lage avec, si possible en bonus sur la colonne suivante, le titre de la col=
onne d'où est issue cette référence, voire même la valeur qui se tr=
ouve dans une colonne donnée sur la même ligne (mais pour ce dernier po=
int j'ai déjà la formule et ça peut se faire à part même après =
coup). Je me donc suis d'abord plongé dans RechercheV (pas assez puissant=
) puis index/Equiv (rapidement prise de tête) mais avant de me lancer dan=
s un script VBA, je voudrais savoir si c'est possible sans créer de table=
au intermédiaire parce que là, j'en suis venu à créer 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, ça me permet être un=
tableau intermédiaire plus facile à exploiter que mon tableau de base =
qui occupe allègrement 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ès, il faut encore que =
ça me permette de facilement retrouver deux références du tableau san=
s avoir à faire une copie manuelle des cellules non-vides d'une colonne p=
uis faire une formule par colonne fournisseur etc etc. LE but étant de do=
nner un outil, où on ai juste à renseigner la référence produit du =
fournisseur qui correspond à la notre.
En gros, si je peux résumer l'idée, ça donnerait (je donne l'exemple =
en CSV):
Tableau 1 à exploiter (qui liste les références 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 à 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éjà, la première question c'est "Est-ce-que c'est possible sans cr=
éer de script?"
Si c'est non, je veux bien m'incliner et programmer mon bout de script pour=
obtenir ce que je veux, ça devrait pas être trop sorcier non plus. Mai=
s si je peux avoir un peu d'aide sur cette étape, ça me faciliterait gr=
andement la vie.
D'avance merci.
T.
Je me dépatouille depuis quelques temps afin de créer un fichier excel =
qui puisse faire la liaison entre un stock et les références d'articles=
chez divers fournisseurs (et par extension leurs tarifs) afin de créer p=
lusieurs tableaux à importer dans un logiciel de compta et que ces tablea=
ux soient tous issus de la même base et que cette base demande un minimum=
de mise à jour.
J'ai pas mal avancé sur certains points donc je ne pars pas de zéro mai=
s je cherche à convertir une plage de données en une seule colonne qui =
contiendrait les cellules non-vides (ou différentes de zéro) de cette p=
lage avec, si possible en bonus sur la colonne suivante, le titre de la col=
onne d'où est issue cette référence, voire même la valeur qui se tr=
ouve dans une colonne donnée sur la même ligne (mais pour ce dernier po=
int j'ai déjà la formule et ça peut se faire à part même après =
coup). Je me donc suis d'abord plongé dans RechercheV (pas assez puissant=
) puis index/Equiv (rapidement prise de tête) mais avant de me lancer dan=
s un script VBA, je voudrais savoir si c'est possible sans créer de table=
au intermédiaire parce que là, j'en suis venu à créer 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, ça me permet être un=
tableau intermédiaire plus facile à exploiter que mon tableau de base =
qui occupe allègrement 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ès, il faut encore que =
ça me permette de facilement retrouver deux références du tableau san=
s avoir à faire une copie manuelle des cellules non-vides d'une colonne p=
uis faire une formule par colonne fournisseur etc etc. LE but étant de do=
nner un outil, où on ai juste à renseigner la référence produit du =
fournisseur qui correspond à la notre.
En gros, si je peux résumer l'idée, ça donnerait (je donne l'exemple =
en CSV):
Tableau 1 à exploiter (qui liste les références 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 à 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éjà, la première question c'est "Est-ce-que c'est possible sans cr=
éer de script?"
Si c'est non, je veux bien m'incliner et programmer mon bout de script pour=
obtenir ce que je veux, ça devrait pas être trop sorcier non plus. Mai=
s si je peux avoir un peu d'aide sur cette étape, ça me faciliterait gr=
andement la vie.
D'avance merci.
T.
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
T.
Le vendredi 20 septembre 2013 17:35:45 UTC+2, isabelle a écrit :
"
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.
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
---------------------------------------------------------------
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 :