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.
 

Fichiers joints

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+
 

Fichiers joints

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)
 

Fichiers joints

job75

XLDnaute Barbatruc
J'ai testé avec un tableau initial de 200 lignes, donc avec un tableau de résultat de 40 000 lignes.

Par VBA la macro s'exécute en 0,3 seconde

Par formules le recalcul se fait en 1,9 seconde.
 

Sirounet

XLDnaute Nouveau
Un grand merci à toi job75.

Je vais jeter un oeil à tout ça et surtout tenter d'en tirer un enseignement ^^

Merci encore !
 

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 !
 

Fichiers joints

Discussions similaires


Haut Bas