Tableau, structure, enum et split

Résolu
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008 - 2 févr. 2006 à 16:19
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 - 3 févr. 2006 à 15:36
Bonjour à tous,

Voici mon problème : J'ai un fichier CSV contenant mes codes d'erreurs et leur description. J’utilise les objets fso pour lire le fichier ligne par ligne (une ligne représentant un seul message d’erreur). Ensuite j’utilise la fonction Split pour extraire les informations vers un tableau. Après, je voudrais affecter le contenu de ce tableau dans un autre tableau contenant une structure. Cette structure est composée de 2 énumérations et d’un String.





La lecture se passe bien, mais j’ai un petit souci avec mes tableaux.





J’ai une erreur d’incompatibilité (Type incompatible (erreur 13)) lorsque j’affecte une des valeurs du tableau de lecture vers le tableau contenant la structure avec les énumérations. Pouvez-vous m’aider ?





Est-il possible de transformer un String en ‘Constante d’un Enum’ ?





Exemple du code :





Public Enum ERROR_TYPE





type0 = &H0


type1 = &H1


type2 = &H2


type3 = &H3


typeUnused = &HFF





End Enum





Public Enum SENSOR_ID





sensor1 = &H2


sensor2 = &H3


sensor4 = &H4


sensor95 = &H95


sensor96 = &H96


sensor97 = &H97




End Enum





Public Type ERROR_STRUCTURE





ErrorType As ERROR_TYPE


SensorId As SENSOR_ID


ErrorText As String




End Type





Public ErrorStructure() As ERROR_STRUCTURE








Public Function LoadErrorMessage() As Boolean





Dim i As Integer


Dim fso As FileSystemObject


Dim fError As TextStream


Dim strPathErrorFile As String


Dim strErrorLine As String


Dim strFieldsErrorFile




LoadErrorMessage = False




Set fso = New FileSystemObject





strPathErrorFile = “C:\Error.txt”




If fso.FileExists(strPathErrorFile) Then




Set fError = fso.OpenTextFile(strPathErrorFile, ForReading)





If fError.AtEndOfStream Then




Set fError = Nothing


Set fso = Nothing


Exit Function




End If




i = 0


ReDim ErrorStructure(0)


' Read all the lines


While Not fError.AtEndOfStream




strErrorLine = ""


strErrorLine = fError.ReadLine




strFieldsErrorFile = Split(strErrorLine, ";")




' Ce qui nr fonctionne pas ???


ErrorStructure(i).ErrorType = strFieldsErrorFile(0)


' Ce qui nr fonctionne pas ???


ErrorStructure(i).SensorId = strFieldsErrorFile(1)




ErrorStructure(i).ErrorText = strFieldsErrorFile(2)






ReDim Preserve ErrorStructure(UBound(ErrorStructure) + 1)


i = i + 1




Wend




Set fError = Nothing




End If




Set fso = Nothing





End Function





Exemple du Contenu du fichier :





type0;sensor1;Erreur de type 0 à la cellule 1


type0;sensor2;Erreur de type 0 à la cellule 2


type0;sensor4;Erreur de type 0 à la cellule 4


type1;sensor1;Erreur de type 1 à la cellule 1


type1;sensor2;Erreur de type 1 à la cellule 2

9 réponses

PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
3 févr. 2006 à 04:14
(salut Zlub)



tu peux même pousser le vice à



Private Function ConvertSensorStringToSensorLong(ByVal sSensor As String) As SENSOR_ID




ce qui ne gênera pas le Else pour autant.

