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 :

Export en txt sans séparateur, avec espaces à la place des vides


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Export en txt sans séparateur, avec espaces à la place des vides
    Bonjour

    J'ai trouvé un code bien utile sur ce forum (ICI) mais avec une limite par rapport à mon objectif. Je me permet donc de solliciter la communauté.

    A partir d'excel, je dois réaliser un export en txt avec chaque valeur à sa place en colonne, sans séparateur, avec des espaces à la place des valeurs vides mais des 0 qui complètent les valeurs de taille inférieure au maximum défini (ex : 01 à la place de 1 si la variable est définie sur 2 caractères). Le code trouvé rempli toutes ces conditions mais juxtapose les valeurs sans tenir compte des variables vides.
    Comment procéder pour que l'export laisse des espaces à la place des cellules vides, afin de respecter le colonage souhaité ?

    Exemple, à partir de données Excel de ce type :
    A B  C D 
    1 22    4
    2 1  1 
    2     1 4 
    Résultat souhaité :
    122 4
    2011 
    2  14
    Voici le code que j'ai adapté de celui trouvé plus haut :
    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
    Sub xlsTOtxt()
     
    Dim i As Long
     
    FichierCible = Application.GetSaveAsFilename("Test MEN 1", "Fichier texte (*.txt), (*.txt)")
     
    If FichierCible = False Then Exit Sub
     
    Open FichierCible For Output As #1
     
    If FichierCible <> False Then
     
    Sheets("Menage").Select
    For i = 1 To Range("A:A").End(xlDown).Row
     
     
        Print #1, Space(1 - Len(VBA.Format(Range("A" & i).Value, "0"))) _
        & VBA.Format(Range("A" & i).Value, "0") & VBA.Format(Range("B" & i).Value, "000000") & VBA.Format(Range("C" & i).Value, "000") & VBA.Format(Range("D" & i).Value, "000") _
        & VBA.Format(Range("E" & i).Value, "000") & VBA.Format(Range("F" & i).Value, "0") & VBA.Format(Range("G" & i).Value, "0") _
        & VBA.Format(Range("H" & i).Value, "0") & VBA.Format(Range("I" & i).Value, "0") & VBA.Format(Range("J" & i).Value, "0") _
        & VBA.Format(Range("K" & i).Value, "0") & VBA.Format(Range("L" & i).Value, "0") & VBA.Format(Range("M" & i).Value, "0000") _
        & VBA.Format(Range("N" & i).Value, "00") & VBA.Format(Range("O" & i).Value, "0") & VBA.Format(Range("P" & i).Value, "0") _
        & VBA.Format(Range("Q" & i).Value, "0") & VBA.Format(Range("R" & i).Value, "0") & VBA.Format(Range("S" & i).Value, "0") _
        & VBA.Format(Range("T" & i).Value, "0000") & VBA.Format(Range("U" & i).Value, "00") & VBA.Format(Range("V" & i).Value, "0") _
        & VBA.Format(Range("W" & i).Value, "0") & VBA.Format(Range("X" & i).Value, "0") & VBA.Format(Range("Y" & i).Value, "0") _
     
    Next i
     
    Close #1
     
    MsgBox "Exportation réussie !"
    End If
    End Sub
    J'utilise Excel 2010, et ce n'est que ma 2e ou 3e tentative de créer une macro VBA, autant dire que je suis plus que débutant !

    Merci d'avance pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    le résultat souhaité n'est absolument pas représentatifs de ta demande

    essaie de nous représenter le départ et le résultat correctement tu a la possibilité de créer un tableau dans l'éditeur de message voir capture
    Nom : Capture.JPG
