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 :

VBA : Mise en forme d'un fichier.txt importé sur Excel.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 52
    Par défaut VBA : Mise en forme d'un fichier.txt importé sur Excel.
    Bonjour,
    J'ai une macro qui me permet d'importer un fichier texte dans un fichier excel, cependant lorsque j'ai un nombre décimal à plus de 3 chiffres significatif la virgule disparaît. Ce qui fausse mon résultat une fois ma macro exécuté. (ex : au lieu de 4,994 j'ai 4994).
    Je laisse mon code ci-dessous :

    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
    34
    35
    36
    37
    38
    39
    40
    Option Explicit
    Sub Test()
    Extraction "C:\Users\stagiaire.production\Documents\FichierSortie.txt", 65536, vbTab
    End Sub
     
     
    Sub Extraction(Fichier As String, NbLignesParFeuille As Long, Separateur As Variant)
    Dim Chemin As String
    Dim Tableau() As String
    Dim ContenuLigne As String
    Dim Counter As Double
    Dim Tr As Worksheet, Tr2 As Worksheet, EC As Worksheet
    Dim intLng As Integer, intDeb As Integer, intCol As Integer
    Dim i As Integer
    Set Tr = Sheets("Travail")
    Set Tr2 = Sheets("Travail2")
    Set EC = Sheets("En cours")
        Tr.Columns("A:Z").ClearContents
        Tr2.Columns("A:Z").ClearContents
        EC.Range("A4:Z65000").ClearContents
        Application.ScreenUpdating = False
        Counter = 1
          'Ouverture du fichier txt
        Open Fichier For Input As #1
            Do While Not EOF(1)
                    If Counter > NbLignesParFeuille Then
                    Counter = 1
                    End If
                Line Input #1, ContenuLigne
                Tableau = Split(ContenuLigne, ";")
                Tr.Activate
                For i = 0 To UBound(Tableau)
                    ActiveSheet.Cells(Counter, i + 1) = Tableau(i)
                Next i
                Counter = Counter + 1
            Loop
        Close #1
        Application.ScreenUpdating = True
     
    End Sub
    Merci

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Plutôt que de passer par une lecture de fichier séquentielle, il serait plus simple de passer par la méthode OpenText de l'objet Workbooks.
    https://msdn.microsoft.com/en-us/vba...t-method-excel

    Cette méthode propose des paramètres comme DecimalSeparator et ThousandsSeparator (plus quelques autres tout aussi pratiques) qui devraient résoudre ton problème.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 52
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Plutôt que de passer par une lecture de fichier séquentielle, il serait plus simple de passer par la méthode OpenText de l'objet Workbooks.
    https://msdn.microsoft.com/en-us/vba...t-method-excel

    Cette méthode propose des paramètres comme DecimalSeparator et ThousandsSeparator (plus quelques autres tout aussi pratiques) qui devraient résoudre ton problème.
    Je t'avouerai que le code que j'ai, c'est une adaptation d'un code trouvé sur internet et de ce fait, je m'y connais pas beaucoup en importation de fichier texte.
    J'ai cependant mi les DecimalSeparator et ThousandsSeparator dans ma boucle :
    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
        Open Fichier For Input As #1
            Do While Not EOF(1)
                    If Counter > NbLignesParFeuille Then
                    Counter = 1
                    End If
                Line Input #1, ContenuLigne
                Tableau = Split(ContenuLigne, ";")
                Tr.Activate
                For i = 0 To UBound(Tableau)
                    ActiveSheet.Cells(Counter, i + 1) = Tableau(i)
                    Application.DecimalSeparator = ","
                    Application.ThousandsSeparator = ","
                    Application.UseSystemSeparators = False
                Next i
                Counter = Counter + 1
            Loop
    Mais le séparateur mais une virgule au mauvaise endroit (ex : J'ai 720,395 au lieu de 7,20395)

    Sur mon fichier Excel je suis en train de faire une mise à jour des macros qui n'était plus bonne, l'ancienne personne importé son fichier texte de cette manière :
    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
        NomFichier = ThisWorkbook.Path & "\Dossier\FichierSortie.txt"
        If Dir(NomFichier) <> "" Then   ''Test de l'existence du fichier
            With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & NomFichier, Destination:=Range("A1"))
                .Name = DateFichier
                .FieldNames = True
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .RefreshStyle = xlInsertDeleteCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .TextFilePromptOnRefresh = False
                .TextFilePlatform = 65001
                .TextFileStartRow = 1
                .TextFileParseType = xlDelimited
                .TextFileTextQualifier = xlTextQualifierDoubleQuote
                .TextFileConsecutiveDelimiter = False
                .TextFileTabDelimiter = False
                .TextFileSemicolonDelimiter = True
                .TextFileCommaDelimiter = False
                .TextFileSpaceDelimiter = False
                .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                .TextFileTrailingMinusNumbers = True
                .Refresh BackgroundQuery:=False
            End With
        End If
    Cependant une fois sur deux le fichier ne se mettait pas dans les bonnes cases, les nombres étaient séparés dans plusieurs cases.

    @dysorthographie Peux-tu m'expliquer ton code car je ne vois pas où tu veux en venir ?

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par MLvba Voir le message
    je m'y connais pas beaucoup en importation de fichier texte.
    Tout est dans le lien que j'ai donné : syntaxe, explications et exemple.

    Une fois que ton fichier texte est devenu un fichier Excel, il est bien plus simple de transférer les bonnes valeurs dans les bonnes cases.

  5. #5
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Cells(Counter, i + 1) =TrouveType(Tableau(i))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function TrouveType(V)
    TrouveType = Replace(Replace(V, " ", ""), Chr(34), "")
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 And InStr(TrouveType, ":") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd hh:mm"): Exit Function
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd"): Exit Function
    If IsNumeric(Replace(TrouveType, ".", ",")) = True Then TrouveType = Replace(TrouveType, ",", "."): Exit Function 
    End Function

  6. #6
    Invité
    Invité(e)
    Par défaut
    tu poses une question et je pense répondre correctement, voilà ou je veux en venir!

    fais au moins teste!

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    OptionExplicit
    Sub Test()
    Extraction "C:\Users\stagiaire.production\Documents\FichierSortie.txt", 65536, vbTab
    End Sub
     
     
    Sub Extraction(Fichier As String, NbLignesParFeuille As Long, Separateur As Variant)
    Dim Chemin As String
    Dim Tableau() As String
    Dim ContenuLigne As String
    Dim Counter As Double
    Dim Tr As Worksheet, Tr2 As Worksheet, EC As Worksheet
    Dim intLng As Integer, intDeb As Integer, intCol As Integer
    Dim i As Integer
    Set Tr = Sheets("Travail")
    Set Tr2 = Sheets("Travail2")
    Set EC = Sheets("En cours")
        Tr.Columns("A:Z").ClearContents
        Tr2.Columns("A:Z").ClearContents
        EC.Range("A4:Z65000").ClearContents
        Application.ScreenUpdating = False
        Counter = 1
          'Ouverture du fichier txt
        Open Fichier For Input As #1
            Do While Not EOF(1)
                    If Counter > NbLignesParFeuille Then
                    Counter = 1
                    End If
                Line Input #1, ContenuLigne
                Tableau = Split(ContenuLigne, ";")
                Tr.Activate
                For i = 0 To UBound(Tableau)
                    ActiveSheet.Cells(Counter, i + 1) = TrouveType(Tableau(i))
                Next i
                Counter = Counter + 1
            Loop
        Close #1
        Application.ScreenUpdating = True
      EndSub
    
    Function TrouveType(V)
    TrouveType = Replace(Replace(V, " ", ""), Chr(34), "")
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 And InStr(TrouveType, ":") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd hh:mm"): Exit Function
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd"): Exit Function
    If IsNumeric(Replace(TrouveType, ".", ",")) = True Then TrouveType = Replace(TrouveType, ",", "."): Exit Function
      End Function

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 52
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    tu poses une question et je pense répondre correctement, voilà ou je veux en venir!

    fais au moins teste!

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    OptionExplicit
    Sub Test()
    Extraction "C:\Users\stagiaire.production\Documents\FichierSortie.txt", 65536, vbTab
    End Sub
     
     
    Sub Extraction(Fichier As String, NbLignesParFeuille As Long, Separateur As Variant)
    Dim Chemin As String
    Dim Tableau() As String
    Dim ContenuLigne As String
    Dim Counter As Double
    Dim Tr As Worksheet, Tr2 As Worksheet, EC As Worksheet
    Dim intLng As Integer, intDeb As Integer, intCol As Integer
    Dim i As Integer
    Set Tr = Sheets("Travail")
    Set Tr2 = Sheets("Travail2")
    Set EC = Sheets("En cours")
        Tr.Columns("A:Z").ClearContents
        Tr2.Columns("A:Z").ClearContents
        EC.Range("A4:Z65000").ClearContents
        Application.ScreenUpdating = False
        Counter = 1
          'Ouverture du fichier txt
        Open Fichier For Input As #1
            Do While Not EOF(1)
                    If Counter > NbLignesParFeuille Then
                    Counter = 1
                    End If
                Line Input #1, ContenuLigne
                Tableau = Split(ContenuLigne, ";")
                Tr.Activate
                For i = 0 To UBound(Tableau)
                    ActiveSheet.Cells(Counter, i + 1) = TrouveType(Tableau(i))
                Next i
                Counter = Counter + 1
            Loop
        Close #1
        Application.ScreenUpdating = True
      EndSub
    
    Function TrouveType(V)
    TrouveType = Replace(Replace(V, " ", ""), Chr(34), "")
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 And InStr(TrouveType, ":") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd hh:mm"): Exit Function
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd"): Exit Function
    If IsNumeric(Replace(TrouveType, ".", ",")) = True Then TrouveType = Replace(TrouveType, ",", "."): Exit Function
      End Function

    Excuse moi je me suis mal exprimé, j'ai fait le test mais j'ai le même problème qu'avec l'autre méthode, il ne prend pas en compte la virgule au bon endroit.
    Cependant j'ai du mal à comprend comment ta fonction, fonctionne avec les IsDate ?

Discussions similaires

  1. Mise en forme d'un fichier txt après une extraction
    Par MCL04 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 04/07/2012, 23h16
  2. [XL-2007] Mise en forme apres insersion fichier txt
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/12/2011, 19h53
  3. Mise en forme - Export en fichier txt
    Par Rikou31 dans le forum IHM
    Réponses: 3
    Dernier message: 20/08/2008, 12h21
  4. [VBA] Mise en forme d'un fichier Excel depuis Access
    Par morgiane dans le forum Access
    Réponses: 2
    Dernier message: 25/07/2007, 10h32
  5. [VBA]Mise en forme de fichier Ecxel aprés exportation
    Par taisherg dans le forum VBA Access
    Réponses: 3
    Dernier message: 04/05/2007, 15h40

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