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

Efgé

XLDnaute Barbatruc
Re
VB:
Option Explicit
Const lignes = 900000
Sub by_evaluate()
Dim T$, element, tim#
tim = Timer
For Each element In [A1].Resize(lignes, 3): Next
MsgBox "formule EVALUATE sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
Sub byvarianttableau()
Dim Montab As Variant, T$, element As Variant, tim#
tim = Timer
Montab = Range("A1").Resize(lignes, 3).Value
For Each element In Montab: Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
Cordialement
 

Pièces jointes

  • Classeur1.xlsm
    12.3 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

J'ai pris ton fichier @Efgé et je trouve des résultats différents de ceux que j'avais mesurés en collant tes codes dans mon fichier !

1667678222467.png
 

patricktoulon

XLDnaute Barbatruc
re
@Efgé
hah.. oui ca je sais c'est moi qui l’ai écrit
mais on boucle soit sur un tableau soit sur un range
mais tu a oublié de d'instruire la sortie texte en string c'est pour cela que c'est rapide
sinon c'est sur ;) chez moi sur le Pc portable 0.65 secondes
regarde si tu instruit la sortie (le concat)
VB:
Option Explicit
Const lignes = 900000
Sub by_evaluate()
Dim T$, element, tim#
tim = Timer
For Each element In [A1].Resize(lignes, 3)
T = T & element &";"
Next
T = Mid(T, Len(T)) = ""
MsgBox "formule EVALUATE sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub

et oui avec le concat c'est pas la même chose
 

patricktoulon

XLDnaute Barbatruc
Re,

J'ai pris ton fichier @Efgé et je trouve des résultats différents de ceux que j'avais mesurés en collant tes codes dans mon fichier !

Regarde la pièce jointe 1154491
c'est toujours le cas chez moi
c'est bizarre ce truc
quand je prends vos fichier 2016 et + que vous avez créé en 64 des fois ils sont plus rapides des fois moins ça dépends de ce qui est demander au code de faire
 

Staple1600

XLDnaute Barbatruc
@A la communauté
Monsieur STAPLE présente ses plus plates excuses.
Il n'ose pas vous le dire, il s'est enfermé sur le balcon
Mais moi, je peux le dire : cet idiot a fait ses tests avec une feuille vide !!!
Et suite au message de @mapomme qui fut une atroce révélation sur sa bévue, Monsieur STAPLE a lancé le test dans les conditions idoines

Et le test tourne toujours : Excel ne réponds pas

C'est quand il a lu cette phrase qu'il est parti sur le balcon
 

patricktoulon

XLDnaute Barbatruc
et oui 900000 lignes sur 3 colonnes a concaténer c'est pas rien
je viens de tester ma vielle méthode clipbord
elle reste toujours la plus rapide
un peu plus de 48 secondes
et vous pouvez y aller avec des boucles sur tableau ou range on est loin loin loin (Excel réponds plus )

on a fait déjà ce type d'expérience avec @mapomme me semble t il mettre des portion de texte en couleur dans les cellules)sur des grandes plages
autant dire que sur moins de lignes ça fuse

1667680750240.png

VB:
Option Explicit
Const lignes = 900000
Sub testW()
    Dim plage As Range, T As String, Tim#
    Set plage = [A1].Resize(lignes, 3)    ' preciser la plage ici (activesheet.usedrange pour tout la partie utilisée)
     Tim = Timer
     T = ConcatRange(plage, ";")
MsgBox "formule clipboard sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - Tim, "#0.00 SEC") & vbCrLf & T

End Sub

Function ConcatRange(Rng, Optional separateur As String = ";", Optional chemin As String = "")
    Dim T, clearall
    With CreateObject("htmlfile")
        clearall = .parentwindow.clipboardData.setData("Text", "")    'on vide le clipboard au cas ou il y aurait quelque chose
        Rng.Copy    'on copy la plage tout simplement
        'on recupere le texte de la plage dans le cliboard on fait un replace vbtab par le separateur en parametre injecté dans la fonction";" par defaut
        T = Replace(Replace(.parentwindow.clipboardData.GetData("TEXT"), vbTab, separateur), vbCrLf, separateur & vbCrLf): End With
    T = Replace(T, vbCrLf, ";")
    Application.CutCopyMode = False    'on relache la plage copiée
    ConcatRange = T
End Function
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Si on doit tester avec le tableau, on devrait aussi faire ce test, non ?
VB:
Sub byvarianttableau_b()
Dim Montab As Variant, T$, i&, j&, tim#
tim = Timer
Montab = [A1].Resize(lignes, 3).Value
For i = LBound(Montab, 1) To UBound(Montab, 1): Next
For j = LBound(Montab, 2) To UBound(Montab, 2): Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
 

patricktoulon

XLDnaute Barbatruc
Re

Si on doit tester avec le tableau, on devrait aussi faire ce test, non ?
VB:
Sub byvarianttableau_b()
Dim Montab As Variant, T$, i&, j&, tim#
tim = Timer
Montab = [A1].Resize(lignes, 3).Value
For i = LBound(Montab, 1) To UBound(Montab, 1): Next
For j = LBound(Montab, 2) To UBound(Montab, 2): Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
me semble t il ; tu fait la meme chose en faisant
VB:
for each element in Montab
'..
next
 

patricktoulon

XLDnaute Barbatruc
ben si ilest plus court c'est normal 2 instructions en moins puis un buffer et 2 calculs en moins aussi
si il est plus long là c'est pas normal

le proc lui qui tu met lbound(truc) ou ubound(machin) faut bien qu'il le calcul
la 2 boucle for consomme aussi en elle même
et le "j" qui s'incrémentent aussi
 

Efgé

XLDnaute Barbatruc
Bonjour à tous
mais tu a oublié de d'instruire la sortie texte en string c'est pour cela que c'est rapide
Ce n'était pas un oubli .
Juste tester la vitesse des boucles sans ralentissement lié à la variable texte.

Si on doit tester avec le tableau, on devrait aussi faire ce test, non ?
VB:
Sub byvarianttableau_b()
Dim Montab As Variant, T$, i&, j&, tim#
tim = Timer
Montab = [A1].Resize(lignes, 3).Value
For i = LBound(Montab, 1) To UBound(Montab, 1): Next
For j = LBound(Montab, 2) To UBound(Montab, 2): Next
MsgBox "formule VARIABLE TABLEAU    sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - tim, "#0.00 SEC")
End Sub
D'après moi, là on ne boucle pas sur toutes les cellules.
J'ai utilisé:
Code:
Sub byvarianttableau_c()
Dim Montab As Variant, T$, i&, j&, tim#
tim = Timer
Montab = [A1].Resize(Lignes, 3).Value
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
Avec pour résultat


1667726954458.png

Sur
Code:
Montab = [A1].Resize(Lignes, 3).Value

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 164
Messages
2 085 870
Membres
103 007
dernier inscrit
salma_hayek