Chargement de données rapide en mémoire pour dépôt rapide

elgringo123456

XLDnaute Occasionnel
Supporter XLD
Bonjour,

Je me permets de vous solliciter sur l'aspect suivant, je cherche à charger rapidement des données provenant d'un fichier Excel, puis je souhaiterai pouvoir déposer rapidement ces données.

Je m'explique en pièce jointe (Depot Data.xlsm), il y a des données avec l'uplon (Nom, Prenom, Age).
Dans le code VBA, j'arrive à monter très rapidement les données en mémoire en utilisant un Variant (ex : ListDataAll (i.e. toutes les colonnes du tableau) et ListDataCol1 (i.e. 1ere colonne du tableau)) via les 2 instructions :
ListDataAll = Range("A2:C3")
ListDataCol1 = Range("A2:A3")

J'ai vu que pour déposer rapidement la colonne 1 je fais appel au code :
Range("E2:E3") = Application.Transpose(ListDataCol1_String)

Je souhaiterais appliquer cette technique sur le variant multi dimensionnel (ListDataAll en ne selectionnant qu'une colonne). J'ai essayé une isntruction du genre ListDataAll(1 To 2, 1) => Mais en vain.

Question est-il possible d'utiliser cette technique sur des données mutli dimensionnelles ?
Y a t il d'autres techniques me permettant de deposer rapidement l'ensemble des données d'une variable ?

Merci d'avance de vos aides ou lumières sur le sujet
Cordialement.
El Gringo123456
 

Pièces jointes

  • Depot Data.xlsm
    13.5 KB · Affichages: 56

Dranreb

XLDnaute Barbatruc
Bonsoir.
Les transferts en mémoire de tableau à tableau tel que celui ci sont rapides :
VB:
Sub Solution1()
Dim TE(), TS(), L As Long
TE = [A2:C3].Value
ReDim TS(1 To UBound(TE, 1), 1 To 1)
For L = 1 To UBound(TE, 1): TS(L, 1) = TE(L, 1): Next L
[E2:E3].Value = TS
End Sub
Mais il existe une solution plus courte :
VB:
Sub Solution2()
Dim TE()
TE = [A2:C3].Value
[E2:E3].Value = WorksheetFunction.Index(TE, 0, 1)
End Sub
Mais elle ne peut pas être utilisée dans l'autre sens.
 

Theze

XLDnaute Occasionnel
Bonjour,

J'ai aussi un peu de mal à comprendre mais tu peux aussi utiliser un type utilisateur, une piste :
Code:
Option Base 1

Type TblCol

    Col As Variant
   
End Type

Sub TestData()

    Dim Tableau() As TblCol
    Dim Tablo() As TblCol
   
    ReDim Tableau(1 To 3)
    ReDim Tablo(1 To 1)
   
    Tableau(1).Col = Range("A2:A20")
    Tableau(2).Col = Range("B2:B20")
    Tableau(3).Col = Range("C2:C20")
   
    Range("E2:E20") = Tableau(1).Col
    Range("F2:F20") = Tableau(2).Col
    Range("G2:G20") = Tableau(3).Col
   
    Tablo(1).Col = Tableau(3).Col
       
    Range("H2:H20") = Tablo(1).Col
   
    Range("I2").Value = Tableau(1).Col(5, 1)
   
End Sub
 

pierrejean

XLDnaute Barbatruc
Bonjour à tous

En utilisant un tableau de tableaux
Code:
Sub report()
Dim tabcol(2)
tabcol(0) = Range("A2:A3")
tabcol(1) = Range("B2:B3")
tabcol(2) = Range("C2:C3")
col = 5
For n = LBound(tabcol) To UBound(tabcol)
    Cells(2, col).Resize(UBound(tabcol(n))) = tabcol(n)
    col = col + 1
Next
End Sub
 

PMO2

XLDnaute Accro
Bonjour,
Une piste avec 2 routines (une sans transposition, l'autre avec transposition).
Code:
'''''''''''''''''''''''''''''''''''
Sub TestDatapmo()
Dim R As Range
Dim Rdest As Range
Dim ListDataAll As Variant
' Chargement rapide des données
Set R = Range("A2:C3")
ListDataAll = R
' Inscription
Set Rdest = Application.InputBox(Prompt:="Sélectionnez une cellule", Title:="Destination (non transposé)", Type:=8)
Set Rdest = Rdest.Resize(R.Rows.Count, R.Columns.Count) 'la différence est là
Rdest = ListDataAll
End Sub
'''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''
Sub TestDatapmoTranpose()
Dim R As Range
Dim Rdest As Range
Dim ListDataAll As Variant
' Chargement rapide des données
Set R = Range("A2:C3")
ListDataAll = R
' Inscription
Set Rdest = Application.InputBox(Prompt:="Sélectionnez une cellule", Title:="Destination (transposé)", Type:=8)
Set Rdest = Rdest.Resize(R.Columns.Count, R.Rows.Count) 'la différence est là
Rdest = Application.Transpose(ListDataAll)
End Sub
'''''''''''''''''''''''''''''''''''
 

Pièces jointes

  • Depot Data_pmo.xlsm
    13.7 KB · Affichages: 46

Paf

XLDnaute Barbatruc
Bonjour à tous,

une autre solution proche de celle de Dranreb:

Code:
ReDim Tablo(UBound(ListDataAll))
NbL = UBound(ListDataAll, 1)
Tablo = Application.Index(ListDataAll, Evaluate("row(1:" & NbL & ")"), Array(2))
    Range("E2").Resize(UBound(Tablo, 1), UBound(Tablo, 2)) = Tablo
tel quel, le code 'copie' la colonne 2 du tableau ListDataAll

l'intérêt de ce code, c'est qu'il permet de 'copier' de 1 à la totalité des colonnes et surtout dans l'ordre souhaité.
Il faut préciser dans Array le N° et l'ordre voulus:

Array(3,2) copiera colonne 3 et 2 dans cet ordre
Array(3,2,1) copiera colonne 3 , 2 et 1 dans cet ordre


S'il s'agit de ne copier que la première colonne du tableau, on pourrait 'réduire la plage de copie' à une seule colonne:

Code:
Range("E2").Resize(UBound(ListDataAll), 1) = ListDataAll

A+
 

Discussions similaires