Automatisation

Y compris Power BI, Power Query et toute autre question en lien avec Excel
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 13 juin 2016, 10:18

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 :)

:D
Avatar du membre
d3d9x
Membre dévoué
Membre dévoué
Messages : 950
Appréciations reçues : 2
Inscrit le : 14 avril 2015
Version d'Excel : 2007

Message par d3d9x » 13 juin 2016, 11:01

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 :D
“En temps de paix, les fils ensevelissent leurs pères ; en temps de guerre, les pères ensevelissent leurs fils. Sommes-nous en guerre Père?”
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 13 juin 2016, 11:33

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
Avatar du membre
d3d9x
Membre dévoué
Membre dévoué
Messages : 950
Appréciations reçues : 2
Inscrit le : 14 avril 2015
Version d'Excel : 2007

Message par d3d9x » 14 juin 2016, 13:09

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!
“En temps de paix, les fils ensevelissent leurs pères ; en temps de guerre, les pères ensevelissent leurs fils. Sommes-nous en guerre Père?”
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 14 juin 2016, 14:19

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 :/
Avatar du membre
d3d9x
Membre dévoué
Membre dévoué
Messages : 950
Appréciations reçues : 2
Inscrit le : 14 avril 2015
Version d'Excel : 2007

Message par d3d9x » 14 juin 2016, 15:09

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...
“En temps de paix, les fils ensevelissent leurs pères ; en temps de guerre, les pères ensevelissent leurs fils. Sommes-nous en guerre Père?”
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 14 juin 2016, 15:27

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 ?
Avatar du membre
d3d9x
Membre dévoué
Membre dévoué
Messages : 950
Appréciations reçues : 2
Inscrit le : 14 avril 2015
Version d'Excel : 2007

Message par d3d9x » 14 juin 2016, 15:56

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 :k'res: 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 = [surligner]"C:\blablabla"[/surligner]
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
“En temps de paix, les fils ensevelissent leurs pères ; en temps de guerre, les pères ensevelissent leurs fils. Sommes-nous en guerre Père?”
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 14 juin 2016, 16:46

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 ? :o
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
Avatar du membre
d3d9x
Membre dévoué
Membre dévoué
Messages : 950
Appréciations reçues : 2
Inscrit le : 14 avril 2015
Version d'Excel : 2007

Message par d3d9x » 14 juin 2016, 18:04

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
“En temps de paix, les fils ensevelissent leurs pères ; en temps de guerre, les pères ensevelissent leurs fils. Sommes-nous en guerre Père?”
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message
  • automatisation
    par vincentt » 31 mai 2013, 17:09 » dans Excel - VBA
    3 Réponses
    324 Vues
    Dernier message par vincentt
    3 juin 2013, 17:49
  • automatisation
    par jeanhilo22 » 8 décembre 2017, 22:02 » dans Excel - VBA
    2 Réponses
    124 Vues
    Dernier message par h2so4
    9 décembre 2017, 11:35
  • Automatisation
    par JOUFFRAY » 30 avril 2014, 17:14 » dans Excel - VBA
    2 Réponses
    321 Vues
    Dernier message par JOUFFRAY
    1 mai 2014, 09:41
  • automatisation
    par jpr » 7 août 2013, 09:50 » dans Excel - VBA
    3 Réponses
    370 Vues
    Dernier message par eriiic
    7 août 2013, 10:52
  • Automatisation de la date
    par mandreux » 2 novembre 2017, 11:39 » dans Excel - VBA
    2 Réponses
    88 Vues
    Dernier message par mandreux
    2 novembre 2017, 11:56
  • Automatisation de planning
    par Grem974 » 4 mai 2015, 21:43 » dans Excel - VBA
    29 Réponses
    750 Vues
    Dernier message par James007
    11 mai 2015, 20:26