Bien vu, Franck
Car un redim re-alloue l'espace en mémoire.
Version imprimable
Bien vu, Franck
Car un redim re-alloue l'espace en mémoire.
Oui Jacques.
Mais dommage que l'on ne puisse pas modifier le typage avec le mot-clé Preserve.
Ce genre de code aurait été ultra simple :
Code:
1
2
3
4
5
6 Sub Test() Dim ref As Variant ref = Split("1:2:3:4", ":") ReDim Preserve ref(LBound(ref) To UBound(ref)) As Long End Sub
a oui bien vu franck :plusser:
bien que je ne comprenne pas la ligne
ca fonctionneCode:ReDim Preserve ref(0 To UBound(ref(LBound(ref)))) As Variant
Bonjour Patrick,
Regarde, en pas à pas, la fenêtre des variables locales, tu comprendras aisément.
Bonjour pijaku,
Intéressant et astucieux pour le challenge. C'est vrai que c'est faisable :-)
Mais, tu t'en doutes, quitte à faire une boucle et n'étant pas à court de noms pour les variables je préfère la faire pour mettre dans un tableau Long ;-)
eric
Patrick,
cela revient à transformer un Array d'un Array en simple Array
et comme le premier indice d'un Array est le zéro par défaut
mais peut aussi être le un si Option Base 1 en tête de module
Franck a alors préféré éviter cette "simple" démonstration :Code:
1
2
3
4
5
6
7
8
9 Sub Demo() Dim ref, i& ref = Array(Split("0 1 2 3")) ReDim Preserve ref(0 To UBound(ref(0))) For i = 1 To UBound(ref) ref(i) = CLng(ref(0)(i)) Next i ref(0) = CLng(ref(0)(0)) End Sub
Bonjour Marc,
Sauf pour le Split qui lui reste à 0.
D'où le 0 en "dur" :
Et pour l'adaptation en Option Base 0 ou 1 :Code:ReDim Preserve ref(0 To
Salut Eric,Code:To UBound(ref(LBound(ref)))
Bien entendu.Citation:
Mais, tu t'en doutes, quitte à faire une boucle et n'étant pas à court de noms pour les variables je préfère la faire pour mettre dans un tableau Long ;-)
Tu y gagneras certainement en vitesse d'exécution.
MarcL ne te moque pas hein :rouleau:
bon je donne quand meme le lien de cette discution
un petit exemple
parfois la destination c'est le cheminCode:
1
2
3
4
5 Sub test5() chaine = "1,2,3,4,5,6,7,8,9" tablo = Evaluate("{" & chaine & "}") MsgBox "tablo(3)= " & tablo(3) & " est de type " & TypeName(tablo(3)) End Sub
A+
Bah oui, mais Evaluate quoi ?
J'étais allé sur une feuille avec la chaine dans une cellule et l'inspiration n'a pas été plus loin que "=" :-)
Edit : ah oui, c'est plus concret là. Merci patrick. C'est court et simple, ça pourra resservir.
J'étais resté avec mes ":", je ne risquais pas d'arriver à grand chose...
re ben oui
ca n'enleve rien a la discussion
comme je l'ai dis "parfois la destination c'est le chemin"
re
les ":"c'est pas bon c'est ";" et c'est les lignes ;)
ps: aurais je oublié de mentionner qu'avec cette methode les tableaux etaient en base 1 et non 0Code:
1
2
3
4
5 Sub test6() chaine = "1,2,3,4;7,8,9,10" tablo2 = Evaluate("{" & chaine & "}") MsgBox tablo2(2, 3) End Sub
je le dis ca peut servir;)
Bonjour
Par curiosité, J'ai un peu changé ton code original.
a est vraiment converti en Long. J'ai comme l'impression que c'est juste impossible de mettre dans un tableau en Variant, un élément individuel qui n'est pas du même type que le tableau.Code:
1
2
3
4
5
6
7
8
9
10
11 Sub test2() Dim ref1 As Variant Dim i As Long Dim a As Long ref1 = "1:2:3:4" ref1 = Split(ref1, ":") For i = 0 To 3 a = CLng(ref1(i)) ref1(i) = CLng(ref1(i)) Next i End Sub
Et c'est aussi impossible de mettre un élément en string dans un tableau Integer
testé au pas-à-pas Excel 2016. a(1) reste Integer.Code:
1
2
3
4
5
6
7
8
9 Sub test3() Dim a(2) As Integer a(0) = 0 a(1) = 1 a(2) = 2 For i = 0 To 2 a(i) = CStr(a(i)) Next End Sub
re
Bonjour clement marcotte
j'ai l'impression que tu confond le tableau et ses itemsCode:
1
2
3 J'ai comme l'impression que c'est juste impossible de mettre dans un tableau en Variant, un élément individuel qui n'est pas du même type que le tableau. Et c'est aussi impossible de mettre un élément en string dans un tableau Integer
c'est pas tablo qui est en string mais ses item !Code:dim tablo(2) as string
ici c'est tablo qui a la propriété car ce n'est pas un tablo au depart c'est un variant et ses item seront des string puisque issus d' un split
ici c'est pour les items la propriété variant et ca me me permet de lui injecter ce que je veuxCode:
1
2 dim tablo as variant tablo=split("toto,titi",",")
autrement dit avec un tablo prédimentionné(dim tablo(x,y) as variant ) je peut mettre absolument tout ce que je veux ou presqueCode:
1
2
3
4
5
6
7
8
9 Sub test3() Dim tablo(2) As Variant tablo(0) = "toto" tablo(1) = 2 Debug.Print TypeName(tablo) Debug.Print TypeName(tablo(0)) Debug.Print TypeName(tablo(1)) End Sub
il est evident que si tu declare un tablo dimentionné entres ses parentheses avec une propriété pour ses items tu ne poura pas mettre un autre type que celui declaré
tout du moins tout ce qui est numerique sera considéré comme string si "as string" par exemple
Bonjour,
voilà.
Lorsqu'on crée un tableau variant, la variable (et non ses éléments) est Variant/Variant.
Chaque valeur peut être de n'importe quel type, il dépend de ce qu'on y met et peut donc changer.
Lorsqu'un tableau variant est créé par Split il est Variant/String (voir capture au #10).
Toutes ses valeurs sont toujours String. On peut y mettre n'importe quel numérique sans erreur de type mais il sera d'office converti en String.
eric
Bonjour,
Dans le cas présent quel est l'intérêt d'utiliser Evaluate?
Si ce n'est pour gagner 3 lignes de code?
La demande initiale est relative à un gain de temps d'exécution.
Or Evaluate est, il me semble (en tout cas à la maison c'est le cas), plus lente qu'une boucle non?
Excusez la relance, mais j'aime bien comprendre...
EDIT : après réflexion, Evaluate est plus rapide sur des chaînes plus longues.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Option Explicit Private Const Max As Long = 100000 Sub test5() Dim chaine As String, tablo As Variant, i As Long, t# t = Timer chaine = "1,2,3,4,5,6,7,8,9" For i = 1 To Max tablo = Evaluate("{" & chaine & "}") Next Debug.Print Timer - t '3,3203125 sec End Sub Sub Demo() Dim ref As Variant, i As Long, j As Long, t# t = Timer For j = 1 To Max ref = Array(Split("1:2:3:4:5:6:7:8:9", ":")) ReDim Preserve ref(0 To UBound(ref(LBound(ref)))) As Variant For i = LBound(ref) + 1 To UBound(ref) ref(i) = CLng(ref(LBound(ref))(i)) Next i ref(LBound(ref)) = CLng(ref(LBound(ref))(0)) Next Debug.Print Timer - t ' 1,20703125 sec End Sub Sub tansfert() Dim ref As Variant, t#, i As Long, l() As Long, j As Long t = Timer For j = 1 To Max ref = Split("1:2:3:4:5:6:7:8:9", ":") ReDim Preserve l(UBound(ref)) For i = LBound(ref) To UBound(ref) l(i) = CLng(ref(i)) Next i Next Debug.Print Timer - t ' 0,67578125 sec End Sub
Gros inconvénient, Evaluate plante lorsque la taille de la chaîne atteint la limite de l'Integer (Len(chaine) = 32 767)
Bonjour Franck
Ta remarque est on ne saurait plus pertinente.
La performance d'un code ne se mesure pas aux nombres de caractères qu'il utilise, mais à sa vitesse d'exécution et à la moindre occupation de l'espace mémoire. S'écarter de cet aspect fondamental est s'égarer.
re
je ne comprend pas bien ton test franck
avec ta methode je comprends que tu boucle mais evaluate n'en a pas besoins ??
ce que tu fait avec split et ta boucle de conversion :evaluate le fait tout court
tester les 3
Pièce jointe 370041
La boucle sur le Evaluate est juste là pour obtenir un temps d'exécution notable...
par contre ce que je pige toujours pas c'est ta ligne
si je dois la traduireCode:ReDim Preserve ref(0 To UBound(ref(LBound(ref)))) As Variant
ref est donc issu du split (ref = Array(Split("1:2:3:4:5:6:7:8:9", ":")))
ReDim Preserve ref(0 To UBound(ref(LBound(ref)))) As Variant
la traduction donne
ReDim Preserve ref(0 To UBound(ref(0))) As Variant
ce qui donne
ReDim Preserve ref(0 To Ubound(1)) As Variant
non je pige pas du tout :koi: