macro ou autre pour automatiser l'ouverture d'un fichier txt changeant de nom

  • Initiateur de la discussion tchouminator
  • Date de début
T

tchouminator

Guest
Bonjour à toutes et à tous,

je suis à la recherche d'une âme charritable qui poourrait me dépanner ... Je vous explique :
- j'ai un document qui se créé tout les jours nommé "jjmmaaaa.txt" et se trouve dans le dossier :"C:\export\st aigna\Temp min\" (il contient 3 colonnes de données, avec 1 ligne par heure soit 24 lignes ... lol ainsi qu'une entête de colonne : capteur 1, capteur 2...).
- Un autre document est créé lui aussi tout les jours, il est nommé "jjmmaaaa.txt" (comme le fichier précédent donc...) mais est stocké dans le dossier :"C:\export\st aigna\Temp max\"

L'objectif est d'
- ouvrir le 1er fichier (en faisant un copier-coler de la date "aujourdhui()" mais ça ne marche pas...), coller les colonnes dans la feuille "staigna min" du fichier (ci-joint) "automatisation.xls", puis supprimer ce 1er fichier.
- ouvrir le 2nd fichier et réaliser la même opération, sauf qu'il faut coller les colonnes dans la feuille "staigna max", et enfin supprimer le 2nd fichier.
=> il ne reste donc plus qu'un seul document ouvert : "automatisation.xls"

Compliqué pas vrai ?

Les pièges :
- la date change tout les jours donc, et le fichier à ouvrir par excel change perpétuellement de nom... le copier-coller de la date (=aujourdhui() ) ne marche pas ! comment faire?
- chaque document txt est sous le format ASCII (avec des tabulations entre colonnes), donc est facilement exploitable sous excel.
- voila, je crois que c'est tout !!! lol

merci d'avance à toutes celles et ceux qui vont se creuser la tête sur ce problème .... je suis encore novice en la matière !

merci encore.
antoine
 

Pièces jointes

  • automatisation.zip
    7.8 KB · Affichages: 17
  • automatisation.zip
    7.8 KB · Affichages: 18
  • automatisation.zip
    7.8 KB · Affichages: 20
Z

Zon

Guest
Salut,

J'ai bien reçu tes fichiers texte. Colles ceci dans un module standard et dis moi si c'est ce que tu veux :

Option Explicit
'Les constantes sont à adapter le cas échéant
Const NomF1$ = "Staigna min" 'nom de feuille dans le classeur
Const NomF2$ = "Staigna max"
Const Chemin1$ = "C:\export\st aigna\Temp min\"
Const Chemin2$ = "C:\export\st aigna\Temp max\"
Dim V As String
Sub Princ()
V = LireTexte(Chemin1 & Nomfichier)
If Len(V) > 0 Then
MsgBox V & NomF1
End
Else: RempF Sheets(NomF1)
End If
V = LireTexte(Chemin2 & Nomfichier)
If Len(V) > 0 Then
MsgBox V & NomF1
End
Else: RempF Sheets(NomF2)
End If
End Sub
Sub RempF(F As Worksheet)
Dim I&, T
With F
For I = 1 To UBound(V) 'partir de 0 si tu veux les entêtes
T = SplitZon97(Chr(9), V(I))
.Range("A65536").End(xlUp)(2).Resize(1, UBound(T) + 1) = T 'à adapter
Next I
End With
End Sub
Function Nomfichier$()
Dim Ch$
Ch = Date - 1 'la veille d'aujourdhui
Nomfichier = Left(Ch, 2) & Mid(Ch, 4, 2) & Right(Ch, 4) & ".txt"
End Function
Function LireTexte(fichieR$) 'Zon
Dim Ligne$, T$(), L&, I&
On Error GoTo Errr
If Len(fichieR) = 0 Then Exit Function
L = FreeFile
Open fichieR For Input As #L
Do While Not EOF(L)
Line Input #L, Ligne
ReDim Preserve T(I)
T(I) = Ligne
I = I + 1
Loop
Close #L
LireTexte = T
Exit Function
Errr:
LireTexte = "Erreur à la lecture du fichier texte"
End Function
'Peut être superflue mais je ne connais pas ta version d'XL
Private Function SplitZon97(Sep$, ByVal Ch$)
Dim Pos&, PosS&, T(), I&
Pos = 1
Do
PosS = InStr(Pos, Ch, Sep)
ReDim Preserve T(I)
On Error Resume Next
T(I) = Mid(Ch, Pos, PosS - Pos)
If Err <> 0 Then
Pos = Pos - 1
T(I) = Right(Ch, Len(Ch) - Pos)
Exit Do
End If
Pos = PosS + 1
I = I + 1
Loop While PosS > 0
SplitZon97 = T
End Function

