XL 2013 Distribution de données basiques

Sirounet

XLDnaute Nouveau
Bonjour à toutes et tous,

J'ai besoin de vos lumières et vous remercie d'avance pour l'aide apportée au débutant que je suis. J'ai cherché pour éviter de vous faire perdre du temps inutilement, mais pour des cas un peu similaire les scripts étaient souvent bien trop compliquées et dépassaient ma compréhension malheureusement....

Mon fichier Excel joint à la discussion est sans doute bien plus parlant que les explications à suivre. Je ne peux que vous encourager à vous y référer

Postulat de départ :
3 colonnes (A/B/C) avec 3 types de données différentes sur 3 lignes par exemple

Mon but :
Que la colonne A soit "distribuée" (je ne sais pas si c'est vraiment le bon terme) avec les colonnes B et C ce qui donnerai
A1 /B1/C1
A1 /B2/C2
A1/B3/C3
A2/B1/C1
A2 /B2/C2
A2/B3/C3
A3/B1/C1
A3 /B2/C2
A3/B3/C3
Terminé

Les colonnes B et C n'ont pas besoin d'être mélangée, c'est vraiment le format ci-dessus que je recherche.

Si vous auriez une petite minute pour vous pencher sur ce problème qui n'en est sans doute pas un pour vous, cela me serait d'une aide très précieuse.

Merci d'avance pour avoir prit le temps de lire et de vous pencher sur ma requête.
 

Pièces jointes

  • Example de la distrubution.xlsx
    9 KB · Affichages: 10

job75

XLDnaute Barbatruc
Bonjour Sirounet, bienvenue sur XLD,

Voici une solution VBA avec cette macro :
Code:
Sub Resultat()
Dim dest As Range, ncol%, P As Range, tablo, h&, resu(), i&, n&, j&, k%
Set dest = [F3] 'à adapter
ncol = 3 'à adapter
Application.ScreenUpdating = False
If ActiveSheet.FilterMode Then ActiveSheet.showlldata 'si la feuille est filtrée
dest(2).Resize(Rows.Count - dest.Row, ncol).Delete xlUp 'RAZ
Set P = Range("A4", Range("A" & Rows.Count).End(xlUp)) 'à adapter
If P.Row < 4 Then Exit Sub
tablo = P.Resize(, ncol) 'matrice, plus rapide
h = UBound(tablo)
'---tableau des résultats---
ReDim resu(1 To h * h, 1 To ncol)
For i = 1 To h
    n = h * (i - 1) + 1
    For j = 0 To h - 1
        resu(n + j, 1) = tablo(i, 1)
        For k = 2 To ncol
            resu(n + j, k) = tablo(j + 1, k)
Next k, j, i
'---restitution---
With dest(2).Resize(UBound(resu), ncol)
    .Value = resu
    .Borders.Weight = xlThin 'bordures
End With
End Sub
A+
 

Pièces jointes

  • Distribution par VBA(1).xlsm
    24.7 KB · Affichages: 7

job75

XLDnaute Barbatruc
Maintenant voici une solution par formules, sans doute préférable car très simple.

En F4 =SIERREUR(INDEX(T;1+ENT((LIGNE()-4)/h);1);"")

En G4 =INDEX(T;1+MOD(LIGNE()-4;h);2)

En H4 =INDEX(T;1+MOD(LIGNE()-4;h);3)
 

Pièces jointes

  • Distribution par formules(1).xlsx
    17.3 KB · Affichages: 5

Sirounet

XLDnaute Nouveau
J'aime beaucoup ta macro dont je tente de comprendre les subtilités job75. Merci encore d'ailleurs !

J'ai tenté de la modifier un peu dans le but d'y introduire une variante potentielle.

Les colonnes B et C pourraient contenir plus de lignes que la colonne A. J'aimerai pourtant que la macro, dans ce cas, incorpore aussi les lignes supplémentaires des colonnes B et C et ne s'arrête pas de lire les infos à la fin de la colonne A .

Malgré mes tentatives je n'y arrives pas... Il me reste du chemin à faire visiblement.

Si une âme charitable passe par là, je suis preneur d'une dernière aide !

J'ai modifié le fichier excel avec les nouvelles informations qui sont sans doute plus claire que mon explication écrite.

Merci d'avance !
 

Pièces jointes

  • Distribution par VBA(1).xlsm
    18.6 KB · Affichages: 5

Discussions similaires

Réponses
7
Affichages
312

Statistiques des forums

Discussions
312 097
Messages
2 085 257
Membres
102 844
dernier inscrit
atori2