Ouverture, modification, et enregistrement du'un fichier CSV

Résolu
botbot1607 - 7 janv. 2013 à 17:24
 botbot1607 - 9 janv. 2013 à 14:40
Bonjour à tous,

Voilà, je suis confronté à un petit problème :

J'ai une appli qui ouvre un fichier .csv "source", qui copie les données qu'il contient vers un second fichier excel, je modifie quelques valeurs de ce fichier avec un coeff, et je l'enregistre vers un dossier spécifique en .csv

Voici le code :

 '----------------------Création TABLE 1--------------------
        'Ouverture table source
        'Try
        excel.Workbooks.Open(CheminTableModele & tablesource1)
        'Catch ex As Exception
        'MsgBox("Accès impossible aux tables sources, vérifier leurs emplacements.", vbCritical, "Erreur d'accès au fichier")
        'Exit Sub
        'End Try


        nomfichiersource = excel.ActiveWorkbook.Name
        t = Len(nomfichiersource)
        nomfichiersource = Mid(nomfichiersource, 1, t - 4)

        'Copies données
        excel.Range("A1:I105").Copy()
        excel.Application.DisplayAlerts = False
        excel.ActiveWorkbook.Close(SaveChanges:=False)
        'Création nouvau Tableur Excel
        excel.Workbooks.Add()
        excel.Sheets("Feuil1").Select()

        nomfichiercorrigé = excel.ActiveWorkbook.Name
        'Collage données
        excel.ActiveSheet.Paste()
        excel.Selection.NumberFormat = "0"
        r = excel.Range("B2:B105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale1
            End If
        Next
        r = excel.Range("C2:C105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale2
            End If
        Next
        r = excel.Range("D2:D105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale3
            End If
        Next
        r = excel.Range("E2:E105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale4
            End If
        Next
        r = excel.Range("F2:F105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale5
            End If
        Next
        r = excel.Range("G2:G105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale6
            End If
        Next
        r = excel.Range("H2:H105")
        ' pour chaque cellule
        For Each c In r
            If c.Value Mod 60 <> 0 Then
                ' Si on veut on peut passer par une variable pour le calcul
                c.Value = c.Value * CoeffTemp1Focale7
            End If
        Next

        'Sécurité 250

        
        If excel.Application.WorksheetFunction.CountIf(excel.Range("A1:H105"), ">250") > 0 Then
            MsgBox("Attention : Valeur de tables maximale atteinte (=250), poursuite de création des tables, mais éclairement de l'éclairage + D25/D10 à vérifier !", vbOKOnly + vbInformation, "Avertissement")
            For Each Cellule In excel.Range("A1:H105")
                i = i + 1
                If Cellule.Value > 250 Then
                    Cellule.Value = "250"
                End If
            Next Cellule
        End If

        'Enregistrement

        NomFichier = nomfichiersource
        chemintabledestination = chemintables & dossiertable
        'excel.ActiveWorkbook.Save()
        'excel.ActiveWorkbook.SaveCopyAs(chemintabledestination & "" & NomFichier & ".csv")
        excel.ActiveWorkbook.SaveCopyAs(chemintabledestination & "" & NomFichier)
        excel.ActiveWorkbook.Close()

        'FIN Table 1


Sauf que voilà, quand il enregistre, et que j'ouvre le fichier csv, j’obtiens par exemple dans la colonne A :

"0;183;138;92;63;48;43;42;0"

Alors que je voudrais :

En colonne A : 0, B : 183, C : 138.....

J'ai fait il y a peu de temps, une appli similaire mais en VBA. Celle ci m'enregistrait bien le fichier en csv, mais sans ces fichus séparateurs ";" !

Quelqu'un aurait il une piste pour m'aider ?

Merci beaucoup !

5 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
8 janv. 2013 à 19:28
Les constantes Excel ne sont, en effet, pas reconnues dans le monde .Net, c'est normal.
Il te suffit d'aller dans la fenêtre de débogage du VBA de Excel et de demander l'affichage de la valeur numérique que cette constante représente :
? xlCSV
qui te renverra le chiffre 6.
Soit tu mets 6, soit tu te crées une constante perso.

Mais les fichiers CSV sont, par définition, des fichiers à séparateurs point-virgule.
Les fichiers à séparateur tabulation sont des fichiers texte ... mais rien ne t'empèche de l'appeler .CSV si tu le souhaites. La seule chose que cela change, c'est la méthode de sauvegarde :
ActiveWorkbook.SaveAs Filename:="C:\Users\Jack\Desktop\Classeur1.txt", _
        FileFormat:=xlText, CreateBackup:=False
où xlText vaut le chiffre -4158

Pour info, cette syntaxe est issue de Excel 2010, compatible avec 2003, mais les choix de type de fichiers sont légèrement mieux documentés lorsque tu fais un SaveAs
3
Bien vu !

J'ai fait ce que tu m'as dis, le .csv renvoie bien 6.
J'ai essayé en csv "DOS" (variable 24), et là impeccable, avec le mode local = True, j'ai bien les séparations avec un tab.

Au cas où, mon code :

 Dim xlCSVWindows As Integer = 24
        excel.ActiveWorkbook.SaveAs(Filename:=chemintabledestination & "" & NomFichier & ".csv", FileFormat:=xlCSVWindows, Local:=True)


Merci et bonne journée !
3
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
8 janv. 2013 à 09:29
Salut

Dans ton exemple, tu ouvres un fichier CSV et les données sont stockées dans une feuille Excel.
Au moment du "SaveAs", tu as donc des cellules normales à stocker sous forme CSV.
Donner l'extension .CSV a un fichier ne suffit pas à définir son type. Le SaveAs ne suffit pas, il faut aussi lui préciser le type de séparateur choisi (tabulation, point-virgule ...).
Enregistre une macro dans Excel pendant que tu fais toi même un enregistrement de fichier CSV et tu auras la syntaxe VBA que tu pourras ainsi transcrire dans ton code en .Net

As-tu rendu obligatoire la déclaration des variables (avec Option Explicit) ?
Je te le conseille fortement.

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 le partage (Socrate)
0
Bonjour, merci pour ta réponse.

J'ai fait la manip', voici le code VBA qui en résulte :

    ActiveWorkbook.SaveAs Filename:= _
        "C:\Documents and Settings\jbotreau\Bureau\pgmX3_T1a.csv", FileFormat:=xlCSV _
        , CreateBackup:=False


Pour l'adapter au VB.Net, j'ai retranscris en :

excel.ActiveWorkbook.SaveAs(Filename:="C:\Documents and Settings\xxxx\Bureau\pgmX3_T1a.csv", FileFormat:=xlCSV, CreateBackup:=False)


Mais visiblement dans VB.Net l'élément "ActiveWorkbook.SaveAs" ne prend pas de paramètres "Fileformat" ? j'ai l'impression qu'il n'a qu'un paramètre "Fileformat".
Ce code est donc incompatible VB.NET ?...

Merci
0

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

Posez votre question
Un peu de nouveau : J'ai réussi à spécifier le format du fichier de cette manière :

Dim xlCSVWindows As Integer = 1

        excel.ActiveWorkbook.SaveAs(Filename:=chemintabledestination & "" & NomFichier & ".csv", FileFormat:=xlCSVWindows, Local:=False)


Mais, il me met toujours des ";" en séparateur au lieu des tab
0
Rejoignez-nous