見出し画像

【Excel VBA】開発を効率化!Config情報を管理するクラスモジュール

こんにちは、おくやんです。
Excel VBAの開発効率を大幅に向上させる、自作のライブラリクラスをご紹介しています。

今回はConfig情報を管理するライブラリクラスのご紹介です。
LibWorkSheetクラスとLibWorkBookクラスと合わせてご利用ください

  • LibWorkSheetクラス

  • LibWorkBookクラス

Key-Value型のConfig情報を、シート上で簡単に管理できるようにしたクラスとなります。
皆さんも、ぜひ活用してみて下さい。


名称

Configクラス

概要

  • configシートからKey-Value型の設定を自動で読取る

  • 指定されたキー項目に該当する値を返す

関連クラス

  • LibWorkSheetクラスのインストールが必要

  • LibWorkBookクラスのインストールが必要

制約

  • 本クラスを実装するWorkBook上に「config」というシート名があること

  • configシート上に「Key」、「Value」というカラムを持つ表が用意されていること

簡単な使い方

configシートの読取り

Configシート上に定義されたキー情報に紐づく値を取得する。

Config情報シート
' config設定の読取り
Dim cnf As Config: Set cnf = New Config

Debug.Print cnf.Val("item_1") '=> 設定値_1
Debug.Print cnf.Val("item_2") '=> 設定値_2
Debug.Print cnf.Val("item_3") '=> 設定値_3
Debug.Print cnf.Val("item_4") '=> 設定値_4

プロパティ定義

Val(key_str, default_val) As Variant

  • 指定されてたキーに該当するconfig設定値を取得する

  • [PARAM] key_str As String

    • 設定に該当するキー項目を指定する

  • [PARAM] Optional default_val As Variant = Empty

    • 指定されたキー項目がconfigシート上に未設定の場合に、戻り値に設定する値を指定する

    • 本項目が未指定の場合に、キー項目が未設定だとエラーがRaiseされる

コンストラクタ定義

  • VBA実行高速化のため下記の設定を行う

    • 画面の更新をOFF

    • 確認メッセージの表示OFF

    • セルの自動計算をOFF

デストラクタ定義

  • VBA実行高速化解除のため下記の設定を行う

    • 画面の更新をON

    • 確認メッセージの表示ON

    • セルの自動計算をON

ソースコード

Visual Basic Editorからクラスモジュール Configを追加して、下記コードを張り付けてください。

Option Explicit

' 定数定義
' シート名
Private Const SHEET_CONFIG As String = "config"

' configヘッダ
Private Const CONFIG_HEADER_KEY As String = "Key"
Private Const CONFIG_HEADER_VALUE As String = "Value"


' メンバー定義
Private Info_ As Object


' Property定義
Private Property Get Info() As Object
  Set Info = Info_
End Property

Private Property Set Info(setting_list As Object)
  Set Info_ = setting_list
End Property

' settingシートから指定されたkeyに対応するvalueを返す
Public Property Get Val(key_str As String, Optional default_val As Variant = Empty) As Variant
  If Info.exists(key_str) Then
    Val = Info.item(key_str)
  ElseIf Not IsEmpty(default_val) Then
    Val = default_val
  Else
    Err.Raise number:=10003, description:="指定されたKeyが存在しません[Key:" & key_str & "]"
  End If
End Property


' Initialize定義
' コンフィグ取得クラスの初期化処理
Private Sub class_initialize()
  Call SwitchAppSettings(True)
  Call GetConfigData
End Sub

' Terminate定義
Private Sub class_terminate()
  Call SwitchAppSettings(False)
End Sub


' Private Function定義
' VBA高速化設定OnOff
Private Function SwitchAppSettings(switch_option As Boolean)
  If switch_option Then
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
  Else
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
  End If
End Function

' configシートから設定項目を取得
Private Function GetConfigData() As Boolean
  
  Set Info = CreateObject("Scripting.Dictionary")
  Dim libWb As LibWorkBook: Set libWb = New LibWorkBook
  If Not libWb.HasSheet(SHEET_CONFIG) Then
    Err.Raise _
          number:=10000, _
          description:="設定シート[" & SHEET_CONFIG & "]が存在しません"
  End If
  
  Dim libWs As LibWorkSheet: Set libWs = New LibWorkSheet
  libWs.Init sheet_name:=SHEET_CONFIG, key_column:=CONFIG_HEADER_KEY
  
  ' 列情報取得
  Dim keyColumn As Long: keyColumn = -1
  Dim valueColumn As Long: valueColumn = -1
  Dim i As Long
  For i = libWs.StartCol To libWs.MaxCol()
    If libWs.Ws.Cells(libWs.HeaderRow, i).value = CONFIG_HEADER_KEY Then
      keyColumn = i
    ElseIf libWs.Ws.Cells(libWs.HeaderRow, i).value = CONFIG_HEADER_VALUE Then
      valueColumn = i
    End If
  Next
  
  If keyColumn = -1 Then Err.Raise _
                            number:=10001, _
                            description:="設定シートに定義項目[" & CONFIG_HEADER_KEY & "]が存在しません"
  If valueColumn = -1 Then Err.Raise _
                              number:=10002, _
                              description:="設定シートに定義項目[" & CONFIG_HEADER_VALUE & "]が存在しません"
  
  ' 設定情報取得
  Do Until libWs.Eof
    If Left(libWs.Val(CONFIG_HEADER_KEY), 1) <> "#" Then
      Call Info.Add(libWs.Val(CONFIG_HEADER_KEY), libWs.Val(CONFIG_HEADER_VALUE))
    End If
    
    Call libWs.ReadNext
  Loop

  GetConfigData = True
End Function


この記事が気に入ったらサポートをしてみませんか?