Tableau, structure, enum et split

Résolu
Signaler
Messages postés
41
Date d'inscription
vendredi 11 février 2005
Statut
Membre
Dernière intervention
11 décembre 2008
-
Messages postés
809
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
-
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

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
(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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
41
Date d'inscription
vendredi 11 février 2005
Statut
Membre
Dernière intervention
11 décembre 2008

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
Messages postés
41
Date d'inscription
vendredi 11 février 2005
Statut
Membre
Dernière intervention
11 décembre 2008

Désolé, mais il y encore eu un problème de tabulations. Je ne sais pas comment faire pour que la tabulation soit correcte.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
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]
Messages postés
809
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
9
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
Messages postés
809
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
9
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
Messages postés
41
Date d'inscription
vendredi 11 février 2005
Statut
Membre
Dernière intervention
11 décembre 2008

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.
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
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
Messages postés
809
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
9
Salut,

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

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


++

Zlub