マクロを使用して既存のExcelファイルを検索したいのですが、それらのファイルをコードで開いたときに表示したくないのです。いわば「バックグラウンド」でそれらを開く方法はありますか?
現在のExcelインスタンスで非表示で開くことができるかどうかわからない
ただし、Excelの新しいインスタンスを開き、非表示にしてからブックを開くことができます。
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
他の人が投稿したように、開いているワークブックを終了した後は必ずクリーンアップしてください
それがあなたのニーズに合っていれば、私は単に使用します
Application.ScreenUpdating = False
excelの2番目のインスタンスを使用してコードを遅くする代わりに、コードを高速化するという追加の利点があります。
Excelの既存のインスタンスで非表示としてブックを開くには、次を使用します。
Application.ScreenUpdating = False
Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
ActiveWindow.Visible = False
ThisWorkbook.Activate
Application.ScreenUpdating = True
答えはありますが、この質問を見つけた人のために、ExcelスプレッドシートをJETデータストアとして開くこともできます。私が使用したプロジェクトから接続文字列を借りると、次のようになります。
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"
「RegistrationList」はワークブックのタブの名前であることに注意してください。 Webには、この方法でシートにアクセスできることとできないことの詳細が記載されたチュートリアルがいくつかあります。
追加したいと思いました。 :)
アクティブウィンドウの操作を伴わない、はるかに単純なアプローチ:
Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False
ワークブックのWindowsインデックスは、常に1
であることがわかります。誰もがこれを真実ではない競合状態を知っているなら、私に知らせてください。
IDevlopとAshokの両方の答えの問題は、根本的な問題はExcelの設計上の欠陥(明らかに)であり、OpenメソッドがApplication.ScreenUpdating設定のFalseを尊重しないことです。したがって、この設定をFalseに設定しても、この問題には何のメリットもありません。
Excelの2番目のインスタンスを起動するオーバーヘッドのためにPatrick McDonaldのソリューションの負担が大きすぎる場合、私が見つけた最善のソリューションは、元のウィンドウをできるだけ早く再アクティブ化して、開いているブックが表示される時間を最小限に抑えることです:
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...
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
完了したら、必ずクリーンアップする必要があります。
非表示としてワークブックを開き、ユーザーが閉じるときにプロンプトが表示されないように、「保存」として設定します。
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
これは、Ashokが投稿した回答の多少の派生物です。
ただし、この方法で行うと、変更をExcelファイルに保存して読み戻しを求めるプロンプトが表示されなくなります。これは、読み取り元のExcelファイルが検証用のデータソースとして意図されている場合に便利です。たとえば、ワークブックに製品名と価格データが含まれている場合、非表示にでき、その価格リストから検証する製品のドロップダウン付きの請求書を表すExcelファイルを表示できます。
その後、ネットワーク上の共有場所に価格表を保存し、読み取り専用にすることができます。
Excelで、ブックを非表示にし、非表示として保存します。アプリがそれらをロードするとき、それらは表示されません。
編集:読み直すと、これらのワークブックはアプリケーションの一部ではないことが明らかになりました。このようなソリューションは、ユーザーブックには不適切です。