Ouvrir le fichier Excel pour la lecture avec VBA sans affichage

Je veux rechercher dans les 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?

47
demandé sur Community 2009-02-24 02:08:38

9 réponses

Vous ne savez pas si vous pouvez les ouvrir de manière invisible dans l'instance excel actuelle

Vous pouvez ouvrir une nouvelle instance d'excel, la masquer, puis ouvrir les classeurs

Dim app as New Excel.Application
app.Visible = False 'Visible is False by default, so this isn't necessary
Dim book As Excel.Workbook
Set book = app.Workbooks.Add(fileName)
'
' Do what you have to do
'
book.Close SaveChanges:=False
app.Quit
Set app = Nothing

Comme d'autres l'ont posté, assurez-vous de nettoyer une fois que vous avez terminé avec les classeurs ouverts

66
répondu Patrick McDonald 2009-02-25 13:50:42

Si cela convient à 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.

26
répondu Patrick Honorez 2009-08-13 15:46:04

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. Emprunter la chaîne de connexion à partir 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 y a quelques tutoriels flottant sur le web avec les détails de ce que vous pouvez et ne pouvez pas faire accéder à une feuille de cette façon.

Je pensais juste ajouter. :)

11
répondu AnonJr 2009-08-13 15:58:28

Pour ouvrir un classeur comme masqué dans L'instance existante D'Excel, utilisez ce qui suit:

    Application.ScreenUpdating = False
    Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True
10
répondu Ashok 2012-01-16 11:54:22

Une approche beaucoup plus simple qui n'implique pas de manipuler les fenêtres actives:

Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False

D'après ce que je peux dire, L'index Windows sur le classeur devrait toujours être 1. Si quelqu'un connaît des conditions de course qui rendraient cela faux, faites-le moi savoir.

4
répondu pyskell 2016-07-13 18:40:04

Le problème avec les réponses d'iDevlop et D'Ashok est que le problème fondamental est un défaut de conception Excel (apparemment) dans lequel la méthode Open ne respecte pas l'Application.Réglage ScreenUpdating De False. Par conséquent, le définir sur False n'est d'aucun avantage pour ce problème.

Si la solution de Patrick McDonald est trop lourde en raison de la surcharge de démarrage d'une deuxième instance D'Excel, alors la meilleure solution que j'ai trouvée est de minimiser le temps que le classeur ouvert est visible en réactivant la fenêtre d'origine le plus rapidement possible:

Dim TempWkBk As Workbook
Dim CurrentWin As Window

Set CurrentWin = ActiveWindow
Set TempWkBk = Workbooks.Open(SomeFilePath)
CurrentWin.Activate      'Allows only a VERY brief flash of the opened workbook
TempWkBk.Windows(1).Visible = False 'Only necessary if you also need to prevent
                                    'the user from manually accessing the opened
                                    'workbook before it is closed.

'Operate on the new workbook, which is not visible to the user, then close it...
3
répondu pstraton 2014-07-22 19:07:53

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 "Not visible yet..."
    xl.Visible = True

    w.Close False
    Set xl = Nothing

End Sub

Vous devez vous rappeler de nettoyer une fois que vous avez terminé.

1
répondu guillermooo 2009-02-26 10:12:05

Ouvrez le classeur comme masqué, puis définissez - le comme "enregistré" afin que les utilisateurs ne soient pas invités à la fermeture.

Dim w As Workbooks

Private Sub Workbook_Open()
    Application.ScreenUpdating = False
    Set w = Workbooks
    w.Open Filename:="\\server\PriceList.xlsx", UpdateLinks:=False, ReadOnly:=True 'this is the data file were going to be opening
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    w.Item(2).Saved = True 'this will suppress the safe prompt for the data file only
End Sub

Ceci est quelque peu dérivé de la réponse Postée par Ashok.

En le faisant de cette façon, vous ne serez pas invité à enregistrer les modifications dans le fichier Excel de votre lecture. C'est génial si le fichier Excel de votre lecture est conçu comme une source de données pour la validation. Par exemple si le classeur contient des noms de produits et des données de prix il peut être masqué et vous pouvez afficher un fichier Excel qui représente une facture avec des listes déroulantes pour le produit qui valide à partir de cette liste de prix.

Vous pouvez ensuite stocker la liste de prix sur un emplacement partagé sur un réseau quelque part et la rendre en lecture seule.

1
répondu Pen123 2014-07-18 17:19:12

Dans excel, masquez les classeurs et enregistrez-les comme masqués. Lorsque votre application Les charge, ils ne seront pas affichés.

Edit: lors de la relecture, il est devenu clair que ces classeurs ne font pas partie de votre application. Une telle solution serait inappropriée pour les classeurs utilisateurs.

0
répondu JohnW 2009-02-24 00:47:30