A+++
 
T

tchouminator

Guest
salut Zon,
encore moi...
petite nouvelle ! je viens d'essayer ta procédure au boulot (d'ailleurs c'est là ou elle est destinée),sous Excel 97 et .... encore une erreur, mais cette fois ci je crois que t'y avais pensé :
lorsque je lance la macro "Princ", une boite de dialogue s'ouvre et m'indique "erreur à la lecture du fichier texteStaigna min".
voila, j'espère que cela ne viens pas du fait que le nom du fichier à ouvrir est celui de la date de la veille et non "Staigna min" qui est le nom de la feuille... je sais pas... voila, c'est tout !
merci encore.
anto
 
Z

Zon

Guest
Salut,

Pour l'erreur
Vérifies ton répertoire "C:\export\st aigna\Temp min\" et modifie la constante chemin1 ou que le fichier "31032004.txt" n'a pas été trouvé, on est le 1 er avril=> fichier de la veille tu m'as dit.

J'ai testé sous XL97, j'ai fait une erreur (me fait avoir souvent), mets V en variant et remplaces la procédure Princ par celle-ci:

dim V
Sub Princ()
V = LireTexte(Chemin1 & Nomfichier)
If IsArray(V) Then
RempF Sheets(NomF1)
Else: MsgBox V & NomF1
End If
V = LireTexte(Chemin2 & Nomfichier)
If IsArray(V) Then
RempF Sheets(NomF2)
Else: MsgBox V & NomF2
End If
End Sub
------------------------------------------------------------------------------------------------
Si tu as toujours le même message d'erreur, modifies la dernière ligne dans liretexte par:

LireTexte = "Erreur à la lecture du fichier texte " & Err & " "

et dis moi quel nombre tu as dans le message.

-----------------------------------------------------------------------------------
Enfin, pour savoir si ton chemin est vraiment le bon, prends un classeur vierge, colles ce code dans un module standard:

Sub OuvP()
[A1] = Application.GetOpenFilename("Fichiers Texte (*.txt),*.txt")
End Sub

Tu vas avoir un boite de dialogue Ouvrir apparaitre, vas cherhcer ton fichier "31032004.txt" et tu cliques sur Ouvrir,=> qu'est ce que tu as en A1 ?

A+++
 
T

tchouminator

Guest
salut Zon,

