IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Code qui fonctionne en pas à pas (F8), mais pas lors de l'exécution


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut Code qui fonctionne en pas à pas (F8), mais pas lors de l'exécution
    Bonjour,

    j'ai un cas de figure assez étrange. J'ai besoin d'ouvrir des centaines de fichiers puis d'effectuer certaines instructions sur ces fichiers. Problème : lorsque j'ouvre le fichier avec un macro et que je déclare des plages dans ce classeur, le code ne fonctionne pas. Plus bizarre encore, lorsque j'exécute ce code en pas à pas, ça fonctionne.

    Voici mon code que vous puissiez reproduire le problème chez vous (activer Microsoft Scripting Runtime dans les références) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Sub titi()
        Dim systemeDeFichiers As Scripting.FileSystemObject
        Set systemeDeFichiers = New Scripting.FileSystemObject
        Dim repertoire As Folder
        Set repertoire = systemeDeFichiers.GetFolder(ThisWorkbook.Path)
     
        Dim fichier As File
        Dim i As Integer
        Let i = 0
        For Each fichier In repertoire.Files
            If InStr(fichier.Name, "Equity") <> 0 Then
                i = i + 1
                Debug.Print i
                Dim classeur As Workbook
                Set classeur = Application.Workbooks.Open(fichier.Path)
                Dim plage As Range
                Set plage = classeur.Worksheets(1).Range("AJ1, AM1, AP1")
    (Instructions)
            End If
        Next fichier
    End Sub
    Le code s'arrête à l'instanciation de plage, alors que normalement, le classeur est bien ouvert. Quand on le fait pas à pas, tout fonctionne parfaitement. Quelqu'un a une idée ? Est-ce que ce serait lié au fait que le classeur (un peu volumineux et qui met quelques secondes à s'ouvrir) n'est pas bien ouvert au moment de l'exécution de cette ligne (alors que quand on le fait en pas à pas, il a le temps de s'ouvrir) ? J'ai tenté des trucs avec des while Workbooks.count=1 DoEvents...sans succès...

    Je vous remercie

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Anova, bonjour le forum,

    Peut-être comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub titi()
    Dim systemeDeFichiers As Scripting.FileSystemObject
    Dim repertoire As Folder
    Dim fichier As File
    Dim i As Integer
    Dim classeur As Workbook
    Dim plage As Range
     
    Set systemeDeFichiers = New Scripting.FileSystemObject
    Set repertoire = systemeDeFichiers.getfolder(ThisWorkbook.Path)
    Let i = 0
    For Each fichier In repertoire.Files
        If InStr(fichier.Name, "Equity") <> 0 Then
            i = i + 1
            Debug.Print i
            Set classeur = Application.Workbooks.Open(fichier.Path)
            With classeur.Worksheets(1)
                Set plage = Application.Union(.Range("AJ1"), .Range("AM1"), .Range("AP1"))
            End With
            '(Instructions)
        End If
    Next fichier
    End Sub

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Bonjour, bonjour !

    Les variables doivent être déclarées au début de la procédure.

    Sinon FSO n'est pas nécessaire, utiliser la fonction Dir serait peut-être plus simple …

  4. #4
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Avec une petite fonction pour la récup. des classeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Sub Classeurs()
     
        Dim Cls As Workbook
        Dim plage As Range
        Dim Tbl
        Dim I As Integer
     
        'seuls les classeurs contenant "Equity" et d'extension xls seront retournés, à adapter...
        Tbl = RecupFichiers(ThisWorkbook.Path & "\", "Equity", "xls")
     
        For I = 1 To UBound(Tbl)
     
            Set Cls = Workbooks.Open(Tbl(I))
            Set plage = Cls.Worksheets(1).Range("AJ1, AM1, AP1")
     
            'suite des instructions...
     
        Next I
     
    End Sub
    Function RecupFichiers(Chemin As String, Critere As String, Extension As String) As String()
     
        Dim TableauFichiers() As String
        Dim Fichier As String
        Dim I As Integer
     
        Fichier = Dir(Chemin & "*" & Critere & "*." & Extension)
     
        Do While (Len(Fichier) > 0)
     
            I = I + 1
     
            ReDim Preserve TableauFichiers(1 To I)
     
            TableauFichiers(I) = Fichier
     
            Fichier = Dir()
     
        Loop
     
        RecupFichiers = TableauFichiers()
     
    End Function
    Hervé.

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/05/2013, 17h27
  2. Code qui fonctionne sur Matlab 7.1 mais pas sur R2009b?
    Par kariboubou dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/06/2011, 19h11
  3. Réponses: 1
    Dernier message: 01/01/2011, 15h14
  4. [CS5] Preloader qui fonctionne avec Le player V9 mais pas V10..
    Par ArC3Nik dans le forum Flash
    Réponses: 1
    Dernier message: 06/07/2010, 19h22
  5. Réponses: 1
    Dernier message: 18/11/2009, 13h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo