web-dev-qa-db-ja.com

表示せずにVBAで読み取るためにExcelファイルを開く

マクロを使用して既存のExcelファイルを検索したいのですが、それらのファイルをコードで開いたときに表示したくないのです。いわば「バックグラウンド」でそれらを開く方法はありますか?

55
notnot

現在の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

他の人が投稿したように、開いているワークブックを終了した後は必ずクリーンアップしてください

72

それがあなたのニーズに合っていれば、私は単に使用します

Application.ScreenUpdating = False

excelの2番目のインスタンスを使用してコードを遅くする代わりに、コードを高速化するという追加の利点があります。

30
Patrick Honorez

Excelの既存のインスタンスで非表示としてブックを開くには、次を使用します。

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

答えはありますが、この質問を見つけた人のために、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には、この方法でシートにアクセスできることとできないことの詳細が記載されたチュートリアルがいくつかあります。

追加したいと思いました。 :)

11
AnonJr

アクティブウィンドウの操作を伴わない、はるかに単純なアプローチ:

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

ワークブックのWindowsインデックスは、常に1であることがわかります。誰もがこれを真実ではない競合状態を知っているなら、私に知らせてください。

7
Anthony Lusardi

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...
3
pstraton

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

完了したら、必ずクリーンアップする必要があります。

1
guillermooo

非表示としてワークブックを開き、ユーザーが閉じるときにプロンプ​​トが表示されないように、「保存」として設定します。

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ファイルを表示できます。

その後、ネットワーク上の共有場所に価格表を保存し、読み取り専用にすることができます。

1
Pen123

Excelで、ブックを非表示にし、非表示として保存します。アプリがそれらをロードするとき、それらは表示されません。

編集:読み直すと、これらのワークブックはアプリケーションの一部ではないことが明らかになりました。このようなソリューションは、ユーザーブックには不適切です。

0
JohnW