OVH Cloud OVH Cloud

Problème avec Sendkeys

11 réponses
Avatar
khinoa
Bonjour à tous,

J'ai un classeur de type xls, je voudrais le transformer en csv. Quand
j'enregistre manuellement le classeur sous le format CSV, Fichier,
Enregistrer sous, CSV, une première boite me demande "Voulez-vous conserver
le format du classeur csv" je réponds OUI. Puis je ferme avec Fichier,
Fermer et Excel me demande alors si je veux enregistrer les modifs, je
réponds OUI, et une seconde boite, identique à la première, me redemande si
je veux conserver le format CSV, je réponds à nouveau OUI et le classeur se
ferme. Puis j'ouvre ce classeur avec le bloc-notes et les données disposées
en colonnes sont bien séparées par le point-virgule. Cela fonctionne bien
manuellement. Malheureusement je ne peux reproduire le code avec
l'enregistreur de macro.

Je voudrais seulement automatiser ce processus afin de ne pas voir de boite
de dialogue s'afficher et pourtant répondre oui quand il le faut. J'ai
essayé le code ci-dessous mais il ne fonctionne pas vraiment, il me crée
bien un fichier csv mais les données sont illisibles et le volume est
quasiment identique au fichier xls, alors qu'avec du csv généralement c'est
plus léger. Dans quel ordre faut-il mettre Wait, SendKeys et SaveAs?

Application.DisplayAlerts = False
Workbook(essai.xls).Activate
ActiveWorkbook.SaveAs Filename:="C\TOTO\essai.csv"
Application.Wait Now + TimeValue("00:00:05")
Workbooks(essai.xls).Close True 'enregistre les modifs
Application.Wait Now + TimeValue("00:00:05")
Application.SendKeys "{LEFT}~~", True
ActiveWorkbook.SaveAs Filename:="C\TOTO\essai.csv" 'voulez-vous conserver le
format, OUI
Application.Wait Now + TimeValue("00:00:05")
Application.SendKeys "{LEFT}~~", True
ActiveWorkbook.SaveAs Filename:="C\TOTO\essai.csv" 'voulez-vous conserver le
format, OUI
Application.Wait Now + TimeValue("00:00:05")
Application.SendKeys "{LEFT}~~", True
Application.DisplayAlerts = True

D'avance merci

khinoa

10 réponses

1 2
Avatar
Garette
Bonjour,

Ceci fonctionne tres bien ...
L'utilisation de SendKeys est compliquée.

Sub FichierCSV()
ActiveWorkbook.SaveAs Filename:="test", FileFormat:=xlCSV, local:=True
ActiveWorkbook.Close SaveChanges:úlse
End Sub
Avatar
khinoa
Bonjour Garette,

