Problème avec la fonction writeline (Filesystemobject)

ricomiracle Messages postés 195 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 30 novembre 2009 - 27 nov. 2009 à 17:46
ricomiracle Messages postés 195 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 30 novembre 2009 - 30 nov. 2009 à 20:15
J'extrais des données d'une base de donnée et les injecte dans un fichier avec filesystemobject:
sValue=sGroupName & ";" & GetUserInfo(tab(i)) & "1"
fsoStream.WriteLine sValue
Le problème est que parfois, je récupère des données contenant des caractères spéciaux.( avec les é è â ç )
Si j'affiche la chaine via un msgbox, j'obtiens des "?" à la place de ses caractères.
Lorsque la chaine (svalue) contient ses caractères, ça fait planter la fonction writeline:
"Argument ou appel de procédure incorrect"

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 nov. 2009 à 09:40
BONJOUR
aussi
Ca m'étonnerait que des caractères accentués fassent planter une instruction.
Comment est déclaré ton fsoStream ?
Il n'existe pas de de commande WriteLine au FileSystemObject au sens VBScripting.
De quoi parles-tu ?
VB6, tu es sûr ?

Sur quelle ligne apparait cette erreur ? (sValue= ou WriteLine)
Que vaut sValue au moment de l'erreur ?
L'erreur est surement dans l'utilisation de ton GetUserInfo(tab(i)) dans sValue=
tab ressemble à une instruction/objet du langage : méfie-toi, le compilateur pourrait perdre les pédales.
Comme tu l'as fait pour ta chaine sValue (s comme String), précède le nom d'un tableau par un a comme Array --> aTab

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 nov. 2009 à 09:45
Ah si
Scripting.TextStream accepte le .WriteLine
Autant pour moi
Dommage que ce soit à moi de chercher pour comprendre ton problème ...
Essaye d'être le plus précis possible = plus de chance d'avoir une réponse plausible
0
ricomiracle Messages postés 195 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 30 novembre 2009
28 nov. 2009 à 12:00
Bonjour,

Effectivement il s'agit de la fonction writeline de l'objet textstream. J'essaie d'être aussi précis que possible mais je ne comprends pas moi même le problème exact. L'erreur intervient sur la fonction writeline. Gestuserinfo(tab(i)) n'échoue pas. Cette fonction interroge une base de donnée (LDAP) contenant des utilisateurs. tab(i) contient le login de l'utilisateur. La fonction retourne un chaine du type: "nom;prénom;métier..."
De temps en temps, le nom contient des caractères spéciaux (dans d'autre programme, le nom est mal affiché, un "ç" apparait comme un carré par exmple.
Dans ce cas la valeur sValue va contenir "Fran'ois" (ça apparait comme ça dans le debugger ou dans un msgbox). Par contre la fonction writeline n'arrive pas à l'écrire. J'ai essayer de faire un replace(svalue,"?","ç") mais ça ne marche pas (comme si le "?" n'en était pas vraiment un).

Je t'aurais bien filer mon code mais il te faudrait un annuaire LDAP identique au mien pour l'exécuter...

Merci pour votre aide en tout cas.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 nov. 2009 à 09:31
Re
Là, il faut regarder en détail ta chaine et décortiquer, caractère par caractère pour savoir quel code ASCII se cache derrière ce carré + regarder dans l'aide de la fonction WriteLine s'il y a des précautions à prendre.
Peut-être que le texte que tu lis n'a pas la bonne "page de code" (ANSI).
Voir <ce site> pour les explications.

Pour info, voilà un code permettant de "traduire" ANSI <--> ASCII
Déclarations :
Private Enum eOEMStringTypeConversion
    [ANSI to ASCII]
    [ASCII to ANSI]
End Enum
Private sASCI As String     ' Voir leur remplissage dans Ansi_Initialize
Private sANSI As String

Initialisation avant usage :
Sub Ansi_Initialize()
    ' Constantes de conversion ASCII <> ANSI
    sASCI = Chr$(132) & Chr$(148) & Chr$(129) & Chr$(225) & Chr$(142) & Chr$(153) & Chr$(154) & Chr$(128) & Chr$(130) & Chr$(131) & Chr$(133) & Chr$(134) & Chr$(135) & Chr$(136) & Chr$(137) & Chr$(138) & Chr$(139) & Chr$(140) & Chr$(143) & Chr$(144) & Chr$(147) & Chr$(150) & Chr$(151) & Chr$(20) & Chr$(145) & Chr$(146) & Chr$(155) & Chr$(156) & Chr$(166) & Chr$(167) & Chr$(171) & Chr$(172) & Chr$(237) & Chr$(241) & Chr$(246) & Chr$(253) & Chr$(21) & Chr$(157)
    sANSI =  Chr$(228) & Chr$(246) & Chr$(252) & Chr$(223) & Chr$(196) & Chr$(214) & Chr$(220) & Chr$(199) & Chr$(233) & Chr$(226) & Chr$(224) & Chr$(229) & Chr$(231) & Chr$(234) & Chr$(235) & Chr$(232) & Chr$(239) & Chr$(238) & Chr$(197) & Chr$(201) & Chr$(244) & Chr$(251) & Chr$(249) & Chr$(182) & Chr$(230) & Chr$(198) & Chr$(162) & Chr$(163) & Chr$(170) & Chr$(186) & Chr$(189) & Chr$(188) & Chr$(216) & Chr$(177) & Chr$(247) & Chr$(178) & Chr$(167) & Chr$(165)
End Sub

Fonction de conversion :
Private Function OEMConvert(ByRef Texte As String, _
                            ByVal ConvertMode As eOEMStringTypeConversion) As String
    ' Vient de source de EBartSoft : http://www.vbfrance.com/code.aspx?ID =39592
    Dim Src  As String
    Dim dest As String
    Dim r    As Long
    Dim Pos  As Long
    OEMConvert = Texte
    ' sASCI et sANSI sont renseignés dans Class_Initialize
    If (ConvertMode = [ANSI to ASCII]) Then
        Src = sANSI
        dest = sASCI
    Else
        Src = sASCI
        dest = sANSI
    End If
    For r = 1 To Len(Src)
        Do
            Pos = InStr(OEMConvert, Mid$(Src, r, 1))
            If (Pos = 0) Then Exit Do
            Mid$(OEMConvert, Pos, 1) = Mid$(dest, r, 1)
        Loop
    Next
End Function

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

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

Posez votre question
ricomiracle Messages postés 195 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 30 novembre 2009
30 nov. 2009 à 20:09
Bonjour,

Merci pour ton aide. J'ai trouvé la solution aujourd'hui. Le problème venait du format de fichier. On ouvre un fichier texte de cette manière:

Dim fso As New Scripting.FileSystemObject
Dim fsoStream As Scripting.TextStream

Set fsoStream = fso.OpenTextFile(sPath, ForWriting, True)

Mais! dans la fonction OpentextFile, il y a un argument optionnel que je ne renseignait jamais (il s'appel "format"). Par défaut (si on ne renseigne pas cet argument), le jeu de caractère utilisé est celui du système. Il faut utiliser un jeux de caractère unicode dans mon cas. L'ouverture du fichier se fait comme cela:
Set fsoStream = fso.OpenTextFile(sPath, ForWriting, True,-1)

Et là la fonction writeline ne plante plus. Cette notion de "jeux de caractère" reste flou pour moi... Mais mon programme fonctionne.

Merci
0
ricomiracle Messages postés 195 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 30 novembre 2009
30 nov. 2009 à 20:15
... Mais en lisant ton lien très intéressant, tout me semble plus clair!

Merci encore pour ton aide.
0
Rejoignez-nous