Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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
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
329
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…