IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Probleme lors d'une conversion d'un fichier .xls vers .cvs [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Probleme lors d'une conversion d'un fichier .xls vers .cvs
    Bonjour tout le monde,

    Je vais essayer de vous exposer mon problème.

    Dans un fichier Source Excel (stocker sur le réseau de l'Entreprise )j'exécute une macro qui a pour but de traité les données, puis de les mettre en forme et enfin de les enregistrer au format csv.

    Il faut savoir que ce fichier peut générer entre 20 et 50 fichiers csv qui sont mis sur le réseau.

    Donc dans "Feuil1" j'ai mes données. Je sélectionne une partie de ces données que j'importe dans une "Feuil2". Dans la "Feuil2" je traite ces dernières et une fois fini j'enregistre cette "Feuil2" au format csv avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.SaveAs ("réseau/nomduclasseur.csv"), xlCSV
    Mon premier problème :

    - Lorsque j'ouvre le fichier csv nouvellement créer j'ai comme séparateur des virgules alors que je souhaite avoir des points virgules. Pourtant je suis aller dans panneau de configuration, options régionales et linguistiques. Et j'ai bien tout en français. J'ai même mis le séparateur de décimal en "." et le séparateur de liste ";". Car j'ai lu que cela pouvait être une source de problème.

    Mon deuxième problème :

    S'illustrera plus facilement avec un exemple. Quand j'ouvre mon fichier csv avec un bloc note j'obtiens le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TOTO,,,,,,,
    TITI,,,,MEME,,,
    etc....
    Pour rappel je voudrais avoir des ";" à la place de ",". Ensuite je cherche à supprimer les virgules en rouge dans mon exemple. D'après ce que j'ai compris c'est que Excel 2003 traite les données par bloc de 16 lignes par 16 colonnes. Et le nombre de "," en trop à la fin de chaque ligne est du au fait qu'une donnée de cellule se trouve en colonne "H" dans le bloc 16x16.

    j'ai essayé différentes solutions qui consistent :

    - Effectivement, encadrer les données (un encadrement globlal de la zone
    suffit) je n'arrive pas à mettre en pratique cette solution, ne la comprenant pas
    - Appliquer un Format/Cellule/Nombre quelconque à l'ensemble de la plage
    vide
    - Remplir les cellules vides par un espace

    Pour selectionner d'un coup les cellules vides :
    - Se mettre sur une cellule
    - Touche F5
    - cliquer Cellules
    - Cocher "Cellules vides"
    - OK

    Si vous pouviez m'éclairer s'il vous plaît, car je coule un peu sur ce problème.
    Je n'ai peut être pas bien chercher sur le forum, mais je n'ai pas trouvé de solution. Par contre n'ayant pas le net, je ne pourrais répondre quand HO.

    Merci pour votre patience,

    cordialement,

  2. #2
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    j'ai comme séparateur des virgules alors que je souhaite avoir des points virgules.
    tu devrais peut-être mettre l'argument Local de SaveAs à True ?

    Local Argument de type Variant facultatif. La valeur True enregistre les fichiers en fonction de la langue de Microsoft Excel (y compris les paramètres du Panneau de configuration). La valeur False (valeur par défaut) enregistre les fichiers en fonction de la langue de Visual Basic pour Applications (VBA) (qui est généralement l'anglais des États-Unis, sauf si le projet VBA où Workbooks.Open est exécuté est un ancien projet VBA XL5/95 de niveau international).

    Exemple
    cordialement,

    Didier

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci, effectivement cela marche beaucoup mieux maintenant. Mon problème de type de séparateur est résolu maintenant. Par contre auriez vous une idée quant à la suppression des ";" en trop?

    Cordialement,

  4. #4
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Par contre auriez vous une idée quant à la suppression des ";" en trop?
    Non car problème impossible à répliquer, OK chez moi..

    Donnes un exemple de code (entre balises) et de structure de tes données ?

    Didier

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    D'après ce que j'ai compris ce problème serait inhérent à Excel 2003. Lorsque le fichier au format csv est crée j'ai bien les données du type (en l'ouvrant ) avec excel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TOTO
    TITI         MEME
    ....
    mais quand je l'ouvre avec un éditeur de texte j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TOTO;;;;;;;
    TITI;;;MEME;;;
    Pour l'instant j'ai essayé une méthode qui consiste à supprimer les cellules vide à la suite des données, Avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    If InfoDO = "Nord" Then
        Worksheets("Feuil2").Copy
            ActiveWorkbook.SaveAs ("reseau" _
            & NomFichier & "_2-12_maxi_" & DateDujour & ".csv"), xlCSV, local:=True
        NomFeuil = NomFichier & "_2-12_maxi_" & DateDujour
        
        NbLigneCree = Worksheets(NomFeuil).Range("A1").CurrentRegion.Rows.Count
        NbLigneCree = NbLigneCree + 1
        Worksheets(NomFeuil).Rows(NbLigneCree & ":" & 65536).Select
        Selection.Delete
        Worksheets(NomFeuil).Range("B1:IV2").Select
    '    Selection.SpecialCells(xlCellTypeBlanks).Select
        Selection.Delete Shift:=xlToLeft
        Worksheets(NomFeuil).Range("G3:IV3").Select
        'Selection.SpecialCells(xlCellTypeBlanks).Select
        Selection.Delete Shift:=xlToLeft
        Worksheets(NomFeuil).Range("B4:IV4").Select
    '    Selection.SpecialCells(xlCellTypeBlanks).Select
        Selection.Delete Shift:=xlToLeft
        ActiveWorkbook.Close
    End If
    Application.DisplayAlerts = True
    Mais sans effet, car le fichier (.CSV) créé sera utilisé par d'autre service et utilisé au format (.txt). La ligne en bleu dans le code permet de supprimer les ";" en fin de feuille =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TOTO;;;;;;;
    TITI;;;;MEME;;;
    ...
    TATA;;;;
    ;;;;;;;;;;;
    ;;;;;;;;;;;
    ;;;;;;;;;;; ' ces ; sont effacés grâce au code en bleu
    Mais le reste du code ne marche pas pour les données précédentes.
    Je ne vois pas ce qui peut clocher.

    Cordialement,

  6. #6
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Ok ton souci est qu'il y a des cellules vides.

    Donc, il est normal que ton export en tienne compte, sinon si tu réimporte sous forme de tableau, tu auras des décalages de données

    Le plus simple serait de dire ce que tu veux obtenir plutôt que ce qui ne va pas

    Est ce que tu veux une suite de données séparées par des virgules qui ne tiennent pas compte de blancs ? et cette suite serait construite de droite à gauche, du haut en bas ect....

    cordialement,

    Didier

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bon je vais essayer d'être concis (en un mot).

    Il faut que mon export ait le même format que les données initiales, les emplacement de cellules des données doit être respecté.

    donc ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TOTO;;;;;;;                  ' ligne 1
    TITI;;;MEME;;;              ' ligne 2
    TATA;TOTO;LEO;;GUY;;
    COCO;;;;RAPE;;;
    et ce que je voudrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TOTO                        ' ligne 1
    TITI;;;MEME               ' ligne 2
    TATA;TOTO;LEO;;GUY
    COCO;;;;RAPE
    ect....
    c'est à dire que MEME se retrouve bien en cellule "D2" et ainsi de suite et lorsque j'ouvre le fichier csv avec un bloc note je n'ai plus de ";" à la suite de MEME...

    Donc dans une ligne quelconque, il faudrait qu'a la suite de la dernière donnée non vide je n'ai plus de ";" parasite.
    Sachant que les données sont dynamiques.
    Je ne sais pas si cela reste claire.

  8. #8
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Ok ton premier message avec les virgules en rouge était explicite finalement, mais je n'ai pas impacté

    Je pense savoir d'où ça provient, tu as des cellules vides fantômes sur tes fins de lignes...

    Ca provient de données mises en forme et supprimées ou simplement de mises en formes supprimées, de formules qui traînent etc..

    solution, si ta plage est rectangulaire, tu sélectionnes les colonnes à droite de ta fin et tu les supprimes.

    Tu fermes ton fichier et Excel et tu relances et tu testes, tu ne dois avoir aucun ";" en fin de ligne / csv

    cordialement,

    didier

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    C'est ce que j'ai essayé de faire, car le début de la feuille reste inchangé.
    Donc une fois le fichier CSV créé, j'ai voulu supprimer les ces cellules vides directement dans le fichier CSV. Comme on peut le voir dans mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    If InfoDO = "Nord" Then
        Worksheets("Feuil2").Copy
            ActiveWorkbook.SaveAs ("reseau" _
            & NomFichier & "_2-12_maxi_" & DateDujour & ".csv"), xlCSV, local:=True
        NomFeuil = NomFichier & "_2-12_maxi_" & DateDujour
     
        NbLigneCree = Worksheets(NomFeuil).Range("A1").CurrentRegion.Rows.Count
        NbLigneCree = NbLigneCree + 1
        Worksheets(NomFeuil).Rows(NbLigneCree & ":" & 65536).Select
        Selection.Delete
        Worksheets(NomFeuil).Range("B1:IV2").Select
        Selection.Delete Shift:=xlToLeft
        Worksheets(NomFeuil).Range("G3:IV3").Select
        Selection.Delete Shift:=xlToLeft
        Worksheets(NomFeuil).Range("B4:IV4").Select
        Selection.Delete Shift:=xlToLeft
        ActiveWorkbook.Close
    End If
    Application.DisplayAlerts = True
    Mais sans effet. Cela ne marche pas. Mais je vais essayé de le faire directement dans le fichier Excel avant la création du fichier en CVS et puis après sa création. On va bien voir.

  10. #10
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    essayes en remplaçant tes Delete par Clear !!

    Didier

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Sans effet !!!

    Une autre idée peut être , je suis preneur, mais ça on s'en doute déjà.

    Cordialement,

  12. #12
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    mets en PJ un fichier Excel que tu obtiens et qui pose problème quand tu l'enregistres en csv.

    tu remplaces les données par toto1 etc sauf en bout de lignes, tu ne met que 30 lignes significatives, tu vérifies qu'il pose problème avant de l'envoyer...

    Didier

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Zipper c'est mieux.
    Fichiers attachés Fichiers attachés

  14. #14
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Je ne sais pas comment faire effectivement.

    Ce que je constate par contre :

    Ca ne sert à rien de triturer sous Excel, quand tu exportes en csv, il crée une matrice rectangulaire et remplace les cellules vierges par des vides jusqu'à l'extrémité des lignes "incomplètes".
    Donc longueur mini de ligne = longueur de la ligne la plus grande de ta zone.

    Pirouette possible :

    En vba tu remplis toutes tes cellules vierges de fin de ligne par rapport au rectangle de ta zone avec un chaîne de caractères improbable à trouver dans tes fichiers par exemple "@@".

    Ensuite sous le Bloc-note, tu fais remplacer ";@@" par rien et tu obtiens le fichier voulu. (à noter qu'avec Notepad +, on peut faire des macros (pas testé)).

    PS : Le comportement est identique sous Excel 2007.

    cordialement,

    Didier

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Bon je vais essayé de trouver une autre alternative.

    j'ai essayé aussi la fusion des cellule contiguës sur les lignes lorsque celles-ci sont vides, mais sans effet.

    Maintenant il ne me reste plus qu'a me documenter sur Notepad + et savoir si ce dernier peut être piloter par VBA.

    En tout cas merci pour ton aide,

    j'espère que mes recherches seront plus fructueuse,

    Je clos le sujet,

    Cordialement,

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    j'ai pu glané une solution.

    Pour ce faire il faut déclarer une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Declare Function GetTickCount Lib "kernel32" () As Long
    Option Explicit
    on déclare les variables pour la réalisation de l'opération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim Chaine As String, sNomFichierCorr As String
    Dim Debut As Long, Fin As Long
    Dim Cpt As Long
    Dim Temps As Double
    ensuite après avoir sauvegarder le fichier Excel au format cvs on fait :
    Pour cela j'ai utilisé la méthode de Didier qui consiste à remplir les cellules parasites par "@@" grâce à une routine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     Worksheets("Feuil2").Copy
            ActiveWorkbook.SaveAs ("reseau" _
            & NomFichier & "_2-12_maxi1_" & DateDujour & ".csv"), xlCSV, local:=True
        NomFeuil = NomFichier & "_2-12_maxi1_" & DateDujour
     
        NbLigneCree = Worksheets(NomFeuil).Range("A1").CurrentRegion.Rows.Count
        NbLigneCree = NbLigneCree + 1
        Worksheets(NomFeuil).Rows(NbLigneCree & ":" & 65536).Select
        Selection.Delete
     
           Application.StatusBar = ""
        Debut = GetTickCount
        Cpt = 0
        Close
     
        sNomFichierCorr =  NomFichier & "_2-12_maxi_" & DateDujour & ".csv"
        Open NomClasseur For Input As #1
            Open sNomFichierCorr For Output As #2
                Do
                    Cpt = Cpt + 1
                    Line Input #1, Chaine
     
                    Chaine = Replace(Chaine, Chr(59) & Chr(64) & Chr(64), "")
                    Chaine = RemoveSpc(Chaine)
     
                    Print #2, Chaine
                    Application.StatusBar = Cpt
                Loop Until EOF(1)
            Close #2
        Close #1  
        Fin = GetTickCount
        ActiveWorkbook.Close
    Et on déclare la fonction pour la mise en forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Function RemoveSpc(ByVal s As String) As String
    Dim Pos As Integer
        s = Trim(s)
        Do
            Pos = InStr(s, "  ")
            s = Replace(s, "  ", " ")
        Loop Until Pos = 0
        RemoveSpc = s
    End Function
    Je ne sais pas si je peux mettre le lien d'où j'ai trouvé l'info?

    En tout cas cela génère deux classeurs cvs, il suffit de supprimer le classeur qui fait office de tampon.

    je pense qu'il y a beaucoup plus simple mais il j'ai adapté la solution comme j'ai pu.

    En espérant que cela puisse aider d'autres personnes.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/08/2011, 14h07
  2. Probleme lors d'une lecture de fichier XML VB2010
    Par nimbus629 dans le forum VB.NET
    Réponses: 6
    Dernier message: 17/06/2011, 12h51
  3. Réponses: 4
    Dernier message: 30/07/2009, 22h46
  4. Réponses: 13
    Dernier message: 10/05/2004, 16h49
  5. problem lors de l'ecriture d'un fichier
    Par gemai dans le forum C
    Réponses: 20
    Dernier message: 29/08/2003, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo