Importation d'une feuille excel sur un fichier txt

Bonjour à tous,

Je me permets de mettre un nouveau sujet car je rencontre quelques petits soucis dans la conversion de ma feuille excel en fichier .dat.
Mon objectif principal est de reproduire un fichier .dat issu d’un logiciel. Pour cela, je pars d’un fichier excel et j’extrai les informations qui me sont utiles sur une feuille que je formate en .dat.
Cependant, afin de copier la mise en page de mon logiciel, je dois extraire ligne par ligne et même case par case car différentes conditions s’appliquent en fonction de la case.
Par exemple, j’aimerai qu’il y ait 3 espaces sur mon fichier texte entre mes cases A et mes cases B.

Ainsi, j’aimerai savoir s’il existe une structure de VBA permettant de faire ce cas par cas. Pour l’instant mon code est le suivant :

On Error Resume Next
   Kill sRepertoire & sNomFichier   '// effacer le fichier existant
   iFile = FreeFile
   Open sRepertoire & sNomFichier For Output As #iFile   '// crée le fichier texte
   ar = Sheets("DatOK").Cells(1).CurrentRegion.Value     '// valeurs dans un array (plus rapide)
   For i = 1 To UBound(ar, 1)       '// boucle sur les lignes
      str = ""
      For j = 1 To UBound(ar, 2)    '// boucle sur les colonnes
         str = str & ar(i, j) & " "  '// valeurs séparées par tabulations
      Next j
      Print #iFile, str             '// écrire dans le fichier
   Next i
   Close #iFile                     '// Fermer le fichier
   On Error GoTo 0

En vous remerciant par avance

Isa

Bonsoir
Pour 3 espaces entre les cases colonne A et les cases colonne B je mettrais ces lignes de code :

For j = 1 To UBound(ar, 2) '// boucle sur les colonnes
str = str & ar(i, j) & " " '// valeurs séparées par tabulations
Next j

comme ceci :

For j = 1 To UBound(ar, 2) '// boucle sur les colonnes
If j = 1 Then '// Première colonne
str = str & ar(i, j) & " " '// valeurs séparées par 3 tabulations
Else
str = str & ar(i, j) & " " '// valeurs séparées par tabulations
End If
Next j

A tester

Super merci beaucoup !

Petite question, est-ce que vous savez si lors de ce traitement en format txt on peut attribuer un certain nombre de caractère à chaque colonne?
Par exemple, dans la colonne A, je dois trouver 8 caractères (lettres et espaces compris) dans la colonne B 29 et ainsi de suite.
Ou alors fixer une taille à chaque colonne. Je ne sais pas trop comment le formuler et encore moins si c’est possible de l’appliquer.

En vous remerciant par avance

Isa

Merci pour ce retour positif

"Par exemple, dans la colonne A, je dois trouver 8 caractères (lettres et espaces compris) "

C est à dire si l ajout par le code est de 3 espaces il faut que la donnée de la cellule colonne A ait 8-3=5 caractères
Souhaites tu un contrôle de ce nombre de caractères ou rajouter les manques et par quoi et quid si le nombre de ceux-ci est supérieure ?
Quel serait la gestion de ce nombre souhaité ?

Merci de préciser

oui ce serait ce principe. Sauf si on peut l’inverser. Dans mes cases j’ai des nombres ou des mots.
Par exemple, j’ai un mot ou un chiffre de 5 caractères or dans cette colonne il me faut 8 caractères donc j’ajoute 3 espaces.
Pour le contrôle de ce nombre, je vais le faire colonne par colonne (et même case par case) car chacune a son propre nombre de caractère. Normalement il faut toujours rajouter des espaces.

Je ne sais pas si j’ai répondu correctement à vos questions

oui ce serait ce principe

Quel principe :

Contrôle avec message si erreur ou complément des manque et par quoi quel caractère ou chiffre
Que doit il se passer si le nombre de caractères est supérieure à celui attendu ?

Merci pour ces réponses

on serait sur un complément des manques par des espaces : " "
Il n’y aura pas ce problème, on ne peut pas avoir plus de caractères dans la cellule que le nombre total de caractère accepté dans la colonne.

Toutes les colonnes seront concernées ?
Chacune aura son nombre de caractères propre ?
Ceux-ci seront ils figés ou amenés à fluctuer ?
Je suppose que les compléments sont à réaliser en fin de chaque donnée
Merci pour ces réponses

