【ExcelVBA】別インスタンスで開いて作業能率を上げよう

仕事でExcelを使っている人は、Excelを複数開いて作業をしている方が多いのではないでしょうか。
私もその一人です。しかも、大量のデータをVBAを使って処理しているため、同一インスタンス内で複数のブック(プロセス)が動いていた場合、一つのブックでVBA処理を実行させていると、VBAの処理が終了するまでは他のExcelでの作業は行えなくなってしまいます。
しかし、これは同一インスタンス内で実行されている場合のExcelの仕様です。

では、どうすればこれを改善できるでしょうか?
それは、複数の作業を同時に実行しなければならない場合は、別インスタンスでExcelを複数立ち上げれば改善できます。では、その方法を解説していきたいと思います。

この記事はVBAを使ってExcelを別インスタンス(プロセス)で開く方法を解説しています

インスタンスとは? プロセスとは?

「別インスタンスで開く」とか「別プロセスで開く」って、どっちも聞くけど
「インスタンス」とはなに?  「プロセス」ってなに?

タスクマネージャーで「インスタンス」と「プロセス」を説明

【EXCEL2016】を3つのインスタンスで起動、一番下は3つのブックが一つのインスタンスの中に

「タスクマネージャー」のプロセスタブを見てみましょう。動いている「アプリ」が表示されていると思います。これがインスタンスです (アプリ≒インスタンス)
では、 「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

複数ファイルを選択できるダイアログに切り替えています
・選択ファイル名を配列に入れてループで一つづつ新たなプロセスで開いていきます
シートに「ボタン」を配置してマクロを登録しておけばボタンクリックで起動します

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での活用法を再検討してみたいと思います
・次回はこれらのどれかをクリアする対策を提示していきます。ご期待ください(^^)/

サンプルファイルをダウンロードできます(下記リンク先へ)

記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください