[Excel/VBA]ファイルが開いたことを検出する方法

この記事のザックリした内容
  • Excel VBAを知っている方が対象
  • xlsmファイルを使わないで実現方法を知りたい方向け
  • personal.xlsb を使います

 

こんにちは。ナガオカ(@boot_kt)です。

 

Excelを使う時、こんなことができたらいいのになぁ、なんて思うことありませんか?

  1. エクセルのファイルを開く
    ファイルの開き方は手動でもなんでもOK
    xlsファイルでも、xlsxファイルでも、xlsmファイルでも、なんでもOK
    WindowsならbatやPowerShell等、Mac/Linuxならshell等で自動化してもOK
     
  2. 一定枚数のファイルが開いたら、自動的になんらかの処理をしたい
     
  3. 処理が終わったらファイル閉じたい
     
  4. 番へ戻る
     

今回はこれを実現する方法を解説します。

 

 

 


 

 

まずはソースコード

ソースコードを見るほうが早いと思うので先に書きます。

VBAを分かる人であれば、これだけ見れば分かりますよね。

Option Explicit

' ApplicationオブジェクトはExcelそのものを示すオブジェクト
Private WithEvents xlApp As Application

Private Sub Workbook_Open()
    ' PERSONAL.xlsbが開く時(つまりExcelが起動する時)にApplicationオブジェクトを取得
    Set xlApp = Application
End Sub


' Excelがワークブック(エクセル用ファイルのこと)を開く度にこのプロシージャが呼ばれる
Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook)
    ' PERSONAL.xlsbが開いたときの処理はWorkbook_Open()プロシージャでやってるので、
    ' ここでは即終了とする
    If Wb Is thiswookbook Then
        Exit Sub
    End If
        
    ' 今回は、3つめのファイルを開いた時点でModule1にあるHogeHogeプロシージャをコールする
    ' Excel.Workbooks.CountにはPERSONAL.xlsbが含まれるよ
    If Excel.Workbooks.Count = 4 Then
        ' 関数をコールする
        Call HogeHoge
    End If
End Sub
Option Explicit

Public Sub HogeHoge()
    ' ここに処理を書く
    
    Dim val  As Long
    
    Dim wb1  As Workbook
    Dim wb2  As Workbook
    Dim wb3  As Workbook
    
    Dim preFix As String
    
    
    For Each Wb In Excel.Workbooks
    
        ' ファイル名かなにかでワークブックのオブジェクトを取得
        ' ここに書いているの適当なのであまり参考にしないでね
        If val = 1 Then
            Set wb1 = Wb
        ElseIf val = 2 Then
            Set wb2 = Wb
        ElseIf val = 3 Then
            Set wb3 = Wb
        End If
    
    Next
    
    
    ' 何か処理する
    ' .....
    ' .....
    ' .....
    
    
    ' ファイル閉じる
    wb1.SaveAs (ActiveWorkbook.Path & "\" & preFix & wb1.Name)
    wb1.Close (False)
    wb2.Close (True)
    wb3.Close (False)
End Sub

解説

解説と言っても特に無いんだけど、ファイルを3個開いたら勝手にHogeHoge()プロシージャが呼ばれて処理されるようになってます。

この書き方のポイント(メリット/デメリット)は以下の通り。

メリット

  • xlsmファイルが不要
    VBAマクロはPERSONAL.xlsbに書いているので、マクロを有効にしますか?というダイアログが出ない

  • ワークブックが開いた数をトリガーにして処理を実行できる
  • ファイルを開く処理をbatやshell等で自動化しておけば、ファイルを開いた瞬間に処理を実行できる

デメリット

  • PERSONAL.xlsbに処理を書くので、ブック固有やシート固有の処理は書けない

参考書籍

ExcelVBAに関してはこの本1冊で充分。
ExcelVBAを使うための説明はすべて書かれていますのでオススメです!

ちょっと分厚いので読破するのはしんどいですけどね(笑)

 

もうちょい簡単な方が良ければ、

 

ちなみに、これは僕がこれから買いたいと思っている本
評判良さそうなので、興味がある方は読んでみてください

まとめ

これは僕が実際に仕事で使った手法です。

ファイルを開くためのbatをこんな風に書きました。

start C:\・・・・\aaa.xlsx
start C:\・・・・\bbb.xlsx
start C:\・・・・\ccc.xlsx
TIMEOUT /T 5

start C:\・・・・\ddd.xlsx
start C:\・・・・\eee.xlsx
start C:\・・・・\fff.xlsx
TIMEOUT /T 5

start C:\・・・・\ggg.xlsx
start C:\・・・・\hhh.xlsx
start C:\・・・・\iii.xlsx
TIMEOUT /T 5

Excelファイルが3つ開かれる → 処理が自動で動く → 処理される → 自動で閉じられる → 5秒待つ → (最初に戻る)

とまぁ、こんな感じになります。

興味ある方はぜひ試してみてください。
なかなか便利ですよ。

 

Boot Tech Programming School のレッスンに興味がある方、レッスン内容を聞いてみたい方、なんなりとお問い合わせください。
無料体験レッスンもありますのでお気軽にどうぞ!!!

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

Windows/Mac/Linuxを使う現役システムエンジニア&プログラマ。オープン系・組み込み系・制御系・Webシステム系と幅広い案件に携わる。C言語やC#やJava等数多くのコンパイラ言語を経験したが、少し飽きてきたので、最近はRubyやPython、WordPressなどのWeb系を修得中。初心者向けのプログラミング教室も運営中。オンライン・対面・出張等でプログラミングをレッスンします。