oui toute les colonnes mais pas les 3 premières lignes.
Oui chacune aura son nombre de caractères propres
normalement ils sont figés (par contre je serai pas contre de voir à quoi peut ressembler le code où ce nombre de caractères fluctue)
Alors, oui et non : s’il s’agit de données texte :« abcdef » alors on met après. Si ce sont des chiffres on met avant.

Merci pour votre aide

« Alors, oui et non : s’il s’agit de données texte :« abcdef » alors on met après. Si ce sont des chiffres on met avant. »

Si la donnée est un mixte des deux ?

Tu risques d avoir un regroupement d espace pour une donnée alphanumérique suivie d une donnée numerique
Les espaces en fin de la première vont jouxter ceux en début de la seconde n est ce pas un inconvénient

Je te propose de mettre dans une cellule la liste du nombre de caractères de chaque colonne dans l ordre de celles-ci comme ceci pour les 5 premières colonnes par exemple :

3\6\7\2\9

Ainsi d avoir la main pour des fluctuations éventuelles

Je pense que cela devrait convenir
Reste à déterminer cette cellule dans quel onglet si différent de celui actif à l écran

Oui ça va poser problème. Je pense que le plus juste va être de considérer les case avec chiffre et lettre comme texte. Soit ajouter espaces à la suite.

Et pour ma proposition quant à la liste du nombre de caractères par colonne ?

Oui pardon je n’ai pas très bien compris votre proposition.
Vous souhaitez que j’insère au sein de ma feuille excel le nombre de caractères que doit comprendre chaque colonne?
Mais lorsque que je vais importer ma feuille en format txt, ces valeurs vont polluer mon document et je ne pourrai pas l’utiliser dans mon logiciel.

On peut très bien utiliser un autre onglet à cette fin et ainsi de ne pas polluer le fichier de sortie juste à me communiquer en plus son nom

d’accord je comprends.
exemple simple pour manip.xlsm (20,3 Ko)

Je viens d’ouvrir ton fichier je ne retrouve pas ton code

On Error Resume Next
Kill sRepertoire & sNomFichier '// effacer le fichier existant
iFile = FreeFile
Open sRepertoire & sNomFichier For Output As #iFile '// crée le fichier texte
ar = Sheets(« DatOK »).Cells(1).CurrentRegion.Value '// valeurs dans un array (plus rapide)
For i = 1 To UBound(ar, 1) '// boucle sur les lignes
str = «  »
For j = 1 To UBound(ar, 2) '// boucle sur les colonnes
str = str & ar(i, j) & " " '// valeurs séparées par tabulations
Next j
Print #iFile, str '// écrire dans le fichier
Next i
Close #iFile '// Fermer le fichier
On Error GoTo 0

Est ce le bon fichier

Si oui il y a 2 macros
Laquelle faut il adapter

Merci pour tes réponses

Pardon de ne pas avoir précisé.
C’est le code que vous venez de citer qui est à adapter

Mais je ne le trouve pas dans le fichier transmis !

A défaut de réponse mets comme ceci :

listnbcol = Sheets(« mafeuille »).Range(« macellule »)
For j = 1 To UBound(ar, 2) '// boucle sur les colonnes
espace = «  »
If Ubound(Split(listnbcol,"")) >= j-1
nbespace = Split(listnbcol,"")(j-1)
If nbespace <> «  » Then
For i = 1 to nbespace
espace = espace & " "
Next i
End If
End If
str = str & ar(i, j) & espace '// valeurs séparées par tabulations
Next j

Actualises :

listnbcol = Sheets(« mafeuille »).Range(« macellule »)

du nom de l’onglet et de l’adresse de la cellule qui porte la liste des espaces par colonne

3\6\7\2\9

sépare les chiffres par le symbole «  » au lieu du symbole « / »

Fais des essais et dis moi car moi faute de fichier je n’ai pas pu de mon côté

attention ici entre les guillemets il faut le symbole antislash que l’on ne voit pas dans ces lignes

If Ubound(Split(listnbcol,"")) >= j-1
nbespace = Split(listnbcol,"")(j-1)
sépare les chiffres par le symbole « » au lieu du symbole « / »

Je pensais qu’au sein du fichier il y était excusez moi
Merci pour votre aide. En adaptant les lignes de code et grâce à vos explications ça à correctement fonctionné.

Merci encore
Bonne journée