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

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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…