(j'y avais pensé après avoir envoyé ^^)
3
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
2 févr. 2006 à 16:22
Désloé, il y a un problème de tabulation !!!
Pour une meilleur visibilité de lecture re-voici mon exemple :





Exemple du code :




Public Enum ERROR_TYPE




type0 = &H0


type1 = &H1


type2 = &H2


type3 = &H3


typeUnused = &HFF




End Enum




Public Enum SENSOR_ID


sensor1 = &H2


sensor2 = &H3


sensor4 = &H4


sensor95 = &H95


sensor96 = &H96


sensor97 = &H97




End Enum


Public Type ERROR_STRUCTURE


ErrorType As ERROR_TYPE


SensorId As SENSOR_ID


ErrorText As String




End Type


Public ErrorStructure() As ERROR_STRUCTURE


Public Function LoadErrorMessage() As Boolean


Dim i As Integer


Dim fso As FileSystemObject


Dim fError As TextStream


Dim strPathErrorFile As String


Dim strErrorLine As String


Dim strFieldsErrorFile




LoadErrorMessage = False




Set fso = New FileSystemObject


strPathErrorFile = “C:\Error.txt”




If fso.FileExists(strPathErrorFile) Then




Set fError = fso.OpenTextFile(strPathErrorFile, ForReading)


If fError.AtEndOfStream Then




Set fError = Nothing


Set fso = Nothing


Exit Function




End If




i = 0


ReDim ErrorStructure(0)


' Read all the lines


While Not fError.AtEndOfStream




strErrorLine = ""


strErrorLine = fError.ReadLine




strFieldsErrorFile = Split(strErrorLine, ";")




' Ce qui nr fonctionne pas ???


ErrorStructure(i).ErrorType = strFieldsErrorFile(0)


' Ce qui nr fonctionne pas ???


ErrorStructure(i).SensorId = strFieldsErrorFile(1)




ErrorStructure(i).ErrorText = strFieldsErrorFile(2)






ReDim Preserve ErrorStructure(UBound(ErrorStructure) + 1)


i = i + 1




Wend




Set fError = Nothing




End If




Set fso = Nothing


End Function


Exemple du Contenu du fichier :




type0;sensor1;Erreur de type 0 à la cellule 1


type0;sensor2;Erreur de type 0 à la cellule 2


type0;sensor4;Erreur de type 0 à la cellule 4


type1;sensor1;Erreur de type 1 à la cellule 1


type1;sensor2;Erreur de type 1 à la cellule 2
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
2 févr. 2006 à 16:25
Désolé, mais il y encore eu un problème de tabulations. Je ne sais pas comment faire pour que la tabulation soit correcte.
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
3 févr. 2006 à 02:51
salut,

si ton problème est "sensor1" est considéré comme une chaîne alors que c'est un enum... bah normal, tu as la réponse. c'est un enum...





fais toi des fonctions (ou une raison? ) genre :




Option Explicit

'

Public Enum SENSOR_ID

sensor1 = &H2

sensor2 = &H3

sensor4 = &H4

sensor95 = &H95

sensor96 = &H96

sensor97 = &H97

End Enum

'

'

Private Sub Form_Load()

MsgBox "sensor1 = " & ConvertSensorStringToSensorLong("sensor1")

MsgBox "sensor2 = " & ConvertSensorStringToSensorLong("sensor2")

MsgBox "sensor35 = " & ConvertSensorStringToSensorLong("sensor35")

Unload Me

End Sub

'

'

Private Function ConvertSensorStringToSensorLong(ByVal sSensor As String) As Long

Select Case sSensor

Case "sensor1": ConvertSensorStringToSensorLong = &H2

Case "sensor2": ConvertSensorStringToSensorLong = &H3

Case "sensor4": ConvertSensorStringToSensorLong = &H4

Case "sensor95": ConvertSensorStringToSensorLong = &H95

Case "sensor96": ConvertSensorStringToSensorLong = &H96

Case "sensor97": ConvertSensorStringToSensorLong = &H97

Case Else: ConvertSensorStringToSensorLong = &H0

End Select

End Function




<small> Coloration
syntaxique automatique [AFCK]</small>



c'est le seul moyen à ma connaissance....

PCPT [AFCK]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
3 févr. 2006 à 03:49
Salut IcerbergMan,

Comme te l'explique pcpt (salut mec) je ne crois pas qu'il existe une autre solution à ton probléme.

J'utilise la même méthode que celle présentée ici. Si tu en trouve une autre, n'hesites pas à nous l'indiquer.

++

Zlub
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
3 févr. 2006 à 03:55
Salut,

juste un point, afin de bénéficier de l'enum, j'opterais pour l'utiliser à la place des &H.. dans la fonction ConvertSensorStringToSensorLong





donc du coups




Public Enum SENSOR_ID
sensor1 = &H2
sensor2 = &H3
sensor4 = &H4
sensor95 = &H95
sensor96 = &H96
sensor97 = &H97
End Enum

Private Sub Form_Load()
MsgBox "sensor1 = " & ConvertSensorStringToSensorLong("sensor1")
MsgBox "sensor2 = " & ConvertSensorStringToSensorLong("sensor2")
MsgBox "sensor35 = " & ConvertSensorStringToSensorLong("sensor35")
MsgBox "sensor95 = " & ConvertSensorStringToSensorLong("sensor95")
Unload Me
End Sub

Private Function ConvertSensorStringToSensorLong(ByVal sSensor As String) As Long
Select Case sSensor
Case "sensor1": ConvertSensorStringToSensorLong = sensor1
Case "sensor2": ConvertSensorStringToSensorLong = sensor2
Case "sensor4": ConvertSensorStringToSensorLong = sensor4
Case "sensor95": ConvertSensorStringToSensorLong = sensor95
Case "sensor96": ConvertSensorStringToSensorLong = sensor96
Case "sensor97": ConvertSensorStringToSensorLong = sensor97
Case Else: ConvertSensorStringToSensorLong = &H0
End Select
End Function


Voilà, comme tu vois c'est une légère modif du code de pcpt ;)


++

Zlub
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
3 févr. 2006 à 09:34
Pcpt, Zlub,


Merci beaucoup pour vos réponses. Malheureusement, comme vous me l'avez signalé, il n'y a pas d'autre solution qu'utiliser cette fonction pour l'enum SENSOR_ID :

Private Function ConvertSensorStringToSensorLong(ByVal sSensor As String) As SENSOR_ID

De même pour l'enum ERROR_TYPE.

Bonne journée,

@+

Ice.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
3 févr. 2006 à 09:52
préferer :
Private Function ConvertSensorStringToSensorLong(ByRef sSensor As String) As SENSOR_ID

que
Private Function ConvertSensorStringToSensorLong(ByVal sSensor As String) As SENSOR_ID

Renfield
Admin CodeS-SourceS - MVP Visual Basic
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
3 févr. 2006 à 15:36
Salut,

PCPT > exact, j'ai fait le travail au tier ...

Renfield > exact aussi, c'est le second tier ...


++

Zlub
0
Rejoignez-nous