2009-08-13 12 views
1

J'essaie d'ouvrir une série de feuilles de calcul Excel en utilisant une instance d'Excel créée à l'intérieur d'un module dans une base de données Access. Je peux obtenir les fichiers pour ouvrir correctement; Toutefois, l'appel réel pour démarrer Excel prend un certain temps, et pour ouvrir les fichiers prend encore plus de temps. L'emplacement des fichiers n'a pas d'importance (même heure d'ouverture sur un disque dur local en tant que lecteur réseau).VBA File Open est lente

Pour tenter de comprendre ce qui prenait si longtemps, j'ai ajouté une minuterie au module de journalisation. L'ouverture des fichiers prend environ 2m30, pendant laquelle l'application hôte (Access) ne répond absolument pas aux entrées de l'utilisateur); le reste du script s'exécute en moins de 10 secondes.

J'utilise l'appel standard Excel.Workbooks.Open comme suit

Set OpenSpreadsheet = Excel.Workbooks.Open(Name, 2, False) 

En utilisant des méthodes Debug.Print autour de cette ligne dit qu'il peut prendre jusqu'à 2 1/2 minutes pour cette une ligne à exécuter.

Y at-il quelque chose que je peux faire pour ouvrir les fichiers Excel plus rapidement?

EDIT: Lors de l'ouverture, UpdateLinks est False et ReadOnly est True; toutes les autres options sont laissées à leurs valeurs par défaut.

+1

Si vous ajoutez du code pour montrer comment vous ouvrez vos documents, + quelles références vous définissez, il sera plus facile de répondre. Mais à coup sûr, tout ce qui dépasse 10 sec. est trop long. –

+0

D'accord, + 1 ... Besoin de voir les méthodes. – Smandoli

+0

J'ai ajouté l'appel que je fais et j'ai noté le temps nécessaire à l'exécution d'une seule ligne. –

Répondre

3

Première idée: Pouvez-vous utiliser un pilote de jet avec une connexion ODBC à Excel, au lieu de l'ouvrir dans un objet Excel? Ça pourrait être beaucoup plus rapide.

Deuxième idée: Assurez-vous de créer et d'instancier l'objet d'application Excel une seule fois au début de la routine, puis utilisez Excel.Workbooks.Open() et Excel.ActiveWorkbook.Close() pour chaque feuille de calcul. De cette façon, vous ne «relancez» pas l'application MS Excel à chaque fois.

+0

Cela a fonctionné - j'ai couru le module tout en gardant un œil sur le Gestionnaire des tâches et trois instances d'Excel ont été créées, même si je n'en avais créé qu'une dans le code. –

0

Pour extraire la deuxième des recommandations bien conseillées de @ BradC, si vous devez utiliser Excel dans plusieurs procédures, créez une fonction globale auto-initialisante. J'utilise toujours une liaison tardive pour l'automatisation des applications Office.

Public Function Excel(Optional bolCleanup As Boolean = False) As Object 
    Static objExcel As Object 

    If bolCleanup Then 
     If Not objExcel Is Nothing Then 
      Set objExcel = Nothing 
      Exit Function 
     End If 
    End If 
    If objExcel Is Nothing Then 
     Set objExcel = CreateObject("Excel.Application") 
    End If 
    Set Excel = objExcel 
    End Function 

Ensuite, vous pouvez l'utiliser dans le code sans avoir besoin de l'initialiser, et l'instance unique reste accessible à tout code qui a besoin d'utiliser Excel.

Et lorsque vous fermez votre application, vous appelez Excel (True) pour le nettoyer. Je fais ça avec Outlook et Word tout le temps. Cependant, certaines applications COM fonctionnent mal, comme PDF Creator, qui ne prend pas bien soin de ce type de traitement (vous vous retrouvez dans une boucle sans fin avec l'arrêt et la réinitialisation de lui-même si vous essayez de détruisez l'instance de cette façon).

Questions connexes