VBA : ouverture de fichier excel en boucle

Fermé
nico3110 Messages postés 3 Date d'inscription mercredi 26 août 2009 Statut Membre Dernière intervention 6 novembre 2009 - 26 août 2009 à 17:28
 nico3110 - 27 août 2009 à 13:01
Bonjour,


Nouveau sur le forum et en programmation VBA, j'ai besoin d'aide.Voila mon probleme:

J'ai crée plusieurs fichiers excel avec SAS. Ces fichiers excel ont tous la même forme et je doit faire une macro de mise en page. Pas de probleme jusque la .

Je voudrais savoir comment commencer ma macro pour demander :

- ouvrir le premier fichier excel du dossier
-ici j'integre ma macro de mise en forme
-enregistre le fichier une fois la mise en page effectué
-ferme le fichier
-ouvre le second fichier excel du dossier et rebelotte.....jusqu'au dernier fichier excel.

Quelqu'un pourrait il m'aider a ecrire le programme ou je peux demander de selectionner le premier fichier excel puis faire la boucle ......

Merci d'avance

P.S : j'espere avoir été clair!!

13 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
26 août 2009 à 18:35
Bonjour,

Un exemple ici : https://forums.commentcamarche.net/forum/affich-13840446-vba-ouverture-dossier#11

N'hésite pas à revenir pour avoir des explications.

;o)
0
Bonsoir,
sub miseenforme

dim fichier as string

fichier = 7
do while fichier <>7
fichier = msgbox("Voulez-vous ouvrir un fichier pour le mettre en forme?", vbyesno)

if fichier = 6 then
Application.Dialogs(xlDialogOpen).Show
'intègre ta mise en forme
'ici, tu dois être sur ton classeur ou tu as appliqué ta mise en forme
activeworkbook.save
activeworkbook.close
fichier =1
end if
loop

end sub
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
26 août 2009 à 18:45
dim fichier as string
fichier = 7
???

Merci de vérifier un peu avant de poster ...

La variable "fichier" est déclarée en String et tu lui affectes un Integer (7) ???

D'ailleurs d'où sort ce 7 ???
0
melanie1324 Messages postés 1504 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
26 août 2009 à 19:09
Bonjour,

on peut le mettre en integer mais en string ca marche aussi, je l'utilise tout le temps.
Parce que ca sert pour ma boucle car on demande à l'utilisateur s'il veut ouvrir un fichier et si c'est oui fichier =6 si c'est non fichier =7.

Et c'est vrai j'ai une erreur dans le code car écrit vite.

sub miseenforme

dim fichier as integer

fichier = 6
do while fichier <>7
fichier = msgbox("Voulez-vous ouvrir un fichier pour le mettre en forme?", vbyesno)

if fichier = 6 then
Application.Dialogs(xlDialogOpen).Show
'intègre ta mise en forme
'ici, tu dois être sur ton classeur ou tu as appliqué ta mise en forme
activeworkbook.save
activeworkbook.close

end if
loop

end sub
0
bonjour

Merci à vous deux pour vos exemple.

Je crois que tu as exactement compris ce que je voulais polux...mais par contre je crois que c moi qui est beaucoup plus de mal à comprendre ta procédure en exemple.

et oui je débute en VBA, j'essaie de déchiffrer un peu ..mais bon je comprend pas trop pourquoi y'a plusieurs procédure et ce qu'elle font.......allez je me lance dans le déchiffrage!!

Merci encore à vous deux!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polux,

j'ai regardé un peu le programme ...c plus clair pour certaines partie ..moins pour d'autre. Si tu as un peu de temps, je vais copier ici ton exemple en te posant quelques questions...


1. .....alors la , c toutes la premiere partie ..c le blackout..je comprends rien et ne sais pas à quoi cela sert..est ce que tu crois que j'ai besoin de ca? et si oui pourquoi????


Option Explicit

'L'objet ClipBoard n'existant pas en VBA, il faut utiliser les fonctions de l'API Windows :
'-- Déclaration des fonctions API
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long

Private mTabFiles()
Private pathFolder As String

'Setter d'affection de valeur à pathFolder
'Cette valeur vient de la cellule C3
'Procédure appelée par cmdMenu_Click() de Feuil1
Public Sub setPathFolder(ByVal str As String)
pathFolder = str
End Sub