Oui cela fonctionne manuellement très bien, mais c'est assez fastidieux
(surtout qu'Excel demande 2 fois la même chose) et c'est pour cela que je
voudrais l'automatiser. Le problème est simplement de savoir quel est le bon
enchaînement des instructions avec SendKeys et Wait puisque Wait semble
nécessaire au bon fonctionnement.

J'ai fait des essais mais cela me crée un classeur csv quasiment du même
poids que le xls et surtout totalement illisible à l'ouverture par le
bloc-notes.

A +

"Garette" a écrit dans le message de news:

Bonjour,

Ceci fonctionne tres bien ...
L'utilisation de SendKeys est compliquée.

Sub FichierCSV()
ActiveWorkbook.SaveAs Filename:="test", FileFormat:=xlCSV, local:=True
ActiveWorkbook.Close SaveChanges:úlse
End Sub




Avatar
Garette
Khinoa,

Il ne faut pas utiliser SendKeys.
L'utilisation de SendKeys à mon avis doit etre faites dans des cas
specifiques quand il n'y a pas d'autres solution.
Ici, il y a des solutions beaucoup plus fiables.
Le code ci-dessous devrait répondre à ta question.

Il crée un fichier CSV séparer par des ";" sans poser de question à
l'utilisateur.
Tu peux l'adapter à ton contexte.

Sub FichierCSV()
ActiveWorkbook.SaveAs Filename:="test", FileFormat:=xlCSV, local:=True
ActiveWorkbook.Close SaveChanges:úlse
End Sub
Avatar
MichDenis
As-tu essayé quelque chose comme ceci :


'------------------------------
Sub FichierCSV()
Application.DisplayAlerts = False
'Choisis la feuille que tu veux transformer en CSV
Worksheets("Feuil1").Copy
'Sauvegarde en CSV de la feuille choisie
With ActiveWorkbook
.SaveAs Filename:="test", FileFormat:=xlCSV, local:=True
.Close False
End With
Application.DisplayAlerts = False
End Sub
'------------------------------



"khinoa" a écrit dans le message de news: 4560086f$0$5385$
Bonjour à tous,

J'ai un classeur de type xls, je voudrais le transformer en csv. Quand
j'enregistre manuellement le classeur sous le format CSV, Fichier,
Enregistrer sous, CSV, une première boite me demande "Voulez-vous conserver
le format du classeur csv" je réponds OUI. Puis je ferme avec Fichier,
Fermer et Excel me demande alors si je veux enregistrer les modifs, je
réponds OUI, et une seconde boite, identique à la première, me redemande si
je veux conserver le format CSV, je réponds à nouveau OUI et le classeur se
ferme. Puis j'ouvre ce classeur avec le bloc-notes et les données disposées
en colonnes sont bien séparées par le point-virgule. Cela fonctionne bien
manuellement. Malheureusement je ne peux reproduire le code avec
l'enregistreur de macro.

Je voudrais seulement automatiser ce processus afin de ne pas voir de boite
de dialogue s'afficher et pourtant répondre oui quand il le faut. J'ai
essayé le code ci-dessous mais il ne fonctionne pas vraiment, il me crée
bien un fichier csv mais les données sont illisibles et le volume est
quasiment identique au fichier xls, alors qu'avec du csv généralement c'est
plus léger. Dans quel ordre faut-il mettre Wait, SendKeys et SaveAs?

Application.DisplayAlerts = False
Workbook(essai.xls).Activate
ActiveWorkbook.SaveAs Filename:="CTOTOessai.csv"
Application.Wait Now + TimeValue("00:00:05")
Workbooks(essai.xls).Close True 'enregistre les modifs
Application.Wait Now + TimeValue("00:00:05")
Application.SendKeys "{LEFT}~~", True
ActiveWorkbook.SaveAs Filename:="CTOTOessai.csv" 'voulez-vous conserver le
format, OUI
Application.Wait Now + TimeValue("00:00:05")
Application.SendKeys "{LEFT}~~", True
ActiveWorkbook.SaveAs Filename:="CTOTOessai.csv" 'voulez-vous conserver le
format, OUI
Application.Wait Now + TimeValue("00:00:05")
Application.SendKeys "{LEFT}~~", True
Application.DisplayAlerts = True

D'avance merci

khinoa
Avatar
khinoa
Garette,

Sub FichierCSV()
ActiveWorkbook.SaveAs Filename:="test", FileFormat:=xlCSV, local:=True
ActiveWorkbook.Close SaveChanges:úlse
End Sub


Mais tu as parfaitement raison mais qu'à une seule condition, il faut
qu'avant d'enregistrer sous le format csv il ait été appuyé sur CTRL+S
(Fichier, Enregistrer), car sinon avec ActiveWorkbook.Close
SaveChanges:úlse le classeur se retrouverait vide puisqu'aucune
modification n'aurait été enregistrée.

Avec les 3 instructions suivantes, cela marche du tonnerre!!! Il fallait
impérativement ActiveWorkbook.Save.

ActiveWorkbook.Save
ActiveWorkbook.SaveAs Filename:="toto", FileFormat:=xlCSV, local:=True
ActiveWorkbook.Close SaveChanges:úlse

Grand merci, tu me sauves. Tu avais raison, SendKeys était inutile dans ce
cas-là.

Au revoir

khinoa

Avatar
Garette
Oui, effectivement, mon exemple partait du principe que le fichier XLS
d'origine était existant et dèjà enregistré.
Pour le conserver, il faut comme tu le dis, faire d'abord un
ActiveWorkbook.Save, s'il y a eu des modifs.
Bonne journée.
Avatar
khinoa
MichDenis,

Merci quand même mais ça y est grâce au code de Garette. Sacré
"ActiveWorkbook.Save" que j'avais oublié.

A +

khinoa
Avatar
MichDenis
| Merci quand même mais ça y est grâce au code de Garette. Sacré
| "ActiveWorkbook.Save" que j'avais oublié.


Tu retiens la procédure qui te convient ...c'est ok.
mais celle que je t'ai soumise fonctionne très bien.
Avatar
Garette
Les 2 macros font la meme chose.
Une sauve les datas avant d'enregistrer et l'autre les copie pour les
enregistrer.

En revanche, pourquoi mettre "Application.DisplayAlerts = False" alors qu'il
n'y a pas de DisplayAlert dans ce cas ?
(Ca marche tres bien sans)
Si une telle commande est conservée dans le code, n'est-ce pas le risque de
passer à coté d'un message Excel ...
Par exemple c'est le risque d'écraser le précédent fichier Test.csv auquel
on tient peut-etre ;-)
Avatar
khinoa
Oui merci mais te ne vexe pas.

Je sais que ta procédure fonctionne également.

Au revoir

"MichDenis" a écrit dans le message de news:

| Merci quand même mais ça y est grâce au code de Garette. Sacré
| "ActiveWorkbook.Save" que j'avais oublié.


Tu retiens la procédure qui te convient ...c'est ok.
mais celle que je t'ai soumise fonctionne très bien.





1 2