Affichages : 2211
Taille : 36,6 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ca m'a semblé correct, mais ce n'est peut-être pas lisible sans tableau, c'est vrai.

    Voici un tableau représentant les données Excel (dans cet exemple, la variable B est sur 2 positions, les autres sur une):

    A B C D
    1 22 4
    2 1 1
    2 1 4

    Résultat souhaité (* pour un espace):
    122*4
    2011*
    2**14

    Merci !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'ai un champ1 à taille fixe de 150 caractère,Champ2 22 caractère !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Champ1=left("TOTO" & space(150),150)
    Champ2=left("TITI" & space(22),22)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci. Mais que dois-je faire de ce code ? Comme l'intégrer au précédent ?
    Je suis vraiment débutant en VBA.

    Cordialement

  6. #6
    Invité
    Invité(e)
    Par défaut
    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
    Private Sub test()
    Dim L As Long, txt As String
    With ActiveSheet
        For L = 1 To .UsedRange.Rows.Count
            txt = txt & SpaceChamp(.Cells(L, "A"), 30)
            txt = txt & SpaceChamp(.Cells(L, "B"), 5)
            txt = txt & SpaceChamp(.Cells(L, "C"), 8)
            txt = txt & SpaceChamp(.Cells(L, "D"), 3)
            txt = txt & vbCrLf
        Next
    End With
    NewFichierTxt "C:\MyRepertoire\Test.CSV", txt
    End Sub
     
     
    Function SpaceChamp(txt As String, Taile As Integer) As String
    SpaceChamp = Left(txt & Space(Taile), Taile)
    End Function
    Private Sub NewFichierTxt(Fichier, txt)
    Dim fso, NewFichier
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set NewFichiert = fso.OpenTextFile(Fichier, 2, True)
    NewFichiert.Write txt
    NewFichiert.Close
    Set NewFichiert = Nothing
    Set fso = Nothing
    End Sub

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par Kremy Voir le message
    Ca m'a semblé correct, mais ce n'est peut-être pas lisible sans tableau, c'est vrai.

    Voici un tableau représentant les données Excel (dans cet exemple, la variable B est sur 2 positions, les autres sur une):
    A B C D
    1 22 4
    2 1 1
    2 1 4

    Résultat souhaité (* pour un espace):
    122*4
    2011*
    2**14

    Merci !
    oui c'est plus clair
    mais par exemple ici pour 2011
    quelle règle doit on appliquer pour que le 2 eme "1" ne prenne pas le sufixe"0"
    serait parce que c'est le 3eme caractères
    serait ce parce que il y a déjà eu un ajout et qu'il ne peut y en avoir qu'un
    etc......
    pour 2**14 c'est quoi la règle il y a un "1" il devrait y avoir un "0" non?

    de ce que je vois la seule règle qui semble se dessiner ici

    si le 2eme <2 alors "0"avant le 2eme
    si le 2eme=" " alors espaces
    par contre pour 2 14 il y a deux espaces pourquoi?
    la gestion dois ce faire que sur le 2eme c'est ca et il doit y avoir absolument 2 caractères numériques ou 2 espaces
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci bien !
    Je comprends qu'il faut passer par un .csv pour ensuite le réécrire en txt. mais je ne comprends pas tout.

    J'ai un bug sur la ligne "Set NewFichiert = fso.OpenTextFile(Fichier, 2, True)", Erreur 70, permission refusée.

    J'ai modifié le chemin du fichier, mais pas "Scripting.FileSystemObject"

    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
    Private Sub test()
    Dim L As Long, txt As String
    With ActiveSheet
        For L = 1 To .UsedRange.Rows.Count
            txt = txt & SpaceChamp(.Cells(L, "A"), 1)
            txt = txt & SpaceChamp(.Cells(L, "B"), 2)
            txt = txt & SpaceChamp(.Cells(L, "C"), 1)
            txt = txt & SpaceChamp(.Cells(L, "D"), 1)
        Next
    End With
    NewFichierTxt "C:\mon chemin ok\Test.CSV", txt
    End Sub
     
     
    Function SpaceChamp(txt As String, Taile As Integer) As String
    SpaceChamp = Left(txt & Space(Taile), Taile)
    End Function
    Private Sub NewFichierTxt(Fichier, txt)
    Dim fso, NewFichier
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set NewFichiert = fso.OpenTextFile(Fichier, 2, True)
    NewFichiert.Write txt
    NewFichiert.Close
    Set NewFichiert = Nothing
    Set fso = Nothing
    End Sub

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    pour 2**14 c'est quoi la règle il y a un "1" il devrait y avoir un "0" non?
    C'est beaucoup plus simple que ça en réalité. Ça dépend de la taille de chaque champs :
    A = 1 caractère
    B = 2 caractères
    C = 1 caractère
    D = 1 caractère

    Si le champs est vide, il faut autant d'espaces que de caractères prévus (en colonne B, "vide" devient "espace espace")
    Si la valeur est sur un nombre de caractères plus petit que ce qui est prévu, des 0 la complètent (en colonne B, 1 devient 01)

  10. #10
    Invité
    Invité(e)
    Par défaut
    permission refusée.
    n'est pas un bug à proprement parlé même si la fenêtre de dégugae s'ouvre! tu as as les droits en écriture sur le répertoire Windows!


    tu n'es pas obligé de passer par un CSV!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewFichierTxt "C:\mon chemin ok\Test.TXT", txt

  11. #11
    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 677
    Points
    18 677
    Par défaut
    Bonjour,

    juste en créant des variables de type String du nombre de caractères des champs,

    par exemple  Dim SB as String * 2  …

    Les espaces complétant le vide y sont automatiques !   Pour les nombres, utiliser la fonction Format

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    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)

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    (Oui, j'ai bien les droits nécessaires)

    Citation Envoyé par dysorthographie Voir le message
    [/COLOR]"C:\mon chemin ok\Test.TXT", txt[/CODE]
    Ca fonctionne jusqu'au bout avec l'extension .TXT

    Merci beaucoup !

    Le fichier TXT est bien créé, mais avec 2 problèmes. Premièrement, il manque une solution pour aller à la ligne, car pour le moment, mes 4 lignes de test sont à la suite. Et deuxièmement, pour la variable sur 2 positions, une valeur sur une seule position est justifiée à gauche au lieu d’être complétée par un 0 ("1espace" au lieu de "01", souligné ci-dessous)
    1 22 1 4
    1 2 4
    2 1 1
    1 33 4


    devient :
    122141 2421 1 133 4

    @Marc-L : Je note la solution du dimensionnement initial. Merci. Je vais essayer dans ce sens également.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    je supose que c'est le résultat que tu attends
    j'ai remplacer les espaces par des Etoiles pour le démo
    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
    Sub test()
        Set plage = Sheets(1).Range("A1").CurrentRegion
        MsgBox plage.Address
        For lig = 1 To plage.Rows.Count
            texte = texte & plage.Cells(lig, 1)
            For col = 1 To plage.Column + plage.Columns.Count - 1
                If col = 2 Then
                    If IsEmpty(Cells(lig, col)) Then texte = texte & "**"
                    If IsNumeric(Cells(lig, col)) Then texte = texte & Format(Cells(lig, col), "00")
                ElseIf col > 2 Then
                    If IsEmpty(Cells(lig, col)) Then texte = texte & "*"
                If IsNumeric(Cells(lig, col)) Then texte = texte & Cells(lig, col)
                End If
            Next
            texte = texte & vbCrLf
        Next
        MsgBox texte
    End Sub
    Nom : demo2.gif
Affichages : 2262
Taille : 252,4 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Finalement, le dimensionnement initial des variables puis l'utilisation de la fonction Format, comme l'a suggéré Marc-L, répond à ma demande. Et pour moi, c'est plus simple à mettre en œuvre avec ma faible maîtrise de VBA !

    Merci beaucoup pour vos différentes solutions et vos réponses !

    Voici le code utilisé. Par facilité, j'ai nommé les variables par leur code de colonne, ce qui est sans doute une mauvaise idée (et j'ai dû renommer I, qui était pris, et AS, qui est utile à VBA...).

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    Sub xlsTOtxt()
     
    Dim I As Long
    Dim A As String * 1
    Dim B As String * 6
    Dim C As String * 3
    Dim D As String * 3
    Dim E As String * 3
    Dim F As String * 1
    Dim G As String * 1
    Dim H As String * 1
    Dim I9 As String * 1
    Dim J As String * 1
    Dim K As String * 1
    Dim L As String * 1
    Dim M As String * 4
    Dim N As String * 2
    Dim O As String * 1
    Dim P As String * 1
    Dim Q As String * 1
    Dim R As String * 1
    Dim S As String * 1
    Dim T As String * 4
    Dim U As String * 2
    Dim V As String * 1
    Dim W As String * 1
    Dim X As String * 1
    Dim Y As String * 1
    Dim Z As String * 1
    Dim AA As String * 4
    Dim AB As String * 2
    Dim AC As String * 1
    Dim AD As String * 1
    Dim AE As String * 1
    Dim AF As String * 1
    Dim AG As String * 1
    Dim AH As String * 4
    Dim AI As String * 2
    Dim AJ As String * 1
    Dim AK As String * 1
    Dim AL As String * 1
    Dim AM As String * 1
    Dim AN As String * 1
    Dim AO As String * 1
    Dim AP As String * 1
    Dim AQ As String * 4
    Dim AR As String * 1
    Dim A8 As String * 1
    Dim AT As String * 1
    Dim AU As String * 1
    Dim AV As String * 1
    Dim AW As String * 4
    Dim AX As String * 1
    Dim AY As String * 1
    Dim AZ As String * 1
    Dim BA As String * 1
    Dim BB As String * 1
    Dim BC As String * 4
    Dim BD As String * 1
    Dim BE As String * 1
    Dim BF As String * 1
    Dim BG As String * 1
    Dim BH As String * 1
    Dim BI As String * 4
    Dim BJ As String * 1
    Dim BK As String * 1
    Dim BL As String * 2
    Dim BM As String * 2
    Dim BN As String * 1
    Dim BO As String * 8
    Dim BP As String * 1
    Dim BQ As String * 1
    Dim BR As String * 1
    Dim BS As String * 1
     
     
    FichierCible = Application.GetSaveAsFilename("Test MEN 1", "Fichier texte (*.txt), (*.txt)")
     
    If FichierCible = False Then Exit Sub
     
    Open FichierCible For Output As #1
     
    If FichierCible <> False Then
     
    Sheets("Menage").Select
     
    For I = 1 To Range("A:A").End(xlDown).Row
     
    A = VBA.Format(Range("A" & I).Value, "0")
    B = VBA.Format(Range("B" & I).Value, "000000")
    C = VBA.Format(Range("C" & I).Value, "000")
    D = VBA.Format(Range("D" & I).Value, "000")
    E = VBA.Format(Range("E" & I).Value, "000")
    F = VBA.Format(Range("F" & I).Value, "0")
    G = VBA.Format(Range("G" & I).Value, "0")
    H = VBA.Format(Range("H" & I).Value, "0")
    I9 = VBA.Format(Range("I" & I).Value, "0")
    J = VBA.Format(Range("J" & I).Value, "0")
    K = VBA.Format(Range("K" & I).Value, "0")
    L = VBA.Format(Range("L" & I).Value, "0")
    M = VBA.Format(Range("M" & I).Value, "0000")
    N = VBA.Format(Range("N" & I).Value, "00")
    O = VBA.Format(Range("O" & I).Value, "0")
    P = VBA.Format(Range("P" & I).Value, "0")
    Q = VBA.Format(Range("Q" & I).Value, "0")
    R = VBA.Format(Range("R" & I).Value, "0")
    S = VBA.Format(Range("S" & I).Value, "0")
    T = VBA.Format(Range("T" & I).Value, "0000")
    U = VBA.Format(Range("U" & I).Value, "00")
    V = VBA.Format(Range("V" & I).Value, "0")
    W = VBA.Format(Range("W" & I).Value, "0")
    X = VBA.Format(Range("X" & I).Value, "0")
    Y = VBA.Format(Range("Y" & I).Value, "0")
    Z = VBA.Format(Range("Z" & I).Value, "0")
    AA = VBA.Format(Range("AA" & I).Value, "0000")
    AB = VBA.Format(Range("AB" & I).Value, "00")
    AC = VBA.Format(Range("AC" & I).Value, "0")
    AD = VBA.Format(Range("AD" & I).Value, "0")
    AE = VBA.Format(Range("AE" & I).Value, "0")
    AF = VBA.Format(Range("AF" & I).Value, "0")
    AG = VBA.Format(Range("AG" & I).Value, "0")
    AH = VBA.Format(Range("AH" & I).Value, "0000")
    AI = VBA.Format(Range("AI" & I).Value, "00")
    AJ = VBA.Format(Range("AJ" & I).Value, "0")
    AK = VBA.Format(Range("AK" & I).Value, "0")
    AL = VBA.Format(Range("AL" & I).Value, "0")
    AM = VBA.Format(Range("AM" & I).Value, "0")
    AN = VBA.Format(Range("AN" & I).Value, "0")
    AO = VBA.Format(Range("AO" & I).Value, "0")
    AP = VBA.Format(Range("AP" & I).Value, "0")
    AQ = VBA.Format(Range("AQ" & I).Value, "0000")
    AR = VBA.Format(Range("AR" & I).Value, "0")
    A8 = VBA.Format(Range("AS" & I).Value, "0")
    AT = VBA.Format(Range("AT" & I).Value, "0")
    AU = VBA.Format(Range("AU" & I).Value, "0")
    AV = VBA.Format(Range("AV" & I).Value, "0")
    AW = VBA.Format(Range("AW" & I).Value, "0000")
    AX = VBA.Format(Range("AX" & I).Value, "0")
    AY = VBA.Format(Range("AY" & I).Value, "0")
    AZ = VBA.Format(Range("AZ" & I).Value, "0")
    BA = VBA.Format(Range("BA" & I).Value, "0")
    BB = VBA.Format(Range("BB" & I).Value, "0")
    BC = VBA.Format(Range("BC" & I).Value, "0000")
    BD = VBA.Format(Range("BD" & I).Value, "0")
    BE = VBA.Format(Range("BE" & I).Value, "0")
    BF = VBA.Format(Range("BF" & I).Value, "0")
    BG = VBA.Format(Range("BG" & I).Value, "0")
    BH = VBA.Format(Range("BH" & I).Value, "0")
    BI = VBA.Format(Range("BI" & I).Value, "0000")
    BJ = VBA.Format(Range("BJ" & I).Value, "0")
    BK = VBA.Format(Range("BK" & I).Value, "0")
    BL = VBA.Format(Range("BL" & I).Value, "00")
    BM = VBA.Format(Range("BM" & I).Value, "00")
    BN = VBA.Format(Range("BN" & I).Value, "0")
    BO = VBA.Format(Range("BO" & I).Value, "00000000")
    BP = VBA.Format(Range("BP" & I).Value, "0")
    BQ = VBA.Format(Range("BQ" & I).Value, "0")
    BR = VBA.Format(Range("BR" & I).Value, "0")
    BS = VBA.Format(Range("BS" & I).Value, "0")
     
       Print #1, Space(1 - Len(VBA.Format(Range("A" & I).Value, "0"))) _
        & A & B & C & D & E & F & G & H & I9 & J & K & L & M & N & O & P & Q & R & S & T & U & V & W & X & Y & Z & _
        AA & AB & AC & AD & AE & AF & AG & AH & AI & AJ & AK & AL & AM & AN & AO & AP & AQ & AR & A8 & AT & AU & AV & _
        AW & AX & AY & AZ & BA & BB & BC & BD & BE & BF & BG & BH & BI & BJ & BK & BL & BM & BN & BO & BP & BQ & BR & BS
     
    Next I
     
    Close #1
     
    MsgBox "Exportation réussie !"
    End If
    End Sub

  15. #15
    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 677
    Points
    18 677
    Par défaut

    Pourtant j'ai été clair :  pour les nombres il suffit juste d'utiliser la fonction Format,
    pas besoin d'une variable String de longueur fixe !

    Joindre un classeur exemple au format xlsx donc sans code, j'entrevois moins de trente lignes de code !


    En une vingtaine de lignes de code et six variables …   (Edit v3)   :
    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
    Sub Demo()
        Dim FICHIER, N, C&, F%, Rg As Range, V
            FICHIER = Application.GetSaveAsFilename("Test MEN 1", "Fichier texte (*.txt), (*.txt)")
         If FICHIER = False Then Exit Sub
                  N = Array(0, 1, 6, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 4, 2, 1, 1, _
                            1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, _
                            1, 4, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 4, 1, 1, 2, 2, 1, 8, 1, 1, 1, 1)
              For C = 1 To UBound(N):  N(C) = String(N(C), "0"):  Next
                  F = FreeFile
            On Error GoTo Fin
       Open FICHIER For Output As #F
        For Each Rg In [Menage!A1].CurrentRegion.Rows
            V = Application.Index(Rg.Value, 0, 0)
            For C = 1 To UBound(V):  V(C) = Format(Val(V(C)), N(C)):  Next
            Print #F, Join(V, "")
        Next
    Fin:
        Close #F
        MsgBox IIf(Err.Number, "échec !", "terminée …"), IIf(Err.Number, 16, 64), "  Exportation :"
    End Sub
    ___________________________________________________________________________________________________________

          Merci de cliquer sur pour chaque message ayant aidé …
    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)

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    Pourtant j'ai été clair :  pour les nombres il suffit juste d'utiliser la fonction Format,
    pas besoin d'une variable String de longueur fixe !
    Bonjour Marc-L,

    Merci pour votre réponse. Désolé, je n'étais pas disponible hier.

    Sans la définition initiale en String * longueur souhaitée, les valeurs se collent les unes aux autres au lieu de laisser des espaces si vides. Et sans la fonction Format, les valeurs 1 sur 3 positions ne s'écrivent pas 001. C'est donc en combinant les 2 que j'obtiens une solution satisfaisante.

    Par ailleurs, j'ai testé le code que vous proposez ci-dessus, et j'obtiens ceci :
    116112430100300134120000100000000
    11611153010020021421113200208112005001000000001
    11701133010010044411111200605123002002000000001
    11611153010010051411113201106112002001000000001
    au lieu de cela (les * matérialisent les espaces) :
    116112430100300134120**************************0******************00*100000000
    11611153010020021421113200208112*****************0******************05001000000001
    11701133010010044411111200605123*****************0******************02002000000001
    11611153010010051411113201106112*****************0******************02001000000001

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    je le redonne car je crois que c'est passé inaperçu
    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
    Sub test()
        Set plage = Sheets(1).Range("A1").CurrentRegion
        MsgBox plage.Address
        For lig = 1 To plage.Rows.Count
            texte = texte & plage.Cells(lig, 1)
            For col = 1 To plage.Column + plage.Columns.Count - 1
                If col = 2 Then
                    If IsEmpty(Cells(lig, col)) Then texte = texte & "**"
                    If IsNumeric(Cells(lig, col)) Then texte = texte & Format(Cells(lig, col), "00")
                ElseIf col > 2 Then
                    If IsEmpty(Cells(lig, col)) Then texte = texte & "*"
                If IsNumeric(Cells(lig, col)) Then texte = texte & Cells(lig, col)
                End If
            texte = texte & vbTab
            Next
            texte = texte & vbCrLf
        Next
        MsgBox texte
    End Sub
    toujours pareil j'ai remplacé les espaces par des Etoiles pour la démo
    Nom : demo2.gif
