仕事でExcelを使っている人は、Excelを複数開いて作業をしている方が多いのではないでしょうか。
私もその一人です。しかも、大量のデータをVBAを使って処理しているため、同一インスタンス内で複数のブック(プロセス)が動いていた場合、一つのブックでVBA処理を実行させていると、VBAの処理が終了するまでは他のExcelでの作業は行えなくなってしまいます。
しかし、これは同一インスタンス内で実行されている場合のExcelの仕様です。
では、どうすればこれを改善できるでしょうか?
それは、複数の作業を同時に実行しなければならない場合は、別インスタンスでExcelを複数立ち上げれば改善できます。では、その方法を解説していきたいと思います。
この記事はVBAを使ってExcelを別インスタンス(プロセス)で開く方法を解説しています
インスタンスとは? プロセスとは?
「別インスタンスで開く」とか「別プロセスで開く」って、どっちも聞くけど
「インスタンス」とはなに? 「プロセス」ってなに?
タスクマネージャーで「インスタンス」と「プロセス」を説明
「タスクマネージャー」のプロセスタブを見てみましょう。動いている「アプリ」が表示されていると思います。これがインスタンスです (アプリ≒インスタンス)
では、 「Microsoft Excel」の左側の「>」をクリックすると、実際に作業しているブックが表示されると思います。複数表示される場合は一つのインスタンス(アプリ)で複数のブックが動いているということです。このブックがプロセスです
・「インスタンス」とは、プログラム(Excel.Application)がメインメモリ上に起動されて、処理を実行できる状態にしたもの
・「プロセス」とは、インスタンスの中で稼働しているプログラム(ExcelのBook)ひとつひとつのことと、考えればよいのではと思いますが紛らわしいですよね
では、google先生で検索数を比較してみましょう
「別プロセス」が 約1,130,000件 >「別インスタンス」が約210,000件 でした
「インスタンス」も「プロセス」も同じニュアンスで使用しているんですよね(^^;
むしろ「プロセス」が主流ということみたいですね
VBAで別インスタンス(プロセス)のExcelを開く
Excelを別インスタンス(プロセス)で開く方法はいくつかありますが、VBAを使って開く方法を紹介します(VBAを使わない他の方法は、後半で紹介します)
VBAコードはこちら(単一ファイル選択用)
Option Explicit
'エクセルを別プロセスで開くためのコード
Sub OpenSepPros()
Dim xlApp As Excel.Application
Dim selectFileName As Variant
'CreateObject("Excel.Application")を宣言し変数を作成します。
Set xlApp = CreateObject("Excel.Application") ’オブジェクト生成
'ファイル選択ダイアログを表示
selectFileName = _
Application.GetOpenFilename( _
FileFilter:="Microsoft Excel ブック,*.xls*", _
FilterIndex:=1, _
Title:="開くファイルを選択してください", _
MultiSelect:=False) '複数の場合は True
If selectFileName <> False Then
'別インスタンスでExcelブックを開く
xlApp.Workbooks.Open selectFileName, ReadOnly:=False
xlApp.Visible = True
xlApp.WindowState = xlMaximized
Else
MsgBox "ファイルが選択されていません!中止します!"
End If
Set xlApp = Nothing
End Sub
・xlApp で新たなエクセルアプリケーションオブジェクトを用意して
・選択したExcelファイルを用意したxlApp上に開いています
複数ファイル選択用のコードがこちら
Option Explicit
‘複数ファイル起動用
Sub OpenSepPros_2()
Dim xlApp As Excel.Application
Dim selectFileName As Variant
Dim OpenFileName As Variant
Dim PathName As String, fileName As String
Dim pos As Long
'ファイル選択ダイアログを表示
selectFileName = _
Application.GetOpenFilename( _
FileFilter:="Microsoft Excel ブック,*.xls*", _
FilterIndex:=1, _
Title:="開くファイルを選択してください(複数可)", _
MultiSelect:=True)
'選択されたファイルに対する処理
If IsArray(selectFileName) Then
Call マクロ開始
'全てのファイルに繰り返し処理を行う
For Each OpenFileName In selectFileName
pos = InStrRev(OpenFileName, "\")
PathName = Left(OpenFileName, pos)
fileName = Mid(OpenFileName, pos + 1)
'新たなエクセルを用意
Set xlApp = CreateObject("Excel.Application")
'別プロセスでエクセルを開くコード
xlApp.Workbooks.Open PathName & fileName, ReadOnly:=False
xlApp.Visible = True
xlApp.WindowState = xlMaximized
Set xlApp = Nothing
Application.ScreenUpdating = True
Next
Else
MsgBox "ファイルが選択されていません!中止します!"
Exit Sub
End If
End Sub
・複数ファイルを選択できるダイアログに切り替えています
・選択ファイル名を配列に入れてループで一つづつ新たなプロセスで開いていきます
・シートに「ボタン」を配置してマクロを登録しておけばボタンクリックで起動します
【2022/11/29追記・修正】
掲載していたコード内に、テスト段階で使用していたコードの一部が残っていたため削除いたしました。削除した部分は次のとおりです。
・19行目 Call マクロ開始
・32行目 Application.ScreenUpdating = True (現在の31行目 Next の手前)
あわせて、ダウンロードページのサンプルファイルも差し替えしています。
※ ご利用いただいた方からメッセージをいただき修正に至りました。ありがとうございます。
VBAを使わない起動方法(Excel 2013以降)を少しだけ解説
コマンドラインから起動する
「ファイル名を指定して実行」から「excel /x」を実行すれば別プロセスで空のExcelが起動します
・【Windowsキー】+【Rキー】を押すと「ファイル名を指定して実行」が開きます
・ 名前欄に「excel /x」と入力して、OKボタンをクリック(又はEnterキー押す)
↑ ここに半角スペースが入ります(エルとスラッシュの間)
・新たに開いた「空のExcel」から目的の開きたいファイルを開きます
すでに起動しているExcelのアイコンから起動する
・タスクバーに起動しているExcelのアイコン上で右クリック
・そして、下から3番目の「Excel」を【Altキー】を押しながら左クリック
・【Altキー】押しっぱなし(1~2秒)で
・「新しく別のExcelを起動しますか?」というメッセージが出るので「はい」を選択する
※環境により「上のメッセージ」が出ない場合があります
まとめ
実際にそれぞれ起動してみた感想
・VBAでの起動が一番簡単でラクです
・直接起動したいファイルを選択できるのがよいと思います
・手動で起動する方法は、手軽だけど開きたいファイルを後から選ぶのが面倒かな
気づきなど
・職場のPCではアイコンから手動で起動する場合のメッセージが表示されなかった
・表示されなかったけどタスクマネージャーで確認したら別プロセス起動できてました
・自宅PCは「Excel2016」なのにタスクマネージャーや手動起動の際「Excel」と表示
・どうもそれぞれの環境で動作や表示が違う場合があるようです
今回の記事はいかがだったでしょうか。お役に立てたなら幸いです
「別プロセス」「別インスタンス」どちらも同じでいいんじゃないかなぁ!
【今後の機能追加など…】
・長時間かかるVBA実行中にPCが休止状態やスリープになった場合、
VBAも中断してしまいます。「終わっていると思ったら中断されていた」
なんてことがないように対策を検討していきます
・高速化した「VlookUp関数」のVBAでの活用法を再検討してみたいと思います
・次回はこれらのどれかをクリアする対策を提示していきます。ご期待ください(^^)/