'Procédure Main du traitement
'Procédure appelée par cmdMenu_Click() de Feuil1
Public Sub Main()

initEnvironnement
traiteFichiers

End Sub

'Procédure d'initialisation du tableau mTabFiles()
'Procédure appelée par Main()
Private Sub initEnvironnement()

'On récupère le chemin d'acces de tous les fichiers contenus dans le répertoire
'
If ModTools.AllFilesInFolder(pathFolder, mTabFiles()) = False Then

End If

End Sub

2.seconde partie, je comprends le principe mais ne sais pas ou je dois écrire le chemin d'accés et si je dois donner le nom du premier fichier excel et du dernier contenu dans mon dossier?

..j'ai enlevé quelques partie du code car je n'ai que du xls à traiter (j'espere ne pas avoir fait trop de coupe).

'Procédure qui traite tous les fichiers du répertoire
Private Sub traiteFichiers()
Dim i As Long
Dim ext As String

'Pour tous les fichiers de mTabFiles()
For i = LBound(mTabFiles()) To UBound(mTabFiles())
'On extrait l'extension
'mTabFiles(i) contient le chemin d'acces et le nom d'un fichier
'ex mTabFiles(i) = "C:\MonDossier\MonSousDossier\MonFichier.XLS"

'On lance la procédure pour traiter les fichiers Excel
Call traiteXLS(mTabFiles(i))

Next i

End Sub

3. ensuite ,ici j'integre ma macro de mise en forme....si j'ai bien comprs...
4.et enfin ..encore une ^partie que je n'ai pas compris

Private Sub VideMemoire()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub

J'espere que je suis clair et que je n'abuse pas top de ton temps!!!
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
27 août 2009 à 11:24
Bonjour,

Je viens de me rendre compte que je ne t'ai pas donné le bon lien ... Regarde sur celui là si le fichier est toujours actif sur cjoint.com: https://forums.commentcamarche.net/forum/affich-13840446-vba-ouverture-dossier#9.

Tu auras la partie qui permet de récupérer tous les fichiers d'un répertoire.

Pour répondre à tes questions:

1) et 4)

'L'objet ClipBoard n'existant pas en VBA, il faut utiliser les fonctions de l'API Windows : 
'-- Déclaration des fonctions API 
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function CloseClipboard Lib "user32" () As Long 
Private Declare Function EmptyClipboard Lib "user32" () As Long 

'....

Private Sub VideMemoire() 
   OpenClipboard 0 
   EmptyClipboard 
   CloseClipboard 
End Sub 


Cette partie de code sert à vider le presse-papier Windows. Si tu ne fais pas de copier/coller de feuille ou de plage, tu n'en as pas besoin.

2) ..j'ai enlevé quelques partie du code car je n'ai que du xls à traiter (j'espere ne pas avoir fait trop de coupe).

Es-tu sûr que ton répertoire ne contient que des fichiers .XLS ? Ca ne coûte rien de contrôler l'extension de ton fichier avant de le traiter.

3) Pour lancer ta macro, tu remplaces "Call traiteXLS(mTabFiles(i))" par "Call maMacro(mTabFiles(i))"

;o)

PS: Tu n'abuses pas ... ^^
0
ok merci..le lien marche mais bon, je ne suis pas sur de comprendre ce qu'il faut faire :

Je vais essayer de reecrire une code simple et peut etre pourra tu m'aider:

1. definir mon dossier (que j'irai changer directement dans la macro ..une fois par an cela devra aller
2.faire une procedure lui indiquant de selectionner le premier fichier xls
3. faire tourner ma macro de mis en forme , enregistrer et fermer le fichier
4. dans la partie 2 mettre en place une boucle lui indiquant que lorsque la procedure de mise en forme et terminer qu'il doit faire la meme chose avec le second jusqu'au dernier des fichiers excel se trouvant dans mon dossier.

..je me lance.mais je ne sais meme pas par quoi commencer..lol

Encore merci pour ton aide...
0
ok

Private Sub traiteFichiers()

Dim pathfolder As String
Dim i As Long
Dim mTabFiles As Excel.Workbook

Set pathfolder = « C:\MonDossier\MonSousDossier »"


For i = LBound(mTabFiles()) To UBound(mTabFiles())
Call traiteXLS(mTabFiles(i))
Next i

End Sub

Je pense que je me plante complet mais bon dans cette procedure je voudrais lui indiquer ou se trouve mon dossier (pathfolder), lui definir mtabesfiles en tant que classeur excel et lui dire de faire une boucle en appliquant la macro traiteXLS...

je suis loin non??est ce qu'il est possible de le faire dans une procedure?

Sinon pour faire plus simple, je peux commencer ma macro en me mettant dans le dossier ou se trouve mes fichier excel et juste faire la boucle en lui demandant de prendre l'ensemble des fichiers excel se trouvant dedans???
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
27 août 2009 à 12:23
Salut,
J'ai peut être une autre solution ici
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
27 août 2009 à 12:31
OK ...

Je vais reprendre depuis le début .. ^^

1) definir mon dossier (que j'irai changer directement dans la macro ..une fois par an cela devra aller
- plutôt que d'aller dans le code modifier le chemin (pas très pro ça ;o)), je te propose de mettre le chemin du dossier dans une cellule d'une feuille d'Excel.
- Ensuite de mettre un bouton sur la feuille Excel pour lancer la macro.
2, 3, 4) faire une procedure lui indiquant de selectionner le premier fichier xls.
- C'est là que les choses se compliquent un peu. Ce n'est pas une mais plusieurs procédures ou fonctions que ta macro va mettre en oeuvre ... En effet, Tu as besoin de "plusieurs services" pour réaliser ce que tu veux faire. Il faut donc structurer ton code en autant de service que de tâche à faire. Cela permet une meilleure compréhension et maintenance de ton code.

Pour faire simple:
- On met en mémoire (dans un tableau "mTabFiles()") tous fichiers d'un répertoire. Pour faire cela, on va se servir d'une fonction.
- On va ensuite ouvrir un à un les fichiers pour les traiter.

Je fais une maquette et je te l'envoie.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
27 août 2009 à 12:37
Je proposais juste avant cette macro qui, il me semble, remplit toutes les conditions.

Sub ouvrir_et_fermer_fichiers ()
Dim ScanFic As Office.FileSearch
Dim NomFic As Variant
Dim Diag As String, fich As String, exten As String
Dim Nbr As Long
Dim NBlignes As Integer, NBCol As Integer
Dim objShell As Object, objFolder As Object, oFolderItem As Object
Dim Chemin As String
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
On Error Resume Next
Set oFolderItem = objFolder.Items.Item
Chemin = oFolderItem.Path
Range("A1").Value = Chemin '-----> à adapter si vous avez quelque chose en A1
exten = InputBox("Saisissez ici l'extension souhaitée pour la recherche. Par ex : xls pour excel, doc pour word, ppt pour powerpoint, pour tous fichiers tapez *.*", "Extension de fichier")
Set ScanFic = Application.FileSearch
With ScanFic
.NewSearch
.LookIn = Range("A1").Value
.SearchSubFolders = True
.Filename = exten
.MatchTextExactly = True
.FileType = msoFileTypeAllFiles
Nbr = .Execute
For Each NomFic In .FoundFiles
Workbooks.Open Filename:=NomFic
MsgBox (NomFic & " est ouvert et va se refermer")
ActiveWorkbook.Close
Next
End With
End Sub
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
27 août 2009 à 12:45
Interressante ... mais il est de bon ton de citer ses sources ...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016
27 août 2009 à 12:49
Exact, et je suis le premier à le faire en tant ordinaire... Malheureusement j'ai perdu la source de cette macro. Désolé pour l'auteur.
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
27 août 2009 à 12:43
Voilà tu n'as plus qu'à mettre ton code dans TraiteXLS() ... : https://www.cjoint.com/?iBmReQcnXs
0
merci polux!!!!!!!!!

tu es un boss........je pense que seul j'aurais mis un mois!!!

cool

bonne journée
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
26 août 2009 à 19:43
Je ne pense que ça soit ce qui est demandé !!!

Ici l'utilisateur doit à chaque fois sélectionner un fichier pour le traiter. Il me semble que la demande est de le faire automatiquement à partir d'un dossier.

En résumé:

La macro ouvre un fichier dans un dossier, traite la mise en forme du fichier, le sauvegarde et fait la même chose avec le fichier suivant ... ainsi de suite jusqu'au dernier fichier du dossier.

Si l'utilisateur doit intervenir, ce n'est que pour indiquer le dossier contenant les fichiers à traiter.

;o)
-1