Affichages : 2286
Taille : 271,4 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Chargé d'étude enquêtes
    Inscrit en
    Avril 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'étude enquêtes

    Informations forums :
    Inscription : Avril 2017
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Bonjour
    je le redonne car je crois que c'est passé inaperçu
    Bonjour

    J'avais vu et je l'ai testé aussi. Merci. Cela convient pour le petit exemple que j'avais mis, mais dans mon cas, où il y a 20 à 60 variables de tailles différentes, c'est un peu plus complexe à adapter à chaque fichier. La solution la plus simple et la plus compréhensible pour moi a donc été celle que j'ai remise ci-dessus.
    Mais merci pour votre aide.

    Bonne journée

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut
    un exemple représentant la situation réelle aurait été la bien venue alors

    Attention quand même a ce procédé selon la destination et l'application utilisant le fichier après donnera quelque surprise de mémé qu'avec Excel d'ailleurs

    si un espace est considéré comme une séparation de colonne avec une cellule vide on se retrouve avec 3 colonnes ou 1 seul colonne si texttocolumns est paramétré en regroupement des espaces etc.....
    bon courage
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    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 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Kremy Voir le message
    Sans la définition initiale en String * longueur souhaitée, les valeurs se collent les unes aux autres au lieu de laisser des espaces si vides. Et sans la fonction Format, les valeurs 1 sur 3 positions ne s'écrivent pas 001. C'est donc en combinant les 2 que j'obtiens une solution satisfaisante.
    Citation Envoyé par Kremy Voir le message
    mais dans mon cas, où il y a 20 à 60 variables de tailles différentes, c'est un peu plus complexe à adapter à chaque fichier.
    C'est fou de ne pas avoir testé ma solution du post #15 donnant exactement le même résultat que ton précédent code
    sans les variables de type String * x car la fonction Format suffit amplement pour les nombres, et ce,
    en une seule variable tableau pour la définition des longueurs de chaque cellule !  Voir Edit plus bas, autant pour moi !  

    String * x
    est nécessaire uniquement pour du texte - donc inutile pour des nombres ! - et dans le cas d'un grand nombre de
    cellules à traiter, je continuerais à utiliser une unique variable tableau pour la définition des longueurs
    et en utilisant la fonction Space par différence de longueur entre la définition et la longueur de la donnée de la cellule …
    (En fait il y a plus simple sans String * x toujours via la fonction Format !)

    Autre astuce avec mon code du post #15, au lieu d'y définir en dur la longueur des cellules
    utiliser une feuille de calculs de paramétrage :   il suffit sur une ligne de saisir pour chaque colonne la longueur,
    le code alimentant directement une variable tableau (N dans mon code) à partir de cette ligne …
    En cas d'évolution, c'est bien plus simple pour la maintenance car aucun besoin de modifier le code, juste le paramétrage !

    Edit : en cas de cellules vides, je viens d'effectuer une p'tite modification dans la ligne n°14 du code du post #15
     couvrant aussi le cas d'une saisie texte au lieu d'un nombre attendu, le texte étant remplacé par la longueur de zéro …

    Sinon je peux proposer un code comblant avec des zéros pour les nombres ou des espaces pour les cellules vides
    sans recourir à des variables de type String * x mais j'attends de savoir
    si tu préfères les longueurs en dur dans le code ou via une feuille de paramétrage ?
    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)

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

Discussions similaires

  1. XLS en TXT sans séparateur
    Par julio44 dans le forum Excel
    Réponses: 14
    Dernier message: 14/04/2023, 09h55
  2. Donnée de fichier txt sans séparateur dans une bd sqlite
    Par Kriskev dans le forum Général Java
    Réponses: 6
    Dernier message: 17/11/2016, 20h33
  3. Importation d'un txt sans séparateur
    Par yo.ourti dans le forum SAS Base
    Réponses: 8
    Dernier message: 24/03/2014, 15h13
  4. Export CSV/txt avec délimitateur ";"
    Par zephirsoul dans le forum VBA Access
    Réponses: 2
    Dernier message: 16/05/2007, 08h35
  5. Réponses: 6
    Dernier message: 14/02/2007, 12h51

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