89 votes

Ouvrir un fichier Excel pour lecture avec VBA sans affichage

Je veux rechercher des fichiers Excel existants avec une macro, mais je ne veux pas afficher ces fichiers lorsqu'ils sont ouverts par le code. Y a-t-il un moyen de les ouvrir "en arrière-plan", pour ainsi dire?

2 votes

La réponse de @MunimRashid est la meilleure. Aurait dû être sélectionnée comme réponse.

89voto

Patrick McDonald Points 20645

Pas sûr que vous puissiez les ouvrir invisiblement dans l'instance Excel actuelle

Vous pouvez ouvrir une nouvelle instance d'Excel, la masquer et ensuite ouvrir les classeurs

Dim app as New Excel.Application
app.Visible = False 'Visible est False par défaut, donc ce n'est pas nécessaire
Dim book As Excel.Workbook
Set book = app.Workbooks.Add(fileName)
'
' Faites ce que vous avez à faire
'
book.Close SaveChanges:=False
app.Quit
Set app = Nothing

Comme d'autres l'ont mentionné, assurez-vous de faire le ménage après avoir terminé avec les classeurs ouverts

0 votes

Cela arrête le clignotement dans la barre des tâches mais provoque le clignotement dans le curseur. Même Application.Cursor ne fonctionne pas (dans Office 2010 x64).

10 votes

Je recommande vivement que vous verrouilliez la session de l'application avant d'ouvrir le classeur cible : ` App.AutomationSecurity = msoAutomationSecurityForceDisable ` ` App.EnableEvents = False ` ` App.Calculation = xlCalculationManual ` - Et vous pourriez également envisager d'énumérer la collection AddIns et de les désactiver, également les démarrages lents des modules complémentaires retarderont le lancement de la session de l'application.

0 votes

@Nile Ils semblent tous être de bonnes idées

39voto

iDevlop Points 9770

Si cela correspond à vos besoins, j'utiliserais simplement

Application.ScreenUpdating = False

avec l'avantage supplémentaire d'accélérer votre code, au lieu de le ralentir en utilisant une deuxième instance d'Excel.

2 votes

Ce code ne fonctionnera pas, Excel a un problème qui l'empêche d'effectuer réellement ce que vous devez faire. Il ne fera que vous empêcher de voir le fonctionnement de la macro, l'ouverture réelle du deuxième livre et du classeur lui-même seront toujours affichées.

1 votes

Fonctionne bien pour moi?

24voto

Ashok Points 599

Pour ouvrir un classeur en tant que caché dans l'instance existante d'Excel, utilisez ce qui suit :

    Application.ScreenUpdating = False
    Workbooks.Open Filename:=CheminDuFichier, UpdateLinks:=True, ReadOnly:=True
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True

0 votes

Merci, ça a fonctionné lorsque j'ai utilisé comme ceci: CeClasseur.Activer: FenêtreActive.Visible = False: Application.MiseAJourEcran = False TOUT AUTRE CODE ICI Application.MiseAJourEcran = True: CeClasseur.Activer: FenêtreActive.Visible = True Ni la barre des tâches ni le curseur ne clignotent.

0 votes

@sevenkul Où se trouve ton Workbooks.Open?

13voto

AnonJr Points 2177

Même si vous avez votre réponse, pour ceux qui trouvent cette question, il est également possible d'ouvrir une feuille de calcul Excel en tant que magasin de données JET. Empruntant la chaîne de connexion d'un projet sur lequel je l'ai utilisé, cela ressemblera un peu à ceci:

strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & objFile.Path & ";Extended Properties=""Excel 8.0;HDR=Yes"""
strSQL = "SELECT * FROM [RegistrationList$] ORDER BY DateToRegister DESC"

Notez que "RegistrationList" est le nom de l'onglet dans le classeur. Il existe quelques tutoriels circulant sur le web sur les détails de ce que vous pouvez faire ou ne pas faire en accédant à une feuille de cette façon.

Juste une pensée à ajouter. :)

0 votes

@ShawnZhang La plupart des fichiers Excel que nous avons lus ont été exportés au format 2000/2003 car c'est ce que le programme de l'expéditeur émet. Il existe une variation de la chaîne de connexion que nous avons testée pour les fichiers 2007/2010 qui fonctionne également.

0 votes

@ShawnZhang Plus important encore, il semble que le nom de l'onglet (entre crochets, avec le $ à la fin) soit soumis à certaines restrictions amusantes que je n'arrive pas à localiser pour le moment. Idem pour les en-têtes de colonne.

2 votes

Les pilotes Jet OLEDB ont une fuite de mémoire lors de la lecture d'Excel (toutes les versions, et les pilotes ODBC prédécesseurs) : vous allez recevoir des messages d'erreur concernant la mémoire disponible si vous le faites plus d'une fois dans une session utilisateur. Ignorez ces erreurs à vos risques et périls - votre application finira par se figer ou planter. Microsoft ne reconnaît pas que ce problème existe, et il n'existe aucune documentation à ce sujet.

1voto

guillermooo Points 2711

Ouvrez-les à partir d'une nouvelle instance d'Excel.

Sub Test()

    Dim xl As Excel.Application
    Set xl = CreateObject("Excel.Application")

    Dim w As Workbook
    Set w = xl.Workbooks.Add()

    MsgBox "Pas encore visible..."
    xl.Visible = True

    w.Close False
    Set xl = Nothing

End Sub

Vous devez penser à nettoyer une fois que vous avez fini.

2 votes

Juste pour souligner, vous devez nettoyer après avoir terminé avec une instance invisible. Si vous ne le faites pas, l'utilisateur pourrait ne pas être en mesure d'ouvrir les fichiers Excel en double-cliquant ou en les lançant à partir d'autres applications, à moins de se déconnecter ou de savoir comment tuer les processus (car les fichiers sont ouverts dans la fenêtre invisible).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X