Problème avec SPLIT

Résolu
Malokoxis Messages postés 83 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 22 février 2021 - 9 nov. 2015 à 19:49
Malokoxis Messages postés 83 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 22 février 2021 - 9 nov. 2015 à 23:35
Bonjour,

J'ai une chaine contenant 15 caractères et je souhaite découper cette chaine pour que chaque index de VarSys me donnent un caractère de la chaine.

Voilà le code que j'ai écrit (la première ligne est le contenu de chainedec) :

'STS , Systeme, , SCAN, , 100000000000000,11111111111000001, , 0, 1, 0, 0

    variable = Split(Chainedec, ",")
    VarSYS = Split(variable(5), "")
    VarGRP = Split(variable(6), "")

    'SYS=15 0à14
    For i = 1 To Len(variable(5))

        If VarSYS(i) = "0" Then ImgSYS(i - 1).Visible = True Else ImgSYS(i - 1).Visible = False
    Next i
    
    If VarSYS(0) = "0" Then lblSys.Visible = True Else lblSys.Visible = False
    If VarSYS(11) = "0" Then lblATT.Visible = True Else lblATT.Visible = False
    If VarSYS(12) = "0" Then lblPRI.Visible = True Else lblPRI.Visible = False
    If VarSYS(13) = "0" Then ImgClef.Visible = True Else ImgClef.Visible = False
    If VarSYS(14) = "0" Then ImgBatt.Visible = True Else ImgBatt.Visible = False
    
    If VarGRP(0) = "0" Then lblGrp.Visible = True Else lblGrp.Visible = False


Mais après l'index 1, j'ai une erreur d'index hors limite alors que la chaine fait bien 15 caractères ( et le nombre de caractère est fixe).

Est-ce que Split peut être utilisé sans caractère délimiteur (VarSYS = Split(variable(5), "")) ?
Est-ce que le premier index de la liste variable qui en découle est 0 ?

merci

3 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2015 à 21:04
Bonjour,
on ne peut éclater (split) sur rien !
Split(variable(5), "") et Split(variable(6), "") ont un ubound = 0
et donc
If VarSYS(i) est forcément hors limite dès que i > 0 !
Décris avec plus de précision ce que tu veux faire exactement et tu auras ta solution précise.
Je crois deviner que, dans ton exemple, tu veux décomposer "100000000000000" en "1", "0","0", etc ...
est-ce vraiment le cas ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 9/11/2015 à 21:29
Bon ...
Je suis fiévreux et dois donc me mettre au lit ===>>>
regarde ce que fait ceci. Analyse et comprends, puis utilise à ta guise
 chainedec = "STS,Systeme,,SCAN,,abracadabra,11111111111000001, , 0, 1, 0, 0"
montableau = Split(StrConv(Split(chainedec, ",")(5), vbUnicode), Chr(0))
For i = 0 To UBound(montableau) - 1
MsgBox montableau(i)
Next

bonne nuit

EDIT :
ce que tu pourrais d'ailleurs écrire également ainsi :
chainedec = "STS,Systeme,,SCAN,,abracadabra,11111111111000001, , 0, 1, 0, 0"
Dim titi() As Byte
titi = StrConv(Split(chainedec, ",")(5), vbFromUnicode)
For i = 0 To UBound(titi)
MsgBox Chr(titi(i))
Next

avec le même résultat.
Bon ... au lit sans attendre, maintenant.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Malokoxis Messages postés 83 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 22 février 2021 2
Modifié par Malokoxis le 9/11/2015 à 23:37
Ton code :
sectionne la chaine selon le caractère "," en limitant à 5 caractères
convertit la chaine en unicode
sectionne la chaine selon le caractère char(0)

Je n'avais pas pensé à mettre le caractère sous cette forme.

Merci pour ton aide.

Voici donc mon nouveau code :
    variable = Split(Chainedec, ",")
    VarSYS = Split(StrConv(variable(5), vbUnicode), Chr(0))

   For i = 1 To 10

        If VarSYS(i) = "1" Then ImgSYS(i).Visible = True Else ImgSYS(i).Visible = False
    Next i
    
    If VarSYS(0) = "1" Then lblSys.Visible = True Else lblSys.Visible = False
    If VarSYS(10) = "1" Then ImgSYS(0).Visible = True Else ImgSYS(0).Visible = False
    If VarSYS(11) = "1" Then lblATT.Visible = True Else lblATT.Visible = False
    If VarSYS(12) = "1" Then lblPRI.Visible = True
0
Rejoignez-nous