je suis désolé mais une fois de plus il survient des erreurs. alors, dans l'ordre :
- j'ai remplacé la procédure Princ par celle que tu m'a envoyé (y compris le dim V qu'il y avait au dessus de son commencement...)
- qu'est ce que tu entend par "mets V en variant" ?
- suite à ton anticipation, il y a donc l'erreur 76 qui est apparue ...
- j'ai copié ta macro dans un module d'un nouveau doc et il a noté ceci en A1 : "C:\export\st aigna\temp min\31032004.txt" (la date était bonne, je l'avais changé ce matin)

merci pour tout le temps que tu passes sur ces problèmes
anto

ATTENTION : j'ai désormais harmonisé absolument tout les noms (fichiers-dossiers-feuilles) en minuscules !!!!
 
Z

Zon

Guest
Re,

Bon c'est bien un pb de chemin d'accés l'erreur 76, peut être qu'au boulot tu es en réseau et tu n'as pas tous les droits ?

On abandonne pour le moment la fonction NomFichier,

et mets cette fonction là tu vas aller chercher le fichier à importer à la mimine pour voir ce qui se passe:


function OuvP()
ouvp = Application.GetOpenFilename("Fichiers Texte (*.txt),*.txt")
End function

Princ de vient donc

Sub Princ()
V = LireTexte(ouvp)
If IsArray(V) Then
RempF Sheets(NomF1)
Else: MsgBox V & NomF1
End If
V = LireTexte(ouvp)
If IsArray(V) Then
RempF Sheets(NomF2)
Else: MsgBox V & NomF2
End If
End Sub

A+++

Si cela fonctionne c'est que les constantes étaient mal définies.
 
T

tchouminator

Guest
salut Zon !

alors là, je suis époustouflé ! ton intuition est sacrément bonne ! ta solution marche à merveille ! je sais pas quoi dire !
enfin bon, l'objectif reste toujours d'automatiser cette tache étant donné qu'a terme, j'aurai 12 fichiers à aller chercher dans 12 dossier différents ... et cela tout les jours !!!

bon, alors je doit manquer de certaines autorisations ? j'en parle au patron dès qu'il arrive ! sinon, cela pourrait'il venir d'autre chose ?

juste une dernière chose, j'ai fait le test une premiere fois et ça a marché, pour être sûr que je n'avais pas rêvé (il n'est que 8h39 du mat apres tout !!! lol ), je l'ai refait une autre fois, et là, les valeurs se sont bien copiées, mais à la suite de celles qui avaient étaient collées précédement ... serait'il possible de forcer Excel à réécrire "par dessus" ou bien je créerais une petite macro qui effacera toutes les feuilles avant le démarage des tiennes ...ça ira je crois ...

voila voila ! j'attend le patron maintenant... et tes conseils, comme toujours !

MERCI MERCI ZON !!!!!
anto
 
Z

Zon

Guest
Salut,

Donc CQFD , tu définis mal les constantes sinon je pense qu'avec des restrictions sur les droits cela poserait problème quand même.

Modfies alors la procédure RempF:

Sub RempF(F As Worksheet)
Dim I&, T
With F
.UsedRange.Clear
For I = 1 To UBound(V)
T = SplitZon97(Chr(9), V(I))
.range("A" & I).Resize(1, UBound(T) + 1) = T
Next I
End With
End Sub

Sur 12 fichiers cela doit passer aussi mais ça va être pénible de cliquer 12 fois sur la boite ouvrir..alors qu'en définisant en dur les chemins tu t'embêterais bien moins. Je ne sais pas la tailla réelle de tes fichiers texte mais faut qu'il ne fasse pas plus de 65536 lignes, d'ailleurs j'ai oublié de tester au cas où.

si tu as 12 fichiers, il va falloir adapter Princ par une boucle ce sera mieux que 12 if imbriqués.

Si le traitement du code est assez rapide c'es bon mais on peut l'améliorer encore en passant par un tableau VBA supplémebntaire dans RempF ....

A+++
 
T

tchouminator

Guest
salut ZON,

ça m'embête mais je suis sur de mon chemin d'accès... ce serai pas "Nomfichier$" qui ferai des siennes par hasard ? il fausserai alors le chemin d'accès ... aussi, le chemin doit bien se mettre apres :"Const Chemin1$" et non apres "Const NomF1$" qui lui est réservé au différentes feuilles du classeur, pas vrai ?

bon, ensuite j'ai modifié ma procédure "RempF" et lorsque je lance "Princ", alors une erreur d'exécution 1004 s'affiche avec : "La méthode clear de la classe range a échoué" et la ligne ".UsedRange.Clear" est surlignée en jaune ... d'ou ça viens?

pour l'ouverture des 12 fichiers, manuellement c'est sur que c'est pas marrant... alors je creuserai jusqu'a trouver une solution... pas trop le choix !mais ne t'inquiete pas pour le nombre de ligne, il y en aura au plus 25 (24 heures + l'entête) !!!

pour la boucle dans le Princ, je sais pas y faire, mais si 12 if imbriqués marchent, alors je saurai surement faire des copier-coller...

pour le traitement du code, c'est pas trop grave s'il prend un peu de temps, tant qu'il marche !!!!

merci encore.
anto
 
T

tchouminator

Guest
ça y est !!!! j'ai trouvé !!!
une erreur à du se glisser dans ton Nomfichier$ !!!
en effet, j'ai remplacé nomfichier par [A1] dans un nouveau classeur pour voir quel chemin donnais cette fonction, et c'était ceci : "0104/04.txt" alors qu'il aurait fallu "01042004.txt"
j'ai alors bidouillé dans tout les sens et je suis arrivé à ça :
Nomfichier = Left (Ch,2) & Mid (Ch,4,2) & "20" & Right (Ch, 2) & ".txt"
voila !
j'ai rajouté "20" et j'ai changé le 4 en 2 du right !!!
maintenant ça marche !!!
je ne sais vraiement pas comment te remercier ...
MERCI MERCI MERCI MERCI MERCI MERCI ...................... lol
je t'envoi la version finale du classeur lorsque je le termine ! promis !!!!
merci encore !!!!
anto
ouf...
 
T

tchouminator

Guest
oups ...

encore un ch'tit problème ... oui oui oui ....
voila, tout ce passe impec (copie des données, ect...) mais staigna max (qui ne contient qu'une seule colonne) comporte des données inexploitables avec =max() par exemple, on dirai que les chiffres sont considérés comme du texte !!! les chiffres de cette feuille sont à gauche alors que sur staigna min (qui contient 3 colonnes), j'ai tout les chifres à droite ...

je comprend pas pourquoi ! avec des données inexploitables, c'est pas la peine de continuer ... peut'on "forcer" Excel à faire comme si c'était des chiffres ?

bon, voila c'est tout je crois ...
merci
anto
 
@

@+Thierry

Guest
Salut Anto, Zon, le Forum

Je ne peux voir de pièce jointe donc je ne sais pas trop de quoi sont constitués tes TXT, mais si tout est numérique (avec des entiers) essaie de remplacer cette ligne :

.Range("A65536").End(xlUp)(2).Resize(1, UBound(T) + 1) = T

Par :
.Range("A65536").End(xlUp)(2).Resize(1, UBound(T) + 1) = CInt(T)

Il est bien entendu que si tu as du text dans tes Txt, il faudra gérer l'erreur car la fonction de conversion "CInt" attend un enregistrement de type Integer... Sinon il faut intervenir directement sur la Function SplitZon97 qui te génère du text. Je pense que Zon te corrigera ceci facilement.

Bon Appétit et bon courage
@+Thierry
 
T

tchouminator

Guest
bonjour Thierry et merci de ton aide,
cependant, ton astuce ne marche pas étant donné que les ficiers textes contiennent du texte en entête ... cependant, je peux les supprimer, mais à condition que lors de la copie, tout ne se retrouve pas 1 ligne au dessus (en ligne 1 je veux dire). car j'ai fait mes 6 tableaux avec comme base la ligne 2. sinon, au cours de la procédure, il faut insérer une ligne vide en entête ....

voila voila... j'espère que tu comprendra comment tout cela doit se mettre en place

ci joint 1 fichier "20040401.txt" parmis les 11 autres du meme nom mais dans des répertoires différents...

si tu peut faire qque chose pour transformer les "chiffres" des pages "* max" en chiffres exploitables, alors tu me sauverai la mise !

merci d'avance.
anto
 

Pièces jointes

  • automatisation.zip
    39.4 KB · Affichages: 21
  • automatisation.zip
    39.4 KB · Affichages: 23
  • automatisation.zip
    39.4 KB · Affichages: 29
T

tchouminator

Guest
salut tt le monde !

ok les gars, ne vous faites pas de bile pour l'histoire de la colonne inexploitable, j'ai créé une macro bidon qui multiplie les colonnes par 1 et les transforme alors en chiffres exploitables.... voila pour l'astuce !

bon, je crois qu'il me reste encore une question à vous poser :
peut-on lier des cellules d'un classeur à un autre (classeur) sans risque d'altération de donnée?

merci encore et toujours !
anto
 

Discussions similaires

Statistiques des forums

Discussions
314 179
Messages
2 106 889
Membres
109 719
dernier inscrit
Naoufel