神Excelの雑記

闇Excelでバックオフィスの人です。メモ帳的な。

アドインファイル(.xlamと.xla)のシート制御

アドインファイルのシート表示/非表示

アドインファイルは、シートを裏で持っている。
以下のコードで、シートを表示することができる。

'アドインファイルのシート表示
Thisworkbook.IsAddin = False

この状態では、ブックを上書き保存することはできないが、セルに書き込みを行うことは可能である。 そこで、たとえばSheet1のA1セルに「a」と書き込みを行った後、以下のコードで再びシートを隠す。

'アドインファイルのシート非表示
Thisworkbook.IsAddin = True

さて、この状態で、以下のサンプルコードを動かしてみよう。

'サンプルコード
Msgbox Worksheets("sheet1").cells(1,1).value

無事、先ほど入力した値「a」が表示されたことだろう。

アドインファイルの上書きコード

一旦、作業がしやすいように、上書き用のコードを作成する。

Sub Addin_DevSave()
    'アドイン上書きを随時行うためのエラー回避ロジック
    'シートを出したまま保存しようとすると、エラーが出るため
    ThisWorkbook.IsAddin = True
    With ThisWorkbook
        .Save
    End With
    ThisWorkbook.IsAddin = False
End Sub

Excelにこのファイルのアドイン設定を行い、ツールバーにボタンとして配置してしまうのがおすすめだ。

シート制御機能と、共通の呼び出し関数

※あとで記事を分割するかもしれません
これらのプロシージャが使いやすいように、呼び出し用の関数を作成した。

'呼び出し用の関数
Function Addin_Switch(ByVal NameProc As Variant, MemoProc As Variant)
    Addin_Switch = MsgBox("※ 機能をオンにする場合はYES、オフの場合はNOを選択してください" & vbCrLf & vbCrLf & "◆ " & NameProc & vbCrLf & vbCrLf & MemoProc, vbYesNo, "スイッチ:" & NameProc)
End Function

以下のプロシージャを作成し、設定シート制御のボタンとして割り当てている。

'設定シート制御
Sub Addin_Setting()
    NameProc = "Addin_Setting"
    MemoProc = "アドインの設定シートを開きます。"
    
    If Addin_Switch(NameProc, MemoProc) = vbYes Then
        With ThisWorkbook
            .IsAddin = False
            .Activate
        End With
    Else
        ThisWorkbook.IsAddin = True
        Call Addin_Save
    End If

End Sub

さて、自分がこのコードをどのように使っているかというと、シートへの変数の格納だ。複数ツール(Excel)からなる業務システムを組む際には、ひとつのファイルで共通の変数を管理したいシーンが多くある。 Excelのシートは、ノンプログラマの自分にとっては、計算内容の視認性が良く、変数の適用範囲もややこしいことがない。
何より、ドメイン知識が複雑な業務(金融・製造業など)の場合は、バックオフィスのスタッフがエラーの状況を理解できることが重要だし、変数を見える化することで、業務フローを簡略化できることすらある。

シートでどう変数を管理しているかは、別エントリに記載する。