XL 2013 Extraire des donnes dans tableau vba avec join

controlo

XLDnaute Occasionnel
Bonjour les amis ,

J'essaie d extraire des données stockées dans un tableau vba avec la méthode JOIN pour les "concatener" entre elles avec des points virgules .Mais cela ne fonctionne pas , j'ai joint un petit fichier à titre d'exemple .C'est un tableau excel de 5 lignes et 3 colonnes que je stoch dans un tableau vba et ce que je veux faire c'est ressortir ces données de cette façon : a;b;c;d;e;f;g;h;i;j;k;l;m ect.... . Avez-vous une idée ? Merci de votre aide.
 

Pièces jointes

  • lecture tableau pour xld .xlsm
    19.7 KB · Affichages: 11

Staple1600

XLDnaute Barbatruc
Bonjour le fil

@Efgé
Tu as bien en début de module ?
Const Lignes As Long = 900000

Car pas d'erreur chez moi avec byvarianttableau_c

NB: Sans la ligne Const , je reproduis l'erreur ;)

[trait d'humour dominical...sans le gras des croissants sur les doigts - y'en avait plus chez le boulanger!
Y a pas que moi(*) qui fait des tests chelou (Ca me rassure ;))
((*) cf l'épisode du balcon)
[/trait d'humour dominical]
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re
L'erreur est avec la Const
Par contre avec
VB:
Sub byvarianttableau_d()
Dim Montab As Variant, T$, i&, j&, tim#
tim = Timer
ReDim Montab(1 To Lignes, 1 To 3)
For i = LBound(Montab, 1) To UBound(Montab, 1)
For j = LBound(Montab, 2) To UBound(Montab, 2)
Next j
Next i
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & Lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
Résultat:

1667731170545.png


Cordialement
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tout les deux
étonnant les différences entre versions d'Excel
je n'ai pas d'erreur chez moi avec l'une ou l'autre
const à 900000
les temps chez moi
1667735486618.png

et pour le coup je sais plus quoi comprendre
depuis hiers vous avez des temps bien plus courts que les miens et ce matin voilà que je passe a 0.15 alors que @Efgé est a 0.39
 

patricktoulon

XLDnaute Barbatruc
et pour couronner le tout
hier la monoboucle for eac etait plus rapide et aujourd'hui elle est plus lente
VB:
Option Explicit
Const lignes As Long = 900000

Sub byvarianttableau_doubleboucle() '2boucles incrémentées
Dim Montab As Variant, T$, i&, j&, tim#
tim = Timer
ReDim Montab(1 To lignes, 1 To 3)
For i = LBound(Montab, 1) To UBound(Montab, 1)
For j = LBound(Montab, 2) To UBound(Montab, 2)
Next j
Next i
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
'chez moi résultat 0.14 / 0.15 secondes
End Sub

Sub byvarianttableau_simpleboucleforeach()
Dim Montab As Variant, T$, elements, tim#
tim = Timer
ReDim Montab(1 To lignes, 1 To 3)
For Each elements In Montab

Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
'chez moi résultat 0.18 / 0.19 secondes
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
j'ai fait les tests dans tout les sens
bon c'est avéré que la double boucle est plus rapide (bizarre)
il s'avère aussi que si je start le timer après! le redim du tableau variant
on se rend compte qu'avec une plage.value le temps se rallonge d'environ 30%
donc là ou j'avais 15 j'ai 10 / 11
et la ou j'avais 0.80 j'ai 0.50 / 0.55
et là ou j'avais 0.35 / 0.37 range vide , j'ai à nouveau 0.14 / 0. 15 autrement dit là ce n'est plus 30% mais 50% environ
il est donc clair que la mémoire occupé par la variable "Montab(vide ou pas) " influe sur la boucle de différence manières selon d’où provient le tableau variant
donc pour mesurer le temps de boucle je pense qu'il faut s'y prendre autrement
VB:
Option Explicit
Const lignes As Long = 900000

Sub byvarianttableau_doubleboucletablo() '2boucles incrémentées
Dim Montab As Variant, T$, i&, j&, tim#
ReDim Montab(1 To lignes, 1 To 3)
tim = Timer
For i = LBound(Montab, 1) To UBound(Montab, 1)
For j = LBound(Montab, 2) To UBound(Montab, 2)
Next j
Next i
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
'chez moi résultat 0.14 / 0.15 secondes
End Sub

Sub byvarianttableau_doubleboucletablorange() '2boucles incrémentées  sur range-->tablo variant la moitié du temps si range vide
Dim Montab As Variant, T$, i&, j&, tim#
 Montab = [A1].Resize(lignes, 3).Value
tim = Timer
For i = LBound(Montab, 1) To UBound(Montab, 1)
For j = LBound(Montab, 2) To UBound(Montab, 2)
Next j
Next i
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
'chez moi résultat 0.80 / 0.95 secondes si pleines et  00.32/ 0.33 si vides
End Sub

Sub byvarianttableau_simpleboucleforeach()
Dim Montab As Variant, T$, elements, tim#
ReDim Montab(1 To lignes, 1 To 3)
tim = Timer
For Each elements In Montab

Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
'chez moi résultat 0.18 / 0.19 secondes
End Sub

Sub byvarianttableau_simpleboucleforeachtablorange() '1 boucle sur range-->tablo variant  la moitié du temps si range vide
Dim Montab As Variant, T$, elements, tim#
 Montab = [A1].Resize(lignes, 3).Value
tim = Timer
For Each elements In Montab

Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
'chez moi résultat 1.10 / 1.25 secondes si pleines et  00.35/ 0.37 si vides
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
et voila le test juste boucle sans variant tableau
chez moi c'est entre 0.04 et 0.06 pour les deux
VB:
Const lignes = 900000
Sub testbdblboucle()
    Dim i&, c&, tim#
    tim = Timer
    For c = 1 To 3
        For i = 1 To lignes
        Next
    Next
    MsgBox "formule double boucle imbriquées" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub

Sub testbSimpleboucle()
    Dim a&, tim#
    tim = Timer
    For a = 1 To (3 * lignes)
        Next
    MsgBox "formule Simple boucle  :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 182
Messages
2 086 004
Membres
103 086
dernier inscrit
jcreant