Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/11/2011, 15h28   #1
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Par défaut Exporter chaque feuille d'un classeur au format texte

Bonjour,

Je suis en train d'écrire une macro dans une classeur Excel outils appelé "outils.xls".

Il faut savoir aussi que je suis une bille en Excel

Cette macro est codée dans l'évènement "Workbook_Open()".

Cette feuille sera placée dans le répertoire où se trouvera un classeur contenant plusieurs onglets contenant des données indépendantes.

Le but de cette macro est de sauver les données de chaque feuille au format texte. En double-cliquant sur la feuille Excel "outils.xls", ça créera un fichier texte par feuille.

Voilà ce que j'ai fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
Private Sub Workbook_Open()
 
    Dim repertoire As String
    Dim classeur As String
    Dim feuille As Object
 
    repertoire = "C:\temp\"
    classeur = "datas.xls"
 
    Set appExcel = CreateObject("Excel.Application")
    appExcel.Workbooks.Open Filename:=repertoire + classeur
 
    For Each feuille In appExcel.Sheets
        'MsgBox feuille.Name
 
        feuille.Select
        feuille.Copy
 
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs Filename:=repertoire + feuille.Name, FileFormat:=xlText, CreateBackup:=False
        Application.DisplayAlerts = True
 
        feuille.Activate
    Next feuille
 
    appExcel.Workbooks.Close
 
End Sub
Hélas, ça ne fonctionne pas

Ca créé bien des fichiers texte, mais vides
Et en plus, ça ouvre autant de classeurs que de feuille, contenant les données ?

Quelque'un peut-il m'aider ?

Merci.
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 16h11   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 869
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 869
Points : 1 837
Points : 1 837
Le problème est que ActiveWorkbook est ton classeur "outils.xls". Je corrige ton code et t'envoie ça.
ZebreLoup est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 16h18   #3
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 869
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 869
Points : 1 837
Points : 1 837
Voilà, essaie voir si ça marche :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Workbook_Open()
    Dim repertoire As String
    Dim classeur As String
    Dim feuille As Worksheet
 
    repertoire = "C:\temp\"
    classeur = "datas.xls"
 
    Set appexcel = CreateObject("Excel.Application")
    appexcel.Workbooks.Open Filename:=repertoire + classeur
 
    For Each feuille In appexcel.Workbooks.Sheets
        Application.DisplayAlerts = False
        feuille.SaveAs Filename:=repertoire + feuille.Name, FileFormat:=xlText, CreateBackup:=False
        Application.DisplayAlerts = True
    Next feuille
 
    appexcel.Workbooks.Close
    Set appexcel = Nothing
End Sub
ZebreLoup est actuellement connecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/11/2011, 16h20   #4
Membre confirmé
 
Inscription : juillet 2006
Messages : 345
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 345
Points : 287
Points : 287
bonjour,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub test()
 
    Dim repertoire As String
    Dim classeur As String
    Dim feuille As Object
 
    repertoire = "c:\temp\"
 
    For Each feuille In Sheets
        'MsgBox feuille.Name
 
        feuille.Select
 
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs Filename:=repertoire + feuille.Name & ".txt", FileFormat:=xlText, CreateBackup:=False
        Application.DisplayAlerts = True
 
    Next feuille
 
End Sub
Ce code exporte chaque feuille du classeur actif, je vous laisse l'adapter si besoin.

Bonne journée.
Access Newbie est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 16h26   #5
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Pourquoi créer une nouvelle instance Excel?
Aussi, le mieux de travailler avec la variable Wbk
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim Repertoire As String, Classeur As String
Dim Feuille As Worksheet
Dim Wbk As Workbook
 
Repertoire = "C:\temp\"
Classeur = "datas.xls"
Application.ScreenUpdating = False
Set Wbk = Workbooks.Open(Filename:=Repertoire & Classeur)
For Each Feuille In Wbk.Worksheets
    Feuille.Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=Repertoire & Feuille.Name, FileFormat:=xlText, CreateBackup:=False
    Application.DisplayAlerts = True
    ActiveWorkbook.Close False
Next Feuille
Wbk.Close False
Set Wbk = Nothing
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 60
Vieux 14/11/2011, 16h31   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 869
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 869
Points : 1 837
Points : 1 837
Oui, d'accord avec Mercatog, tu peux utiliser l'instance courante d'Excel sans problème.
Mais du coup, il vaut peut-être mieux utiliser wbk au lieu de activeWorkbook et ne pas le fermer dans la boucle, non ?
Un Select plutôt qu'un copie suffirait également.
Et pour faire encore plus simple, comme dans mon code plus haut, il me semble qu'on peut utiliser saveas directement sur l'objet worksheet
ZebreLoup est actuellement connecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/11/2011, 16h47   #7
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Non

Quand on fait un nouveau classeur se crée et devient le classeur active qu'on sauvegarde au format text et on ferme

Le code fait ceci

à l'ouverture d'un classeur (où est écrit le code), un 2ème classeur est ouvert (datas.xls), instancié dans la variable Wbk.
On parcourt toutes les feuilles de Wbk
Code :
For Each Feuille In Wbk.Worksheets
On copie chaque feuille
Cette ligne nous crée un 3ème classeur qui devient actif qu'on enregistre au format texte et on ferme et repart vers la feuille suivante.

J'ai des redondances dans l'explication mais essaie de faire le pas à pas (F8) tu sauras.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 14/11/2011, 17h31   #8
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Citation:
Envoyé par mercatog Voir le message
Pourquoi créer une nouvelle instance Excel?
Aussi, le mieux de travailler avec la variable Wbk
Merci mercatog, ça fonctionne parfaitement

Voici le code final :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
Private Sub Workbook_Open()
 
Dim Repertoire As String, Classeur As String
Dim Feuille As Worksheet
Dim Wbk As Workbook
 
Repertoire = "C:\temp\"
Classeur = "datas.xls"
 
Application.ScreenUpdating = False
Set Wbk = Workbooks.Open(Filename:=Repertoire & Classeur)
 
For Each Feuille In Wbk.Worksheets
    Feuille.Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=Repertoire & Feuille.Name, FileFormat:=xlText, CreateBackup:=False
    Application.DisplayAlerts = True
    ActiveWorkbook.Close False
Next Feuille
 
Wbk.Close False
Set Wbk = Nothing
 
End Sub
Merci aussi à ZebreLoup et à Access Newbie pour votre aide

domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 09h05   #9
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Bonjour,

Le poste est bien résolu mais j'ai encore une toute dernière chose à vous demander.

Je voudrais que le classeur "outils.xsl" se ferme après traitement.
J'ai donc ajouté ceci

Code :
1
2
3
4
5
6
7
 
...
Wbk.Close False
Set Wbk = Nothing
Workbooks.Close
 
End Sub
Le classeur est bien fermé, mais Excel est toujours ouvert.

Y a-t-il un moyen pour que Excel se ferme aussi?
Merci.
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 10h41   #10
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Je crois avoir trouvé

Il ne faut pas fermer le classeur "outils" car sinon, la macro ne tourne plus.

Je ferme donc toutr simplement Excel en faisant comme ceci à la fin de la fonction:

Code :
1
2
3
4
5
6
7
 
...
Wbk.Close False
Set Wbk = Nothing
 
' On ferme Excel
Application.Quit
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h40.


 
 
 
 
Partenaires

Hébergement Web