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 :

Ne pas activer macro Workbook_open d'un fichier ouvert depuis un autre avec CreateObj [Trucs & Astuces]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Ne pas activer macro Workbook_open d'un fichier ouvert depuis un autre avec CreateObj
    Bonjour
    Malgré des réponses sur le net et sur ce forum à des questions proches de la mienne, je n'arrive pas à mes fins.
    Je souhaite obtenir dans un fichier synthèse contenant 3 onglets : un onglet Parmètres et 2 onglets Résultats, la somme des cellules des 2 mêmes onglets des fichiers paramètrés
    Je dois mal m'y prendre avec Application.EnableEvents . Non ?

    Car dans ces fichiers il y a des macros qui s'exécutent à l'ouverture (Workbook_Open), ce que je ne veux pas.
    Je pensais résoudre mon pb avec Application.EnableEvents = False
    mais cela n'empêche pas l'exécution du code contenu dans Workbook_Open
    Comment faire , en dehors de supprimer ce code dans chaque fichier ?

    Merci pour votre aide
    Voici une partie du code dans le fichier destinataire (synthèse) --> le coeur du problème en rouge
    Bien cordialement

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
        Répertoire = ActiveWorkbook.Path & "\"
        FichierRéception = ActiveWorkbook.Name
        OngletRéception1 = "2.2 Mensu Prod Org"
        OngletRéception2 = "2.5 Mensu Force de Travail"
        
        Ligne = 10
        Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4)            ' Colonne  D
        RepertoirePal = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(8, 3)  ' Colonne C
        RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
        Fichier = Dir(RepertoireSource & Chaine & ".xls")
        
        ' On vide la colonne A qui contient la date d'intégration des données de chaque fichier
        Workbooks(FichierRéception).Worksheets("Paramètres").Unprotect ("1611")
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10:A100").Select
        Selection.ClearContents
        
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10").Select
        Do Until Fichier = ""
            'Application.EnableEvents = False
            ' Je n'arrive pas à interdir lors de l'ouverture des fichiers Maquette du 
            ' l'exécution du code figurant dans Workbook_Open
            ' Je suis donc contraint de supprimer le code contenu dans chaque fichier dans Workbook_Open ou alors trouver une solution
            
            With CreateObject("Excel.Application").Workbooks.Open(RepertoireSource & Fichier)
            On Error Resume Next
            .Application.EnableEvents = False
            
              ' Etape 1 : Onglet OngletRéception1
              For LigneSource = 6 To 121
                For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    End If
                Next Colonnesource
              Next LigneSource
              
              LigneSource = 128 ' pour Productivité en EUTC (intégration TGA)
              For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    End If
              Next Colonnesource
              
              ' Etape 2 : Onglet OngletRéception1
              Dim LigneOnglet2
              LigneOnglet2 = Array(7, 12, 21, 29, 39, 43, 49, 55, 67, 78, 81, 85, 90, 93, 97)
              For Indice = 0 To 13
                LigneSource = LigneOnglet2(Indice)
                For Colonnesource = 3 To 14
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 2, Lig " & LigneSource & " Col " & Colonnesource
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = .Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) + .Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)
                    End If
                
                Next Colonnesource
              Next Indice
              
              Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Intégré le " & Now()
                .Application.EnableEvents = True
                .Close False  ' ferme sans enregistrer les modifications éventuelles apportées au fichier source
    
            End With
            
    FichierSuivant:
            Ligne = Ligne + 1
            Fichier = ""
            Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4) ' Colonne  D
            RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
    
            Fichier = Dir(RepertoireSource & Chaine & ".xls")
        Loop

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    Je n'ai pas tout lu mais je pense que tu devrais desactiver les évènements AVANT d'ouvrir ton fichier et également prévoir de rétablir cette propropriété en cas d'erreur:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Essai()
        On Error GoTo ErrH
        Application.EnableEvents = False
        Do
            'Ton traitement
        Loop
        Exit Sub
    ErrH:
        Application.EnableEvents = True
    End Sub
    Cordialement,

    Tirex28/

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci pour ton intérêt à mon pb
    J'avais tenté ce que tu dis mais là aussi le code du fichier appelé s'éxécutait

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Do Until Fichier = ""
            'Application.EnableEvents = False
            ' Je n'arrive pas à interdir lors de l'ouverture des fichiers Maquette du Siège
            ' l'exécution du code figurant dans Workbook_Open
            ' Je suis donc contraint de supprimer le code contenu dans chaque fichier dans Workbook_Open
            Application.EnableEvents = False
            With CreateObject("Excel.Application").Workbooks.Open(RepertoireSource & Fichier)
            On Error Resume Next
     
    Fais le test
     
    Le code dans l'appelé est le suivant :
     
    'Option Explicit     'Option obligeant à déclarer les variables
    Option Base 0       'Option indiquant que l'indice des tableaux commence à 0
     
     
    '=============================================================================
    ' Application          : ' nom                  : Fichier_Template.xls
    ' description          : Genere une maquette de saisie ou de restitution
    ' Auteur               : ' version              : 1_0_0.0
    ' date de creation     : 
    ' date de modification :
    '=============================================================================
     
    '========================================================================================
    'S'execute à l'ouverture du fichier.
    'Activation de l'Add_in Essbase, lecture du fichier ....
    '========================================================================================
     
     
    Private Sub Workbook_Open()
      Dim msg, Style, Title, Help, Ctxt, response, MyString
     
      On Error GoTo gesterreur
     
      'Stop
     
     
      ' TODO: afin de désactiver les barres de commandes Visual Basic et Macro
      'Dim CmdB As CommandBar
     'desactivation des touches de raccourcis ...
        'application.OnKey "%{F8}", ""
        'application.OnKey "%{F11}", ""
      'fermeture de l'editeur VBA ...(au cas ou ils soit ouvert lors du lancement du classeur programmé ...
        'application.VBE.MainWindow.Visible = False
      'Desactivation de la barre d'outils VBA et du raccourci dans le menu ....
      'application.CommandBars("Visual Basic").Enabled = False
      'application.CommandBars("Macro").Enabled = False
     
      'application.CommandBars("Visual Basic").Enabled = True
      'application.CommandBars("Macro").Enabled = True
      'FIN  TODO: afin de désactiver les barres de commandes Visual Basic et Macro
     
      'Call MOE_m_traitement.InitTraitement
     
      Call MOE_m_traitement.LanceTraitement
     
      Call MOE_m_traitement.FinirTraitement
     
      'Call CreerBoutonRafraichir
     
      'If GBL_ACTIVATION_POPUP = "non" Then
      'Else: USF_Param.Show
      'End If
      Exit Sub
    gesterreur:
       MsgBox ("Workbook_Open " & Err.Number)
       Call MOE_m_traitement.TerminateTraitement
    End Sub
     
    's'exécute à la fermeture du fichier
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call MOE_m_traitement.desActiveEssbase
     
    End Sub

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu as toujours la possibilité de travailler sur tes classeurs fermés. Tu trouveras la syntaxe appropriée dans un e x c e l l e n t tutoriel, ici.
    Bon courage

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    Je n'ai pas compris pourquoi tu utilises un CreateObject si tu es déja dans Excel mais (sans avoir testé) j'écrirais plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set XlApp = CreateObject("Excel.Application")
    XlApp.EnableEvents = False
    XlApp.Workbooks.Open(RepertoireSource & Fichier)

    bonne soirée
    michel

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci pour ce lien mais ce tutoriel montre comment lire et écrire dans les classeurs Excel fermés en utilisant le modèle ADO

    La commande que j'utilise CreateObject("Excel.Application").Workbooks.Open(RepertoireSource ) permet également de lire des classeurs Excel fermés
    et j'aimerai savoir comment ne pas activer les macros des classeurs Excel fermés lus par cette commande.
    Je pensais que l'instruction pplication.EnableEvents = False placée au bon endroit résoudrait mon problème mais non, le code contenu dans Workbook_Open du classeur fermé s'exécute.... Pourquoi ?

    Comment faire sans passer par ADO ?

    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
    Do Until Fichier = ""
    
            Application.EnableEvents = False
            With CreateObject("Excel.Application").Workbooks.Open(RepertoireSource & Fichier)      
    
     etc ...  
          Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) + .Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)
    
              .Close False  ' ferme sans enregistrer les modifications éventuelles apportées au fichier source
              Application.EnableEvents = True
    
            End With
            
    FichierSuivant:
            Ligne = Ligne + 1
            Fichier = ""
            Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4) ' Colonne  D
            RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
    
            Fichier = Dir(RepertoireSource & Chaine & ".xls")
        Loop
    Citation Envoyé par SilkyRoad Voir le message
    bonjour

    Je n'ai pas compris pourquoi tu utilises un CreateObject si tu es déja dans Excel mais (sans avoir testé) j'écrirais plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set XlApp = CreateObject("Excel.Application")
    XlApp.EnableEvents = False
    XlApp.Workbooks.Open(RepertoireSource & Fichier)

    bonne soirée
    michel
    Michel, ce que tu proposes est identique à ce que j'ai écrit (si ce n'est sur plusieurs lignes) et donc provoque le même pb : l'exécution du code du fichier appelé.
    Tu utilises également un CreateObject... comme moi, ce qui était l'objet de ta surprise...
    Mais tu as sûrement voulu dire autre chose
    A+

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    rebonjour

    Michel, ce que tu proposes est identique à ce que j'ai écrit (si ce n'est sur plusieurs lignes) et donc provoque le même pb : l'exécution du code du fichier appelé.
    visiblement tu n'as pas testé l'exemple que je t'ai proposé.
    Dans la procédure ci dessous le classeur est supposé contenir un evenement Workbook_Open :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
        Dim XlApp As Excel.Application
     
        Set XlApp = CreateObject("Excel.Application")
        XlApp.EnableEvents = False
        XlApp.Workbooks.Open ("C:\ClasseurTest.xls")
        '
        '...
        '
        XlApp.Quit
    End Sub
    De cette manière l'evenement n'est pas déclenché.



    Tu utilises également un CreateObject... comme moi, ce qui était l'objet de ta surprise...
    Je ne fais qu'adapter ton code car je n'ai pas compris ce que tu cherches à réaliser



    Une syntaxe plus logique sans CreateObject :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Wb As Workbook
     
    Application.EnableEvents = False
     
    Do Until Fichier = ""
        Set Wb = Workbooks.Open(RepertoireSource & Fichier)
        '
        '...
        '
        Wb.Close
    Loop
     
    Application.EnableEvents = True

    bonne soirée
    michel

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par SilkyRoad Voir le message

    visiblement tu n'as pas testé l'exemple que je t'ai proposé.
    Dans la procédure ci dessous le classeur est supposé contenir un evenement Workbook_Open :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
        Dim XlApp As Excel.Application
     
        Set XlApp = CreateObject("Excel.Application")
        XlApp.EnableEvents = False
        XlApp.Workbooks.Open ("C:\ClasseurTest.xls")
        '
        '...
        '
        XlApp.Quit
    End Sub
    De cette manière l'evenement n'est pas déclenché.

    Si Michel. J'ai testé ton code et la macro du fichier appelé s'exécute quand même. C'est ce que je ne comprends pas


    Je ne fais qu'adapter ton code car je n'ai pas compris ce que tu cherches à réaliser
    Je veux à partir d'un fichier principal sommer des cellules de feuilles de classeurs de même structure, classeurs que je ne veux pas voir apparaîre à l'écran. La syntaxe CreateObject permet comme ADO de lire (mais aussi d'écrire) dans des classeurs Excel fermés.

    Ta 2ème solution Set Wb = Workbooks.Open(RepertoireSource & Fichier)
    ouvre le fichier appelé qui devient le fichier actif.

    Est-ce plus clair ?

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par LentilleLocale
    Je veux à partir d'un fichier principal sommer des cellules de feuilles de classeurs de même structure, classeurs que je ne veux pas voir apparaîre à l'écran. La syntaxe CreateObject permet comme ADO de lire (mais aussi d'écrire) dans des classeurs Excel fermés.
    Là je peux te dire que tu commets une erreur.
    Mets simplement XlApp.visible = True et tu verras que ton fichier est bien ouvert. Ensuite, tu perds le temps de lancer une seconde fois l'application Excel. Sans compter la place que ça tient en mémoire.
    Par contre, un travail important sur une application invisible est accéléré. (traitement d'images entre autres)
    A toutes fins utiles.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    J'ai testé les 2 méthodes : la lecture/écriture est beaucoup plus rapide en utilisant CreatObject au lieu de Set Wb= Workbooks.open(etc

    Reste que Workbook_Open ne s'exécute effectivement pas avec Set Wb contrairement à CreateObject
    Mais lors de Wb.close false le code suivant s'exécute à la fermeture du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call MOE_m_traitement.desActiveEssbase
     
    End Sub
    Pourquoi ?

    J'aimerai quand même savoir comment éviter l'exécution du code lors de l'ouverture et de la fermeture pour ces 2 méthodes ? d'autant que la 1ère m&thode donne des résultats de lecture/écriture beaucoup plus rapides

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    Reste que Workbook_Open ne s'exécute effectivement pas avec Set Wb contrairement à CreateObject
    C'est exactement pareil dans les deux cas, sauf que tu ouvres une nouvelle instance par CreateObject ...




    Mais lors de Wb.close false le code suivant s'exécute à la fermeture du fichier
    montre nous ton code.


    bonne soirée
    michel

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    1) Le code 1 avec CreateObject (Temps de traitement 1 minute 15 pour 4 fichiers lus) : le code des fichiers lus est exécuté (workbook_open et workbook_before close)

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    Private Sub CommandButton1_Click()
    ' Lionel  Mardi 16 septembre 2008
    Dim XlApp As Excel.Application
     
    ' Vérification que le chemin principal se termine bien par un anti-slash \
    FinRep = Right(Sheets("Paramètres").Range("C8"), 1)
    If FinRep <> "\" Then
        Rep = MsgBox("Attention, le chemin principal doit se terminer par le caractère \", vbCritical, "Merci de corriger SVP...")
        Sheets("Paramètres").Range("C8").Select
        Exit Sub
    End If
     
     
    Rep = InputBox("Veuillez saisir le mot de passe SVP...", "Confirmation Traitement")
    If Rep <> "1611" Then
        Rep = MsgBox("Désolé, mot de passe incorrect", vbOKOnly, "Erreur")
        Exit Sub
    End If
     
        Répertoire = ActiveWorkbook.Path & "\"
        FichierRéception = ActiveWorkbook.Name
        OngletRéception1 = "2.2 Mensu Prod Org"
        OngletRéception2 = "2.5 Mensu Force de Travail"
     
        Ligne = 10
        Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4)            ' Colonne  D
        RepertoirePal = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(8, 3)  ' Colonne C
        RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
        Fichier = Dir(RepertoireSource & Chaine & ".xls")
     
        ' On vide la colonne A qui contient la date d'intégration des données de chaque fichier
        Workbooks(FichierRéception).Worksheets("Paramètres").Unprotect ("1611")
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10:A100").Select
        Selection.ClearContents
     
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10").Select
     
        Do Until Fichier = ""
     
            ' Je n'arrive pas à interdir lors de l'ouverture du fichier appelé
            ' l'exécution du code figurant dans ThisWorkbook : Workbook_Open
            ' Je suis donc contraint de supprimer le code contenu dans chaque fichier appelé dans Workbook_Open
            ' à moins que je ne trouve une solution sur un forum Excel d'Internet
     
            Set XlApp = CreateObject("Excel.Application")
            XlApp.EnableEvents = False   ' devrait normalement empêcher le lancement de la macro du fichier appelé
            With XlApp.Workbooks.Open(RepertoireSource & Fichier)
     
              ' Etape 1 : Onglet OngletRéception1
              For LigneSource = 6 To 121
                For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
                   ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
     
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
                Next Colonnesource
              Next LigneSource
     
              LigneSource = 128 ' pour Productivité en EUTC (intégration TGA)
              For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
     
                   ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
     
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
              Next Colonnesource
     
              ' Etape 2 : Onglet OngletRéception2
              Dim LigneOnglet2
              LigneOnglet2 = Array(7, 12, 21, 29, 39, 43, 49, 55, 67, 78, 81, 85, 90, 93, 97)
              For Indice = 0 To 14
                LigneSource = LigneOnglet2(Indice)
                For Colonnesource = 3 To 14
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 2, Lig " & LigneSource & " Col " & Colonnesource
                    ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
     
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
     
                Next Colonnesource
              Next Indice
     
              Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Intégré le " & Now()
              .Close False  ' ferme sans enregistrer les modifications éventuelles apportées au fichier appelé
            End With
     
            XlApp.EnableEvents = True
     
    FichierSuivant:
            Ligne = Ligne + 1
            Fichier = ""
            Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4) ' Colonne  D
            RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
     
            Fichier = Dir(RepertoireSource & Chaine & ".xls")
        Loop
        Workbooks(FichierRéception).Worksheets("Paramètres").Protect ("1611")
        MsgBox ("Mise à jour terminée")
    End Sub
    2) Le code 2 avec Set Wk ( (Temps de traitement 5 minutes 12 pour 4 fichiers lus) : le code des fichiers lus n' est pas exécuté (ce que je souhaite)
    Cependant le traitement est 5 fois plus long que par CreateObject


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    Private Sub CommandButton1_Click()
    ' LionelMardi 16 septembre 2008
    Dim Wb As Workbook
    ' Vérification que le chemin principal se termine bien par un anti-slash \
    FinRep = Right(Sheets("Paramètres").Range("C8"), 1)
    If FinRep <> "\" Then
        Rep = MsgBox("Attention, le chemin principal doit se terminer par le caractère \", vbCritical, "Merci de corriger SVP...")
        Sheets("Paramètres").Range("C8").Select
        Exit Sub
    End If
     
     
    Rep = InputBox("Veuillez saisir le mot de passe SVP...", "Confirmation Traitement")
    If Rep <> "1611" Then
        Rep = MsgBox("Désolé, mot de passe incorrect", vbOKOnly, "Erreur")
        Exit Sub
    End If
     
        Répertoire = ActiveWorkbook.Path & "\"
        FichierRéception = ActiveWorkbook.Name
        OngletRéception1 = "2.2 Mensu Prod Org"
        OngletRéception2 = "2.5 Mensu Force de Travail"
     
        Ligne = 10
        Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4)            ' Colonne  D
        RepertoirePal = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(8, 3)  ' Colonne C
        RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
        Fichier = Dir(RepertoireSource & Chaine & ".xls")
     
        ' On vide la colonne A qui contient la date d'intégration des données de chaque fichier
        Workbooks(FichierRéception).Worksheets("Paramètres").Unprotect ("1611")
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10:A100").Select
        Selection.ClearContents
     
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10").Select
     
     
        Do Until Fichier = ""
     
            Application.EnableEvents = False  ' devrait normalement empêcher le lancement de la macro du fichier appelé
            Set Wb = Workbooks.Open(RepertoireSource & Fichier)
            With Wb
              Workbooks(FichierRéception).Worksheets("Paramètres").Activate
              ' Etape 1 : Onglet OngletRéception1
              For LigneSource = 6 To 121
                For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
                   ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
     
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
                Next Colonnesource
              Next LigneSource
     
              LigneSource = 128 ' pour Productivité en EUTC (intégration TGA)
              For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
     
                   ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
     
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
              Next Colonnesource
     
              ' Etape 2 : Onglet OngletRéception2
              Dim LigneOnglet2
              LigneOnglet2 = Array(7, 12, 21, 29, 39, 43, 49, 55, 67, 78, 81, 85, 90, 93, 97)
              For Indice = 0 To 14
                LigneSource = LigneOnglet2(Indice)
                For Colonnesource = 3 To 14
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 2, Lig " & LigneSource & " Col " & Colonnesource
                    ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
     
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
     
                Next Colonnesource
              Next Indice
     
              Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Intégré le " & Now()
              .Close False  ' ferme sans enregistrer les modifications éventuelles apportées au fichier appelé
     
            End With
     
            Application.EnableEvents = True
     
    FichierSuivant:
            Ligne = Ligne + 1
            Fichier = ""
            Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4) ' Colonne  D
            RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
     
            Fichier = Dir(RepertoireSource & Chaine & ".xls")
        Loop
        Workbooks(FichierRéception).Worksheets("Paramètres").Protect ("1611")
        MsgBox ("Mise à jour terminée")
    End Sub
    3) et le code contenu dans chaque Fichier appelé dans ThisWorbook et que je ne veux pas voir s'exécuter lors de l'appel depuis le fichier de synthèse (hors, à mon gd désespoir, le userform se lance dans le 1er code à l'ouverture et, lors de la fermeture du fichier, on tombe en erreur car je n'ai pas Hyperion installé chez moi contrairement au bureau (ESSEXCLN.xll Erreur 53)

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    'Option Explicit     'Option obligeant à déclarer les variables
    Option Base 0       'Option indiquant que l'indice des tableaux commence à 0
     
     
    '
    'S'execute à l'ouverture du fichier.
    'Activation de l'Add_in Essbase, lecture du fichier ....
    '========================================================================================
     
     
    Private Sub Workbook_Open()
      Dim msg, Style, Title, Help, Ctxt, response, MyString
     
      On Error GoTo gesterreur
     
      'Stop
     
     
      ' TODO: afin de désactiver les barres de commandes Visual Basic et Macro
      'Dim CmdB As CommandBar
     'desactivation des touches de raccourcis ...
        'application.OnKey "%{F8}", ""
        'application.OnKey "%{F11}", ""
      'fermeture de l'editeur VBA ...(au cas ou ils soit ouvert lors du lancement du classeur programmé ...
        'application.VBE.MainWindow.Visible = False
      'Desactivation de la barre d'outils VBA et du raccourci dans le menu ....
      'application.CommandBars("Visual Basic").Enabled = False
      'application.CommandBars("Macro").Enabled = False
     
      'application.CommandBars("Visual Basic").Enabled = True
      'application.CommandBars("Macro").Enabled = True
      'FIN  TODO: afin de désactiver les barres de commandes Visual Basic et Macro
     
      'Call MOE_m_traitement.InitTraitement
     
      Call MOE_m_traitement.LanceTraitement
     
      Call MOE_m_traitement.FinirTraitement
     
      'Call CreerBoutonRafraichir
     
      'If GBL_ACTIVATION_POPUP = "non" Then
      'Else: USF_Param.Show
      'End If
      Exit Sub
    gesterreur:
       MsgBox ("Workbook_Open " & Err.Number)
       Call MOE_m_traitement.TerminateTraitement
    End Sub
     
    's'exécute à la fermeture du fichier
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call MOE_m_traitement.desActiveEssbase
     
    End Sub
    En résumé :
    1) comment optimiser le temps d'exécution du 2ème code (5 fois plus lent que le 1er code mais n'exécute pas, comme souahité, les macros des fichiers appelés) --> Peut-être en forçant l'exécution dans une 2ème instance d'Excel ?
    2) comment empêcher l'exécution des macros à l'ouverture et à la fermeture des fichiers appelés pour le 1er code (qui est 5 fois plus rapide que le 1er)

    Avec le code 3, ouvrant une 2ème instance excel, j'obtiens une performance identique au 1er code mais les macro se lancent encore malgré le xlApp.EnableEvents = False
    Mais pourquoi donc ????

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    Private Sub CommandButton1_Click()
    ' Lionel  Mardi 16 septembre 2008
    Dim xlApp As Excel.Application
    Dim Wb As Excel.Workbook
    
    
    ' Vérification que le chemin principal se termine bien par un anti-slash \
    FinRep = Right(Sheets("Paramètres").Range("C8"), 1)
    If FinRep <> "\" Then
        Rep = MsgBox("Attention, le chemin principal doit se terminer par le caractère \", vbCritical, "Merci de corriger SVP...")
        Sheets("Paramètres").Range("C8").Select
        Exit Sub
    End If
    
    
    Rep = InputBox("Veuillez saisir le mot de passe SVP...", "Confirmation Traitement")
    If Rep <> "1611" Then
        Rep = MsgBox("Désolé, mot de passe incorrect", vbOKOnly, "Erreur")
        Exit Sub
    End If
    
        Répertoire = ActiveWorkbook.Path & "\"
        FichierRéception = ActiveWorkbook.Name
        OngletRéception1 = "2.2 Mensu Prod Org"
        OngletRéception2 = "2.5 Mensu Force de Travail"
        
        Ligne = 10
        Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4)            ' Colonne  D
        RepertoirePal = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(8, 3)  ' Colonne C
        RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
        Fichier = Dir(RepertoireSource & Chaine & ".xls")
        
        ' On vide la colonne A qui contient la date d'intégration des données de chaque fichier
        Workbooks(FichierRéception).Worksheets("Paramètres").Unprotect ("1611")
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10:A100").Select
        Selection.ClearContents
        
        Workbooks(FichierRéception).Worksheets("Paramètres").Range("A10").Select
        
        
        Do Until Fichier = ""
          ' Ajout 17/09/2008 à 22h10 pour ouvrir une 2ème instance d'Excel
            Set xlApp = New Excel.Application
    
            xlApp.EnableEvents = False  ' devrait normalement empêcher le lancement de la macro du fichier appelé
    
            Set Wb = xlApp.Workbooks.Open(RepertoireSource & Fichier)
            With Wb
              Workbooks(FichierRéception).Worksheets("Paramètres").Activate
              ' Etape 1 : Onglet OngletRéception1
              For LigneSource = 6 To 121
                For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
                   ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
                    
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
                Next Colonnesource
              Next LigneSource
              
              LigneSource = 128 ' pour Productivité en EUTC (intégration TGA)
              For Colonnesource = 4 To 27
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 1, Lig " & LigneSource & " Col " & Colonnesource
                    
                   ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
                    
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception1).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
              Next Colonnesource
              
              ' Etape 2 : Onglet OngletRéception2
              Dim LigneOnglet2
              LigneOnglet2 = Array(7, 12, 21, 29, 39, 43, 49, 55, 67, 78, 81, 85, 90, 93, 97)
              For Indice = 0 To 14
                LigneSource = LigneOnglet2(Indice)
                For Colonnesource = 3 To 14
                    Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Onglet 2, Lig " & LigneSource & " Col " & Colonnesource
                    ' au cas où des cellules ne contiendraient pas du numérique
                    If IsNumeric(.Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)) Then
                        MaValeur = .Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource)
                    Else
                        MaValeur = 0
                    End If
    
                    If Ligne = 10 Then
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = MaValeur
                    Else
                        Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) = Workbooks(FichierRéception).Worksheets(OngletRéception2).Cells(LigneSource, Colonnesource) + MaValeur
                    End If
                
                Next Colonnesource
              Next Indice
              
              Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 1) = "Intégré le " & Now()
              .Close False  ' ferme sans enregistrer les modifications éventuelles apportées au fichier appelé
              
            End With
            
             xlApp.EnableEvents = True   ' réactivation pour lancement macro
             xlApp.Quit
             Set xlApp = Nothing
             Set Wb = Nothing
    
    FichierSuivant:
            Ligne = Ligne + 1
            Fichier = ""
            Chaine = Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 4) ' Colonne  D
            RepertoireSource = RepertoirePal & Workbooks(FichierRéception).Worksheets("Paramètres").Cells(Ligne, 3) & "\" ' Colonne C
    
            Fichier = Dir(RepertoireSource & Chaine & ".xls")
        Loop
        
        Workbooks(FichierRéception).Worksheets("Paramètres").Protect ("1611")
        MsgBox ("Mise à jour terminée")
    End Sub

  13. #13
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonsoir,

    Peut-être en remplaçant les WorkBook.Open par des procèdures Sub Auto_Open dans un module.
    On arrive à la même chose, mais avec la particularité que l'Auto_Open ne réagit pas si l'ouverture du classeur se fait par vba (je l'utilise pour des procèdures de mise à jour).
    Son utilisation était je crois déconseillée depuis un moment par Microsoft car elle était appellée à disparaître, mais en 2003 ça marche encore et en 2007 aussi (fichiers 2000-2003 ouverts via 2007)... alors que FileSearch plante, comme on le sait...

    cordialement,

    Didier

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci Didier mais les fichiers liés ne sont pas de moi
    Je ne peux donc remplacer les Workbook_open par des Auto_open n'en étant pas maître
    mais quand bien même, 3 choses m'auraient retenues de le faire :
    1) le pourquoi le code "xxxx.EnableEvents = False"
    ne marche pas lorsqu'il y a 2 instances Excel ? J'aime comprendre
    2) le nombre de fichiers liés (à peu près 80) qui seraient à modifier
    3) l'utilisation déconseillée d'Auto_Open (car un jour viendra !)

    Une autre idée sur le Forum ?

    ou alors comment en ayant une seule instance améliorer le code 2 qui lui fonctionne mais 5 fois plus lentement que les 2 autres (qui eux ont le code xxxx.EnableEvents = False inefficace...) ?

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu utilises
    With CreateObject("Excel.Application").Workbooks.Open(RepertoireSource & Fichier)
    On Error Resume Next
    .Application.EnableEvents = False
    As-tu essayé d'inverser ta ligne de commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            With CreateObject("Excel.Application")
                .Application.EnableEvents = False
                .Workbooks.Open(RepertoireSource & Fichier)
    A tout hasard et en désespoir de cause (pas testé et je ne sais pas ce que ça donne )
    Sinon, il te reste la méthode consistant à travailler sur un fichier "réellement" fermé.
    Bonne nuit

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Tu utilises
    As-tu essayé d'inverser ta ligne de commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            With CreateObject("Excel.Application")
                .Application.EnableEvents = False
                .Workbooks.Open(RepertoireSource & Fichier)
    A tout hasard et en désespoir de cause (pas testé et je ne sais pas ce que ça donne )
    Sinon, il te reste la méthode consistant à travailler sur un fichier "réellement" fermé.
    Bonne nuit
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Set XlApp = CreateObject("Excel.Application")
            XlApp.EnableEvents = False   ' devrait normalement empêcher le lancement de la macro du fichier appelé
            With XlApp.Workbooks.Open(RepertoireSource & Fichier)
    ce qui est dans le même esprit que ta proposition

    Mais à tester

    Je vais me coucher
    La nuit porte conseil
    Si vous avez la révélation, n'hésitez pas à m'en faire part demain
    bonne nuit
    Lionel

  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim xlApp As Excel.Application
     
    Sub Essai1()
        Set xlApp = CreateObject("Excel.Application")
        xlApp.EnableEvents = False
        xlApp.Workbooks.Open "C:\Documents and Settings\......\Fichier.xls"
        xlApp.EnableEvents = True
    End Sub
     
    Sub Essai2()
        Application.EnableEvents = False
        Workbooks.Open "C:\Documents and Settings\......\Fichier.xls"
        Application.EnableEvents = True
    End Sub
    Personellement j'obtiens le meme comportement avec ces deux procedures, à savoir que le code de la procedure WorkBook_Open du fichier ouvert ne s'execute pas.

    Si toutefois le probleme persiste pour une raison que nous ignorons tous tu peux essayer une solution plus radicale consistant à ouvrir tes fichiers en désactivant toutes les macros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Essai3()
        Dim Sec As Long
        Sec = Application.AutomationSecurity
        Application.AutomationSecurity = msoAutomationSecurityForceDisable
        Workbooks.Open "C:\Documents and Settings\......\Fichier.xls"
        Application.AutomationSecurity = Sec
    End Sub
    Cordialement,

    Tirex28/

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Tirex28 bonjour
    Je pense que le pb vient de la 2ème instance Excel (qui permet un traitement plus rapide pour lire et écrire en sommant les cellules)

    Tes tests probants s'effectuent ils avec 2 instances ou pas pour chacun des 2 cas ?

    A+
    Lionel

  19. #19
    Membre éprouvé Avatar de Ragmaxone
    Homme Profil pro
    Responsable systèmes de distribution
    Inscrit en
    Août 2007
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Pologne

    Informations professionnelles :
    Activité : Responsable systèmes de distribution

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    Points : 1 001
    Points
    1 001
    Par défaut
    Bonjour à tous, j'ai le même genre de problème , mais moi c'est les contrôles ActiveX que je veux désactiver...

    j'ai tenté de désactiver les macros mais ça me plante tout, dans le sens où une fois que j'ai désactivé les macros, j'ouvre le classeur cible, et là la procédure s'arrête, je pense que c'est à cause du EnableEvents.False.

    Aussi :

    Citation Envoyé par ouskel'n'or Voir le message
    Tu utilises
    As-tu essayé d'inverser ta ligne de commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            With CreateObject("Excel.Application")
                .Application.EnableEvents = False
                .Workbooks.Open(RepertoireSource & Fichier)
    A tout hasard et en désespoir de cause (pas testé et je ne sais pas ce que ça donne )
    Sinon, il te reste la méthode consistant à travailler sur un fichier "réellement" fermé.
    Bonne nuit
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set XlApp = CreateObject("Excel.Application")
    XlApp.EnableEvents = False ' devrait normalement empêcher le lancement de la macro du fichier appelé
    With XlApp.Workbooks.Open(RepertoireSource & Fichier)
    il faut faire attention, ce que propose Ouskel'n'or est différent de ce que tu as écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            With CreateObject("Excel.Application")
                .Application.EnableEvents = False
                .Workbooks.Open(RepertoireSource & Fichier)
    ce n'est pas pareil pour la ligne de EnableEvents, Ouskel a écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Application.EnableEvents...
    et toi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents...
    Perso ça fait presque une semaine que je me alors je vais commencer à chercher du côté de ADO...

    Bon courage.

  20. #20
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    J'ai survolé de très haut ce sujet, alors je m'excuse si je réponds à côté, mais à sa lecture j'ai repensé à un ancien topic que j'avais lancé ici même :

    http://www.developpez.net/forums/d58...-worbook_open/

    Si vous avez des problèmes avec les belles méthodes toutes propres, la méthode Mag Gyver proposé dans mon premier post peut être une bonne idée par défaut. A vous de voir, ou de me fesser si j'ai fait un hors sujet

    Cordialement,

    Currahee

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/06/2015, 15h37
  2. appeler la fonction d'un fichier js depuis un autre fichier
    Par kohsaka dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/09/2007, 18h49
  3. Activer Macro automatiquement sur un fichier
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/08/2007, 06h28
  4. Réponses: 13
    Dernier message: 18/04/2007, 09h49
  5. [VBA][Office 2003] Fichier ouvert depuis IE ou Word?
    Par nbaudraz dans le forum VBA Word
    Réponses: 2
    Dernier message: 12/10/2005, 14h27

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