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 :

Contenu d'une feuille Excel dans un fichier .txt en concervant le format des cellules - optimisation


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Contenu d'une feuille Excel dans un fichier .txt en concervant le format des cellules - optimisation
    Bonjour,

    Je dois régulièrement transformer des feuilles Excel en fichier .TXT avec comme caractéristique de conserver le format des nombres choisi dans Excel. Si par exemple la cellule est une date, je veux que le nombre soit écrit en format DATE dans le .TXT.

    Voici le script (simplifié) que j'utilise :
    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
    Sub ecrireFichierTxt()
        'macro qui transforme une feuille Excel en fichier .txt
        'avec conservation du format choisi par l'utilisateur dans Excel
     
        Dim Time As Single
        Time = Timer
     
        strFichier = "test.txt"
     
        'Efface le fichier s'il existe car parfois plantage
        On Error Resume Next
        Kill strFichier
        On Error GoTo 0
        Open strFichier For Output As #1
     
        'Ecriture ligne par ligne
        For i = 1 To 5000
            Texte = ""
            For j = 1 To 10
                'recuperation de la valeur et du format
                Texte = Texte & Right$(Space$(10) & Format(Cells(i, j).Value, Cells(i, j).NumberFormat), 10)
            Next j
            Print #1, RTrim(Texte)
        Next i
     
        'fermeture du fichier .txt
        Close #1
     
        Debug.Print "tps non opti : " & Timer - Time
        'temps d'exécution = 1.8s
    End Sub
    Cependant, mes fichiers sont parfois très volumineux (plusieurs 10aines de milliers de lignes, plusieurs feuilles Excel, ...) et la macro prend donc un temps non négligeable pour s'effectuer.

    Après renseignement sur internet, j'ai lu que l'accès à la feuille Excel était très gourmand en temps, et qu'il valait mieux n'utiliser qu'une commande pour aller chercher toutes les valeurs dans le classeur Excel. J'ai donc remplacé la partie centrale de mon code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    valeursExcel = Range(Cells(1, 1), Cells(5000, 10))
     
        'Ecriture ligne par ligne
        For i = 1 To 5000
            Texte = ""
            For j = 1 To 10
                ' cette technique ne fonctionne pas avec NumberFormat...
                ' Texte = Texte & Right$(Space$(10) & Format(valeursExcel(i, j).Value, valeursExcel(i, j).NumberFormat), 10)
                Texte = Texte & Right$(Space$(10) & valeursExcel(i, j), 10)
            Next j
            Print #1, RTrim(Texte)
        Next i
     
     'temps d'exécution = 0.7s
    Ca fonctionne très bien (temps divisé par 2 voir plus). Cependant le format n'est pas recopié... et ça ne me convient pas.

    J'ai donc opté pour une 3eme solution, qui est un compromis des 2 précédentes, mais naturellement la vitesse d'exécution est peu satisfaisante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        valeursExcel = Range(Cells(1, 1), Cells(5000, 10))
     
        'Ecriture ligne par ligne
        For i = 1 To 5000
            Texte = ""
            For j = 1 To 10
                ' Texte = Texte & Right$(Space$(10) & Format(valeursExcel(i, j).Value, valeursExcel(i, j).NumberFormat), 10)
                Texte = Texte & Right$(Space$(10) & Format(valeursExcel(i, j), Cells(i, j).NumberFormat), 10)
            Next j
            Print #1, RTrim(Texte)
        Next i
     
     'temps d'exécution = 1.5s

    Je joins un fichier exemple avec les 3 variantes de ma macro.

    Question :
    La 2eme méthode expliquée ci-dessus est beaucoup plus rapide, mais ne permet pas de prendre en compte le format.
    Comment puis-je faire pour recopier le format efficacement ?
    Existe-t-il une méthode analogue à celle utilisé pour récupérer toutes les valeurs d'un coup mais avec le format ?

    Merci d'avance,
    Corentin
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour, bonjour !

    Au lieu de la propriété .Value utiliser la propriété .Text d'une cellule !

    __________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    Au lieu de la propriété .Value utiliser la propriété .Text d'une cellule !
    Merci pour cette première réponse, c'est une piste que je n'avais pas encore explorer.

    Mais est-il possible avec la propriété .Text de récupérer tout le contenu de la feuille Excel d'un coup ?
    Ceci ne fonctionne pas par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeursExcel = Range(Cells(1, 1), Cells(5000, 10)).Text
    Et ceci non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte = Texte & Right$(Space$(10) & valeursExcel(i, j).Text, 10)

    Du coup je dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For i = 1 To 5000
            Texte = ""
            For j = 1 To 10
                Texte = Texte & Right$(Space$(10) & Cells(i, j).Text, 10)
            Next j
            Print #1, RTrim(Texte)
        Next i
    Ce qui ne me fait pas gagner de temps.

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut



    Seules les propriétés Value & Value2 permettent d'affecter une variable tableau.

    La priorité n'est pas de gagner du temps mais bien de conserver le format !

    Possibilité d'affecter une variable tableau dans un premier temps puis forcer certaines colonnes avec la propriété Text
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    La priorité n'est pas de gagner du temps mais bien de conserver le format …
    Tout à fait, néanmoins j'espère quand même trouver une astuce pour pouvoir gagner du temps (le fichier exemple est petit comparé au fichier que j'ai l'habitude d'utiliser).

    Il n'existe donc pas un moyen de limiter le nombre d'accès "VBA <-> feuille Excel" pour récupérer le "format" de plusieurs cellules ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/07/2015, 15h14
  2. Réponses: 14
    Dernier message: 02/04/2015, 15h49
  3. Réponses: 2
    Dernier message: 27/06/2014, 18h24
  4. [Toutes versions] Copier une valeur excel dans un fichier .txt
    Par mentat dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/03/2010, 21h05
  5. Ecrire une plage excel dans un fichier txt
    Par kuma_buzz dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/05/2008, 11h48

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