[Résolu]Placer dans les colonnes, les données d'un tableau memoire, > 1050000

néné06

XLDnaute Accro
Bonsoir le Forum,

Actuellement, pour afficher les données d'un tableau dans une colonne (C) , j'utilise:

[C1].Resize(UBound(mem, 1)).Value = mem

Comment procéder, si le nombre de données en mémoire, est supérieur au nombre de lignes disponible sur ma feuille?


Merci!!

René
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonsoir.

Pas sûr de comprendre la question.
Un tableau en mémoire peut avoir été surdimensionné pour faire face à toute éventualité quant au nombre de lignes nécessaires.
En général on a dans une variable le numéro de la dernière ligne remplie. Elle s'appelle quasiment toujours LS dans mes codes, et le tableau, lui TS. Je fais souvent Me.[A2].Resize(LS, Ubound(TS, 2)).Value = TS
Ça ne pose pas de problème d'affecter un tableau trop grand, il n'en prend que ce qu'il faut.
 

néné06

XLDnaute Accro
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonsoir Bernard,

Dans mon cas ,
j'ai un tableau rempli avec environ 3 000 000 de données.
Si je souhaite afficher les 3 000 000 données dans plusieurs colonnes, comment pourrais je procéder, mis à part de partager ce gros tableau en plusieurs petits, pour que le tableau s'affiche dans plusieurs colonnes.
Existe t'il un code qui accomplirait cette tâche.

Merci

René
 

klin89

XLDnaute Accro
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonsoir Dranreb, néné06, le forum :)

Une demande similaire ici :
https://www.excel-downloads.com/thr...utilisation-de-application-tranpose.20001505/
VB:
Option Explicit

Sub Copie_par_bloc()
Dim tablo, t(), NbreBloc As Long, j As Long, n As Long
Const bloc As Long = 3    '<- change
   Application.ScreenUpdating = False
    With Sheets("Feuil1")
        tablo = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Value
    End With
    If UBound(tablo, 1) Mod bloc = 0 Then
        NbreBloc = UBound(tablo, 1) \ bloc
    Else
        NbreBloc = UBound(tablo, 1) \ bloc + 1
    End If
    ReDim t(1 To NbreBloc, 1 To bloc)
    For j = 1 To UBound(tablo, 1)
        t((j - 1) \ bloc + 1, (j - 1) Mod bloc + 1) = tablo(j, 1)
    Next
    'Restitution en Feuille 2
   With Sheets("Feuil2").Cells(1)
        .CurrentRegion.ClearContents
        For j = 1 To UBound(t, 1)
            .Offset(, n).Resize(bloc, 1) = Application.Transpose(Application.Index(t, j, 0))
            n = n + 1
        Next
    End With
    Application.ScreenUpdating = True
End Sub
Attention au limites de Application.Transpose et Application.Index.
Plutôt comme ça :
VB:
'Restitution en Feuille 2
    With Sheets("Feuil2").Cells(1)
        .CurrentRegion.ClearContents
        .Resize(bloc, NbreBloc) = Application.Transpose(t)
    End With

klin89
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Moi je n'ai toujours pas compris la question.
Même si on veut changer l'organisation du tableau on a toujours intérêt a travailler avec deux tableaux en mémoire. Un en entrée, chargé en une fois à partie d'une UsedRange.Value par exemple, l'autre en sortie, à destination d'une plage à décharger en une fois aussi.
Si les tableaux sont basés 0 et que celui d'entrée n'a qu'une dimension, faire une boucle :
For L = 0 To LMax: TS(L mod (LMax + 1), L \ (LMax + 1)) = TE(L): Next L. S'ils sont basés 1:
For L = 1 To LMax: TS((L - 1) mod LMax + 1, (L - 1) \ LMax + 1) = TE(L): Next L
LMax étant le numéro de ligne de la dernière à produire dans les deux cas.
 
Dernière édition:

néné06

XLDnaute Accro
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonjour à tous,

@Klin 89,
Les limites de "Application.Transpose" et "Application.Index" s'arrêtes 65536, ce qui est faible pour ce style de tirage.
Merci pour la réponse !

@Dranred,
C'est vrai, je me suis mal exprimé.
Je n'ai pas au départ des données en Range, mais je crée ces données par tirage aléatoire, méthode tableau, qui est plus rapide que la méthode "Dictionary" et me permet de monter jusqu'à >15 000 000 en fonction de ma mémoire disponible (4Go) .
Dans un deuxième temps, je souhaite afficher en colonnes C,D,E,F,G les données présentes dans le tableau mémoire.

@ tous

Voir pièce jointe qui est plus explicative.

A+

René
 

Pièces jointes

  • Tirages aléatoires.xlsm
    26.2 KB · Affichages: 35
  • Tirages aléatoires.xlsm
    26.2 KB · Affichages: 44
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonjour.
Oui ben alors vous avec intérêt à le verser dans un second tableau avec
For L = 0 To NbrVal - 1: TS(L mod LMax, L \ LMax) = mem(L + 1, 0): Next L

En fait je ferais comme ça, sur 100 colonnes :
VB:
Sub Test()
Const NbrVal = 5000000
Dim TNbr() As Long, N As Long, M As Long, A As Long, TS(), L As Long, C As Long
ReDim TNbr(1 To NbrVal)
For N = 1 To NbrVal
   TNbr(N) = N
   Next N
For N = NbrVal To 2 Step -1
   A = Int(N * Rnd) + 1
   M = TNbr(N)
   TNbr(N) = TNbr(A)
   TNbr(A) = M
   Next N
ReDim TS(1 To 50000, 1 To 100)
N = 0
For C = 1 To 100: For L = 1 To 50000
   N = N + 1: If N > NbrVal Then Exit For
   TS(L, C) = TNbr(N)
   Next L, C
ActiveSheet.[A1].Resize(50000, 100).Value = TS
End Sub
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonjour néné06, Bonjour Dranreb

Si je puis me permettre, pourquoi ne pas le faire en une seule boucle et sans limitation de colonnes ?


VB:
Sub Test_2() 'D'après Dranreb
Const NbrVal = 5000
Const MxRw = 500
Dim TNbr() As Variant, N As Long, Rw As Long
ReDim TNbr(1 To MxRw, 1 To 1)
For N = 1 To NbrVal
    Rw = Rw + 1
    If Rw > MxRw Then
        ReDim Preserve TNbr(1 To MxRw, 1 To UBound(TNbr, 2) + 1)
        Rw = 1
    End If
    TNbr(Rw, UBound(TNbr, 2)) = Int(N * Rnd) + 1
Next N
ActiveSheet.[A1].Resize(MxRw, UBound(TNbr, 2)) = TNbr
End Sub

Cordialement
 

néné06

XLDnaute Accro
Re : Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonjour Ejgé et bonne année 2016,

J'ai suivi les conseils de Dranreb, que j'ai adapté et voici le résultat, qui prend environ 25 secondes chez moi, pour être exécuté.

Merci à tous!!
René
 

Pièces jointes

  • Tirages aléatoires.xlsm
    26.8 KB · Affichages: 41
  • Tirages aléatoires.xlsm
    26.8 KB · Affichages: 42

klin89

XLDnaute Accro
Re : [Résolu]Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Re néné06,
Bonjour Efgé :)

Ça le fait comme ceci :
VB:
Option Explicit

Sub Decoupage()
Dim tablo, t(), NbreBloc As Long, j As Long
Const bloc As Long = 7   '<- change
    Application.ScreenUpdating = False
    With Sheets("Feuil1")
        tablo = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Value
    End With
    If UBound(tablo, 1) Mod bloc = 0 Then
        NbreBloc = UBound(tablo, 1) \ bloc
    Else
        NbreBloc = UBound(tablo, 1) \ bloc + 1
    End If
    ReDim t(1 To bloc, 1 To NbreBloc)
    For j = 1 To UBound(tablo, 1)
        t((j - 1) Mod bloc + 1, (j - 1) \ bloc + 1) = tablo(j, 1)
    Next
    'Restitution en Feuille 2
    With Sheets("Feuil2").Cells(1)
        .CurrentRegion.ClearContents
        .Resize(bloc, NbreBloc) = t
    End With
    Application.ScreenUpdating = True
End Sub
klin89
 

Pièces jointes

  • Decoupage.xls
    31.5 KB · Affichages: 31
  • Decoupage.xls
    31.5 KB · Affichages: 39
Dernière édition:

néné06

XLDnaute Accro
Re : [Résolu]Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonsoir Klin89,

Te serait-il possible de me faire parvenir ton code dans une pièce_jointe, prêt à être exécuté, comme la dernière PJ que j'ai déposé au post #11.;)

Merci

René
 

néné06

XLDnaute Accro
Re : [Résolu]Placer dans les colonnes, les données d'un tableau memoire, > 1050000

Bonjour,

@Klin89:
J'ai regardé ton exemple, mais ce n'est pas exactement ce que je cherchais.:(
Dans ton exemple, , qui est rapide, tu places sur la feuil1 des nombres:confused: que tu entre dans un tableau mémoire et tu les retranscris en plusieurs colonnes, dans la feuil2.:eek:

Pour moi, le problème ce décrit comme ceci:

Feuil1 entièrement vide ( Sauf Bouton)
Je fais un tirage aléatoire sans doublons, de 5000000 de nombres sur 5000000, en tableau mémoire:).
-exemple
En mémoire:

J'ai un jeu de cartes, qui sont numérotés de 1 à 5000000.:eek:
Je mélange ce paquet de 5000000 de cartes:mad:
Je travail toujours en mémoire donc aucune donnée ne figure sur ma Feuil1.

Je veux, à ce moment, que les 5000000 cartes mélangées, soit affichées en feuil1, sur plusieurs colonnes.:p


J'ai ajouté une partie de ton code au mien et, après exécution, j'ai des "#N/A" !

Voir la pièce jointe.

Merci

René
 

Pièces jointes

  • Colonnes.xlsm
    23 KB · Affichages: 46
  • Colonnes.xlsm
    23 KB · Affichages: 43

Discussions similaires