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 :

Insersions de nouvelles colonnes sur un Fichier texte


Sujet :

Macros et VBA Excel

  1. #1
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut Insersions de nouvelles colonnes sur un Fichier texte
    Bonjour Forum,

    J'ai un fichier texte qui fait 29 colonnes, je voudrais insérer les 4 nouvelles colonnes se trouvant sur ma feuille Excel et contenant 361 lignes à partir de ma 18 ieme colonne.

    Mon Fichier texte est numéroté par la deuxième colonne intitulée "period" qui va de 0 à 360 pour reprendre encore de 0 à 360 jusqu'a la fin du fichier qui peut faire facilement 1000000 lignes.

    Je joint à ce post un exemple

    Merci d'avance

  2. #2
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    Il y a 2 solutions pour le faire

    Tout d’abord on créer un fichier txt avec les nouvelles valeurs

    1er solution :
    On lit le fichier en le décomposant avec la méthode
    Et à la 28ème on intercale les valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Split(Lecture, ";")(27)
    Et on réécrit la ligne dans un fichier temporaire

    Une fois terminé on détruit le fichier d’origine et on renomme le fichier temporaire

    2ème on requête en bloque on lit les enregistrements
    On reconstruit la ligne et après le 28ème champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Requete.Fields(27).Value
    on intercale les nouvelles valeurs

    Et on réécrit la ligne dans un fichier temporaire

    Une fois terminé on détruit le fichier d’origine et on renomme le fichier temporaire

    Je te regarde cela ce week end, si je peux

    A+

  3. #3
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    D'accord Monsieur JP, Moi de mon côté, même si je suis pessimiste je vais essayer le weekend de m'y mettre, pour voir si je vais arriver à réussir la deuxième méthode que tu as proposé
    je te joint tout de même une 20 ligne du fichier texte
    Bon weekend end JP
    et merci !!!!!!!!!!!!!!!!!!!!!!
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    Je suis parti sur la 1er solution ce sera la plus rapide (lecture du fichier)
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Option Explicit
    Option Base 1
    Sub MonTest()
                                    Dim Appli                   As Object
                                    Dim Creation                As Object
     
                                    Dim Chemin                  As String
                                    Dim NomFichier              As String
     
                                    Dim CompA                   As Integer
                                    Dim CompB                   As Integer
     
                                    Dim ind                     As Integer
                                    Dim Lecture                 As String
                                    Dim LectureTemp             As String
     
        Dim TableauSpread(362) As String ' 361 + 1 pour la ligne entête
        With Sheets("Spread") ' je considère les valeurs sur les colonnes A,B,C,D
            For CompA = 1 To 362 ' on stock les nouvelles valeurs dans un tableau sous forme de ligne
                For CompB = 1 To 4
                    Lecture = Lecture & ";" & .Cells(CompA, CompB)
                Next CompB
                Lecture = Mid(Lecture, 2) ' Enleve le ; mis par défaut au début de Lecture
                TableauSpread(CompA) = Lecture
                Lecture = ""
            Next CompA
        End With
    ' Les chemins (Faire attention)..........................
    ' ceux là ce sont les miens..............
        Chemin = "E:\"
        NomFichier = "Base.txt"
     
        Set Appli = CreateObject("Scripting.FileSystemObject")
     
        Set Creation = Appli.CreateTextFile(Chemin & "TempB.txt", True) ' On créer TempB
        Open Chemin & NomFichier For Input As #1 ' On ouvre notre fichier
            Do While Not EOF(1) ' On lit notre fichier
                Input #1, Lecture ' on lit la ligne
                    ind = ind + 1 ' on incrémente
     
                    For CompA = 0 To 17 ' on réécrit la premiere Partie
                        LectureTemp = LectureTemp & ";" & Split(Lecture, ";")(CompA)
                    Next CompA
     
                    LectureTemp = LectureTemp & ";" & TableauSpread(ind) ' on intercale
     
                    For CompA = 18 To 28
                        LectureTemp = LectureTemp & ";" & Split(Lecture, ";")(CompA) ' on réécrit la dernière Partie
                    Next CompA
     
                    LectureTemp = Mid(LectureTemp, 2) ' Enleve le ; mis par défaut au début de LectureTemp
                    Creation.Write LectureTemp & vbCrLf ' on écrit la ligne dans TempB
     
                    If ind = 362 Then ind = 1  'on remet le compteur à 1 (ne pas reprendre la ligne d'entête) pour la première lecture
     
                    LectureTemp = "" 'on efface la valeur LectureTemp
            Loop ' et on recommence
        Close #1 ' On ferme notre fichier
     
    ' On ferme et on déinstancie
        Creation.Close
        Set Creation = Nothing
     
    ' ceux là ce sont les miens..............
        Kill Chemin & "Base.txt" ' On supprime le fichier de base
        Name Chemin & "TempB.txt" As Chemin & "Base.txt" ' on renomme le fichier Temporaire
    End Sub
    J’ai testé

    Tu dis

  5. #5
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    Bonjour JP,
    Lorsque j’exécute le code ce message d'erreur s'affiche au niveau de cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LectureTemp = LectureTemp & ";" & Split(Lecture, ";")(CompA)
    "
    erreur d’exécution '9'
    L'indice n'appartient pas à la sélection.
    "
    Par ailleurs un autre problème Les colonnes à integrées ne se suivent pas et ne se situent pas aux colonnes A,B ,C et D .Mais aux colonnes B, D , F et H du cou j'ai pensé à mettre
    Cordialement,

  6. #6
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    Bonjour

    Lorsque j’exécute le code ce message d'erreur s'affiche au niveau de cette ligne de code:
    LectureTemp = LectureTemp & ";" & Split(Lecture, ";")(CompA)
    Dans quelle boucle, quelle est la valeur de CompA, Lecture à bien des ;
    Passe ta souris sur les noms des variables tu auras l'indication

    Tu dis

    A+

  7. #7
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    Oui Lecture a bien des ;
    CompA= 1

  8. #8
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    Il prend 0 et pas 1 ???

    Dis moi ce que donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For CompA = 0 To 17 ' on réécrit la premiere Partie
    Msgbox Split(Lecture, ";")(CompA)
                        LectureTemp = LectureTemp & ";" & Split(Lecture, ";")(CompA)
    Next CompA
    tu dis

  9. #9
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    Lorsque j'excute le code sa m'affiche en message:
    "iteration"

  10. #10
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    Et avec CompA = 1 il ne te prend pas period ?????????

    ça je ne comprends pas

    Ouvre tu fichier Txt et donne la première ligne

  11. #11
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    Mille excuse JP .
    Le problème venait des noms de mes colonnes . C'est rectifié et sa marche !
    Mais les colonnes que je veux insérer ne se trouve pas successivement dans les colonnes Excel A,B,C et D mais plutôt dans les colonnes B,D,F et H.
    En réalité je voudrai faire deux macro une pour insérer juste les colonnes B,D, F, et H et une autre qui inserre les colonnes B,C,D,E,F et I successivement.
    l'idéal serait que je fasse une seule macro qui propose une option soit pour la première insertion de colonne soit pour la seconde insertion.
    Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!!!!!

  12. #12
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    Sans aller très loin: avec un Msgbox

    Si Oui : Choix 1 (colonnes B,D,F et H)
    si Non : Choix 2 (colonnes B,C,D,E,F et I successivement)


    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
        Dim TableauSpread(362) As String ' 361 + 1 pour la ligne entête
     
                                    Dim Reponse                As Boolean
                                    Dim Choix                   As Byte
     
        Reponse = MsgBox("Choix 1 ?", vbYesNo + vbQuestion, "Choix 1(BDFH)-Choix 2(BCDEF+I)")
        If Reponse = vbYes Then    ' L'utilisateur a choisi Oui.
            Choix = 1
        Else    ' L'utilisateur a choisi Non.
            Choix = 2
        End If
     
        With Sheets("Spread") ' je considère les valeurs sur les colonnes A,B,C,D
            For CompA = 1 To 362 ' on stock les nouvelles valeurs dans un tableau sous forme de ligne
     
               Select Case Choix
                Case 1
                     For CompB = 2 To 8 Step 2
                         Lecture = Lecture & ";" & .Cells(CompA, CompB)
                     Next CompB
                 Case 2
                     For CompB = 2 To 6
                         Lecture = Lecture & ";" & .Cells(CompA, CompB)
                     Next CompB
                     Lecture = Lecture & ";" & .Cells(CompA, 9)
                End Select
     
                Lecture = Mid(Lecture, 2) ' Enleve le ; mis par défaut au début de Lecture
                TableauSpread(CompA) = Lecture
                Lecture = ""
            Next CompA
        End With
    Tu dis

    une autre solution avec un InputBox


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    Dim Message                 As String
                    Dim Choix                   As Byte
     
    Message = "Entrez votre Choix" & Chr$(10) & _
            " Coix 1 colonnes B,D,F et H" & Chr$(10) & _
            " Coix 2 colonnes B,C,D,E,F et I"
     
    Choix = InputBox(Message, "", "1")

  13. #13
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    Autant pour moi
    je voulais dire les colonnes B,C, D, E,F,G ,H et I .

  14. #14
    Membre Expert Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Par défaut
    et bien


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                 Case 2
                     For CompB = 2 To 9
                         Lecture = Lecture & ";" & .Cells(CompA, CompB)
                     Next CompB
    Tu dis

  15. #15
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 232
    Par défaut
    Merci énormément Jean-Pierre.
    Sur les astuces et la manière de s'y prendre concernant les fichiers textes grâce à VBA . Cette discussion est une référence pour quiconque voudra manipuler des fichiers texte .
    encore une fois merci JP.

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

Discussions similaires

  1. [API Windows] Ecrire a la suite sur un fichier texte
    Par pauledmond dans le forum Windows
    Réponses: 3
    Dernier message: 06/06/2007, 12h45
  2. lire/écrire sur un fichier texte sur un serveur distant
    Par nabmoah dans le forum Visual C++
    Réponses: 6
    Dernier message: 12/02/2007, 11h27
  3. Réponses: 8
    Dernier message: 14/09/2006, 17h43
  4. Stats sur un fichier texte
    Par fermat dans le forum Delphi
    Réponses: 3
    Dernier message: 17/08/2006, 01h50
  5. Réponses: 7
    Dernier message: 23/03/2005, 23h23

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