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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #25674842
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
Thomas Boivin
Le #25678152
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
Thomas Boivin
Le #25678392
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
Le #25678732
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
---------------------------------------------------------------
Thomas Boivin
Le #25678752
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 :


Publicité
Poster une réponse
Anonyme