Automatisation

Bonjour,

Je reçois un fichier txt toutes les heures avec des lignes de données MAJ, j'ai un programme sur excel me permettant d'importer ce fichier txt et de trier ses données dans le fichier excel. J'aimerai que automatiquement, une tache Windows ouvre mon fichier excel, execute tout seul l'import de mon txt grâce à la macro puis me créé un nouveau fichier excel avec toutes les données triées.

Voila si quelqu'un a des idées ca sera avec plaisir

La tache windows devrait pas poser trop de problemes, c'est surtout pour l'automatisation de l'executier de l'import et de la création du nouveau excel qui me pose probleme

Bonjour MojitoDu75,

1) Faire une tâche Windows qui ouvre ton fichier Excel avec tes macros

2) Dans ce fichier Excel, modifier l'évènement "Workbook_Open" pour qu'automatiquement il appelle les macros que tu utilises actuellement

3) A la fin de tes macros (qui devront être bien écrites pour pallier à toutes les erreurs possibles) tu fermes automatiquement ce classeur.

4) 2 glaçons dans le mojito parce que tu n'as plus à le faire à la main

En gros faudrait que toutes les heures, la Task Windows ouvre l'excel (ca c'est fait)

Derriere ma macro va se lancer avec ce code :

Private Sub Workbook_Open()

Lire

End Sub

Comment je fais pour la faire aller chercher le txt voulu sans avoir à rien faire ? Comment je note le chemin qu'elle doit emprunter pour aller recup le fichier ?

Après que le fichier txt soit ouvert dans la colonne A, l'excel trie les informations dans les colonnes suivantes, comment je fais pour faire en sorte d'enregistrer dans un nouveau excel les colonnes B-C-D-E ? (sans la colonne A)

Puis derriere ça ferme automatiquement LES classeurs :

Private Sub Workbook_Open()

Application.OnTime Now + TimeValue("00:03:00"), "fermeture"

End Sub

Sub fermeture()

Application.DisplayAlerts = False

ActiveWorkbook.Save

ActiveWorkbook.Close False

End Sub

Pour ton problème de créer un nouveau classeur, voilà un exemple de code qui crée un nouveau classeur:

Sub AddNew()
Set NewBook = Workbooks.Add
    With NewBook
        .SaveAs Filename:="Allsales.xls"
    End With
End Sub

Dans ton code, il suffira après d'utiliser des commandes telles que

NewBook.Sheets("Feuil1").Cells(1,1) = "coucou c'est nous"

Comment je fais pour la faire aller chercher le txt voulu sans avoir à rien faire ? Comment je note le chemin qu'elle doit emprunter pour aller recup le fichier ?

Alors ça ça dépend de comment tu récupères ton fichier texte, et de comment il est nommé. Je ne peux pas deviner ces éléments à toi de les préciser.

Après que le fichier txt soit ouvert dans la colonne A, l'excel trie les informations dans les colonnes suivantes, comment je fais pour faire en sorte d'enregistrer dans un nouveau excel les colonnes B-C-D-E ? (sans la colonne A)

Tu as déjà la macro qui fait ça non?

RQ: Lorsque tu postes du code, merci de le mettre dans les balises "Code" prévues à cet effet, ça rend les messages beaucoup plus clairs!

Ouais désolé pour l'oubli de code entre guillemets, je vais vous partager mon fichier que j'ai fait, mais tout marche mtn c'est cool !

J'importe mon txt que je vais chercher dans mes docs, je copie les datas importantes dans une nouvelle feuille puis je transfere cette feuille dans un classeur, que je sauvegarde et ferme automatiquement ensuite

Il me reste un seul petit hic, c'est comment faire pour par exemple aller chercher automatiquement un fichier txt avec la date la plus recente

Mes fichiers sont selon cette ecriture la : "XXX201606011100 avec année/mois/jour/heure dans le titre du txt

Sub lire()

    Fichier = Application.GetOpenFilename("Fichiers txt, *.txt")
    If Fichier = False Then Exit Sub

    N = FreeFile
    Open Fichier For Input As #N

    i = 0
    Do While Not EOF(1)
        Line Input #N, Contenu
        i = i + 1

        Table = Split(Contenu, ";")
        For j = 0 To UBound(Table)
            Cells(i, j + 1).Value = "'" & Replace(Table(j), """", "")
        Next j

    Loop

    Call CopieData
    Call SauvegardeFichier

    Close #N

End Sub

je n'arrive pas a joindre mon file :/

Il me reste un seul petit hic, c'est comment faire pour par exemple aller chercher automatiquement un fichier txt avec la date la plus recente

Il faut combiner plusieurs choses:

  • l'utilisation de la fonction "Dir" qui permet grâce à une boucle de lister les éléments d'un dossier
  • une fonction de test

Voilà le schéma de résolution que je te propose

pour chaque fichier texte dans mon dossier

je récupère le nom du fichier, et en décomposant son nom je récupère sa date

je compare cette date au fichier le plus récent que j'ai traité jusqu'à maintenant (il faut donc une variable pour stocker le fichier le + récent trouvé)

si le fichier testé est plus récent, j'édite ma variable. maVariable = "nom du fichier le plus récent"

fichier texte suivant

à la fin de ta boucle, maVariable contiendra le nom du fichier le + récent.

RQ: la fonction Dir est très bien détaillée dans l'aide windows, avec des exemples très proches de ce que tu souhaites faire.

Pour l'extraction des données:

Dim nomFichier as String
....
nomFichier = Dir
nomFichier = right(nomFichier ,len(nomFichier)-3) 'on retire les 3 premieres caractères du nom du fichier
annee = left(nomFichier,4)
mois = Mid(nomFichier, 5, 6)
'etc...

Ouais mais si j'utilise cette fonction , je dois changer toute mon importation du txt non ?

Est ce que je peux par exemple juste comparer tous les chiffres ensembles ? car 201606021200 (midi 2 juin) sera forcement plus grand que 201606012300 nan ?

  Dim nomFichier As String
Dim date as integer
    nomFichier = Dir
    nomFichier = Right(nomFichier, Len(nomFichier) - 3) 'on retire les 3 premieres caractères du nom du fichier
    Date = Left(nomFichier, 12)
If Date > VieilleDate ' comment savoir la vieille date? 

j'ai donc ca , ca represente mon chemin pour aller chercher la date a 12 chiffre (avec heure) mais apres

Fichier = Application.GetOpenFilename("Fichiers txt, *.txt")
    If Fichier = False Then Exit Sub

Faut que je modifie ca aussi ?

En mode cmt ? avec la date ou le nomfichier ?

Est ce que je peux par exemple juste comparer tous les chiffres ensembles ? car 201606021200 (midi 2 juin) sera forcement plus grand que 201606012300 nan ?

Très bonne remarque, je m'en vais me faire pour mon ignorance.

Voilà pour extraire les chiffres du nom du fichier.

Dim nomFichier as String, date as Long
'la ligne en dessous est là pour l'exemple
nomFichier = "XXX201606021200"

if isnumeric(right(nomFichier,len(nomFichier)-3)) then 
date = clgn(right(nomFichier,len(nomFichier)-3))
else
date = 0
end if
If date>dateMin then 
dateMin = date
fichierLePlusRecent = nomFichier 
End If
Fichier = Application.GetOpenFilename("Fichiers txt, *.txt")

Je n'ai pas la moindre idée de comment ce code peut fonctionner. Tu ne spécifie même pas de répertoire xD Le fichier texte est dans le même répertoire que ton fichier Excel?

Tu peux par exemple ajouter un paramètre à ta procédure "lire"

Sub lire(nomFichier as String)
'ici fais l'hypothèse que nomFichier = "XXX201606021200"
'ici tu as tes initialisations et déclarations de variables
....
Fichier = Application.GetOpenFilename(repertoire & "\" & nomFichier) 'ATTENTION je sais pas si ce code fonctionnera!
'suite de ton code

et donc après avoir fais la recherche du fichier le plus récent, tu rajoutes la ligne

...
If date>dateMin then 
dateMin = date
fichierLePlusRecent = nomFichier 
End If
Loop
'en sortant du Loop, on supposse qu'on a trouvé le fichier le + récent
'on doit donc appeler la procédure "Lire" avec son paramètre
lire "XXX201606021200"
End sub

Voilà ce que ça pourrait donner comme code. Attention il y a des tests qu'il faudra rajouter!

Sub rechercheDernierFichier()
Dim dateFichier As Long, nomFichier As String, repertoire As String, fichierLePlusRecent As String, dateLaPlusRecente As Long

repertoire = "C:\blablabla"
nomFichier = Dir(repertoire & "\*.txt", vbNormal)

If nomFichier = "" Then Exit Sub 'on sort du programme, aucun fichier texte n'a été trouvé

'le fichier le + récent est pour le moment le premier analysé
fichierLePlusRecent = nomFichier
dateLaPlusRecente = clgn(Right(nomFichier, Len(nomFichier) - 3))

'on boucle sur les autres fichiers
nomFichier = Dir
Do While nomFichier <> ""
    dateFichier = clgn(Right(nomFichier, Len(nomFichier) - 3))
    If dateFichier > dateLaPlusRecente Then
        dateLaPlusRecente = dateFichier
        fichierLePlusRecent = nomFichier
    End If
    nomFichier = Dir
Loop

'on a trouvé le fichier le + récent, on appelle la procédure de lecture
lire fichierLePlusRecent

End Sub

J'ai un petit soucis ma "sub lire" est une macro je peux pas faire passer de parametre dedans nn ? Il me demande de lancer une des deux autres macro quand je lance le prog...

pour ce que tu m'as mis , j'ai modif comme ca , est ce que c'est aux bons endroits ?

ca me sort : "Statement Invalid Outside type block"

que signifie ton vbNormal ?

Sub lire()

nomFichier = "COB201606021100"
Dim dateFichier As Long
nomFichier As String
repertoire As String
fichierLePlusRecent As String
dateLaPlusRecente As Long

repertoire = "C:\Users\fcharav\Documents"
nomFichier = Dir(repertoire & "\*.txt", vbNormal)
If nomFichier = "" Then Exit Sub 'on sort du programme, aucun fichier texte n'a été trouvé
fichierLePlusRecent = nomFichier
dateLaPlusRecente = clgn(Right(nomFichier, Len(nomFichier) - 3))

'on boucle sur les autres fichiers
nomFichier = Dir
Do While nomFichier <> ""
    dateFichier = clgn(Right(nomFichier, Len(nomFichier) - 3))
    If dateFichier > dateLaPlusRecente Then
        dateLaPlusRecente = dateFichier
        fichierLePlusRecent = nomFichier
    End If
    nomFichier = Dir

    fichier = Application.GetOpenFilename(repertoire & "\" & nomFichier)
    If fichier = False Then Exit Sub

    N = FreeFile
    Open fichier For Input As #N

    i = 0
    Do While Not EOF(1)
        Line Input #N, Contenu
        i = i + 1

        Table = Split(Contenu, ";")

        'For j = 0 To k

         For j = 0 To UBound(Table)

            Cells(i, j + 1).Value = "'" & Replace(Table(j), "", "")
                        Next j

        'k = Range("A" & Rows.Count).End(xlUp).Row
    Loop

    Call CopieData
    Call SauvegardeFichier

    Close #N

End Sub

J'ai un petit soucis ma "sub lire" est une macro je peux pas faire passer de parametre dedans nn ?

Pour ça que je l'ai édité
Sub lire(nomFichier as String)

Au final ton code devrait avoir cette tête là

Sub rechercheDernierFichier()
Dim dateFichier As Long, nomFichier As String, repertoire As String, fichierLePlusRecent As String, dateLaPlusRecente As Long

repertoire = "C:\blablabla"
nomFichier = Dir(repertoire & "\*.txt", vbNormal)

If nomFichier = "" Then Exit Sub 'on sort du programme, aucun fichier texte n'a été trouvé

'le fichier le + récent est pour le moment le premier analysé
fichierLePlusRecent = nomFichier
dateLaPlusRecente = clgn(Right(nomFichier, Len(nomFichier) - 3))

'on boucle sur les autres fichiers
nomFichier = Dir
Do While nomFichier <> ""
    dateFichier = clgn(Right(nomFichier, Len(nomFichier) - 3))
    If dateFichier > dateLaPlusRecente Then
        dateLaPlusRecente = dateFichier
        fichierLePlusRecent = nomFichier
    End If
    nomFichier = Dir
Loop
'on a trouvé le fichier le + récent, on appelle la procédure de lecture
lire fichierLePlusRecent
End Sub

Sub lire(nomFichier as String)
'la procédure que tu as écrit + les petits modifs que je t'ai proposé
End Sub

Sub CopieData()
'la procédure que tu as écrit
End Sub

Sub SauvegardeFichier()
'la procédure que tu as écrit
End Sub
Rechercher des sujets similaires à "automatisation"