【VBA備忘録】爆速!別ブックを開かずに値を取得する

2024年10月16日

別ブックを開くのって遅いな~画面もチラチラするし~

別ブックを開いてそこにある値を拾ってくるマクロプログラムをお使いの方、
「実はちょっと遅いんだよな~」と思うことありませんか?
別ブックが容量も軽いCSVならそんなに苦にはならないんですが、めちゃめちゃ容量使ってる
大きなブックだった場合開くのに時間がかかってヤキモキしちゃうんですよね。
他にもブックを開いて→閉じてをしてると画面がチラチラ出たり消えたりするのも鬱陶しい!!

Shironeco(嫁)
Shironeco(嫁)
高速化できて画面がチラチラしない方法ないかな~

別ブックを開かずに値を取得したい

そんなことできるの?って思われるかもしれませんが、一応できます。
仕組みとしては実行するExcelブックの他に新しく別のExcelのアプリケーションを立ち上げ、非表示でブックを開き値を取得→Excelアプリケーションを閉じることで実質「別ブックを開かずに(開いていないように見えている状態で)値を取得」するということです。
「一応」とつけたのはこのためで開いていないように見えますが実は開いていて、でも非表示なので処理も早いし非表示なのでチラチラしないのです。

下準備:参照設定をする

VBAを開いたら「ツール」→「参照設定」から「Microsoft Scripting Runtime」にチェックを入れOKしておいてください。

プログラムを入力する

VBAを開き挿入→標準モジュールで標準モジュールを追加してプログラムを書いていきます。
まず、別のアプリケーションとしてExcelを開きます。

別のExcelを定義

Dim exapp As New Excel.Application

新しく開いた空のExcelを非表示でワークブックとしてSetします。

別のExcelを非表示で開き読取り専用でSetする

Dim thiswb As Workbook
Dim thatwbpath As String

'値を取得するブックのパス
thatwbpath = “C:\Users\shironeco\Desktop\値を取得する別ブック.xlsm"

'警告メッセージを表示しない
exapp.DisplayAlerts = False '表示True/非表示False
'非表示で開く
exapp.Visible = False '表示True/非表示False デバックの時はTrueのがいいかも

Set thatwb = exapp.Workbooks.Open(thatwbpath, , True) '読取り専用で開く

’処理=============================

exapp.Quit '別ブックのExcelを終了させる

VBAで処理が途中で止まってしまったりすると、非表示で開いた別ブックがそのまま開かれたままの状態で
「見えないけど開かれている」というカスが残ってしまいます。
exapp.Quit が実行されない場合も同じことが起きますので、忘れずに入れておいてください。
その場合はCtr+Shift+Escでタスクマネージャーを開き、開いているExcelのアプリケーションをすべて
終了させると直りますよ!(ブックを保存してから消してくださいね)

Sub 別ブックを開かずに値を取得したい()

Dim exapp As New Excel.Application
Dim thiswb As Workbook, thatwb As Workbook
Dim thatwbpath  As String

Set thiswb = ThisWorkbook

'値を取得するブックのパス
thatwbpath = "C:\Users\shironeco\Desktop\値を取得する別ブック.xlsm"

'警告メッセージを表示しない
exapp.DisplayAlerts = False '表示True/非表示False
'非表示で開く
exapp.Visible = False '表示True/非表示False デバックの時はTrueのがいいかも

Set thatwb = exapp.Workbooks.Open(thatwbpath, , True) '読取り専用で開く
'------------------------------------------
'転記処理をする
a = thatwb.ActiveSheet.Cells(1, 1)
thiswb.ActiveSheet.Cells(1, 1) = a
'
'------------------------------------------
exapp.Quit '別ブックのExcelを終了させる
Set exapp = Nothing      'Nothingは一応しておく
End Sub

↑転記処理をするの部分に転記したいシートやセルを指定して値を取得、こちらのブックに貼り付けします。
ここでは別ブックのアクティブシートのA1(.Cells(1,1))をaに代入し、
もとのシートのA1(.Cells(1,1))にaの値を入れています。

コピペをする際は配列に入れるとまた速いので、↓を参考にどうぞ

別ブックを開かないと爆速処理ができる

別ブックを開かずに処理すると開いているときより格段早く処理ができるため、取り入れてブックのレベルアップをしてみてください!

テキストデータを収集するならもっと速くできます!
こちらもよかったら