Bien vu, Franck
Car un redim re-alloue l'espace en mémoire.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
bien que je ne comprenne pas la ligne
ca fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part ReDim Preserve ref(0 To UBound(ref(LBound(ref)))) As Variant
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part ReDim Preserve ref(0 To
Salut Eric,
Code : Sélectionner tout - Visualiser dans une fenêtre à part To UBound(ref(LBound(ref)))
Bien entendu.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
bon je donne quand meme le lien de cette discution
un petit exemple
parfois la destination c'est le chemin
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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+
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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"
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 items
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 veux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 presque
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
![]()
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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 traduire
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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![]()
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
Partager