VBA : ouverture de fichier excel en boucle

nico3110 Messages postés 4 Statut Membre -  
 nico3110 -
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!!
Configuration: Windows XP Internet Explorer 7.0

13 réponses

  1. melanie1324
     
    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
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      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
  2. melanie1324 Messages postés 1561 Statut Membre 156
     
    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
  3. nico3110
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. nico3110
     
    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
  6. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  7. nico3110
     
    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
  8. nico3110
     
    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
  9. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Salut,
    J'ai peut être une autre solution ici
    0
  10. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      1. Polux31 Messages postés 7219 Statut Membre 1 204 > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Interressante ... mais il est de bon ton de citer ses sources ...
        0
      2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Polux31 Messages postés 7219 Statut Membre
         
        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
  11. nico3110
     
    merci polux!!!!!!!!!

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

    cool

    bonne journée
    0
  12. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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