category name  »  page title date

簡単な設定画面

「設定」とか書いたボタンを押して、プロジェクト全体の基本的なパラメーターを設定したい、ということはよくあります。普通は、そのためのユーザーフォームを作ってそれをやるでしょう。
ここでも、それを真面目にやってみました。
ユーザーフォームに入力した値が、そのままワークシートに転記され、他から容易に参照されるとともに、ブックを閉じた後も保存されるようにしてあります。
各パラメーターは、グローバルな変数に格納されるのではなく、このワークシート上のセルの値を介してユーザーフォームと各プロシージャとを結びつけることになります。

ここでは、TextBox、OptionButton、SpinButton をつけましたが、ComboBox、ListBox、CheckBox なども当然同様のやりかたで扱うことができます。

ユーザーフォーム   SettingForm

姓・名・性別・年齢を入力するフォームを例示しました。あまりシステムのパラメーターらしくはありませんが、これは例えばということですので、内容は気にしないでください。
赤い文字が、それぞれのコントロールにつけた名前です。

ワークシート   CONST

CONSTという名前のワークシートに設定値を残すことにしました。四角で囲んだセルがそれです。隣の青い文字が、それぞれの四角いセルにつけた名前です。
TextBox の場合はその値そのものが、OptionButton の場合は選択されたボタンの Caption が、SpinButton の場合はその Value がここに入ります。


ユーザーフォーム"SettingForm"のコードは、こうなっています。それぞれのコントロールの Change イベントを拾って、ワークシート"CONST"に書き込むようになっています。Change イベントは、コントロール毎に異なるイベントが発生するので、個々にそれを拾わざるをえないため、コピペコピペしてずいぶん冗長なコードになっていますが、構成そのものは簡単なものです。

このあたりは、クラスと WithEvents を駆使すれば解決するはずですが、逆にずいぶん煩雑になりそうなので、今回は我慢。コントロールの数が50個とか100個とかになった場合に挑戦してみます。

オプションボタンのグループ化は、フォームを作成する時に設定しておいてよいのですが、ここでは念のためにユーザーフォームの Initialize イベントで動的にグループ化しておくことにしました。
初期値は、ワークシート"CONST"から取ってきます。
FamilyName = 、FirstName = などは、次の標準モジュールで定義した Let Property を使ったものです。

ユーザーフォーム   SettingForm

'----- オプションボタンをグループ化する準備
Private Const genderGroupName = "gender"
Private Const optionNamesStr = _
      "MaleOptionButton,FemaleOptionButton,GenderqueerOptionButton"
Private Property Get optionNames()
      optionNames = Split(optionNamesStr, ",")
End Property
'----- それぞれの入力欄の入力後の処理
Private Sub FamilyNameTextBox_Change()
    FamilyName = FamilyNameTextBox.text
End Sub
Private Sub FirstNameTextBox_Change()
    FirstName = FirstNameTextBox.text
End Sub
Private Sub AgeSpinButton_Change()
    AgeLabel.Caption = AgeSpinButton.value
    Age = AgeSpinButton.value
End Sub
Private Sub MaleOptionButton_Click()
      Gender = MaleOptionButton.Caption
End Sub
Private Sub FemaleOptionButton_Click()
      Gender = FemaleOptionButton.Caption
End Sub
Private Sub GenderqueerOptionButton_Click()
      Gender = GenderqueerOptionButton.Caption
End Sub
'----- 終了
Private Sub OKCommandButton_Click()
      Unload Me
End Sub
'----- 画面の初期値を設定
Private Sub UserForm_Activate()
      FamilyNameTextBox.text = FamilyName
      FirstNameTextBox.text = FirstName
      MaleOptionButton.value = True
      AgeSpinButton.value = Age
      AgeLabel.Caption = Age
End Sub
'----- オプションボタンのグループ化
Private Sub UserForm_Initialize()
Dim optionName
      For Each optionName In optionNames
            Me.Controls(optionName).groupName = genderGroupName
      Next
End Sub

標準モジュールでは、ユーザーフォームで入力された値をコツコツとワークシート"CONST"の所定のセルに格納する Let Property と、他から参照できる Get Property を用意しています。ただ単にそれだけです。
FamilyName = "xxxxxxxx" でセットされ、 ○○ = FamilyName で参照されます。

標準モジュール    SettingFormModule

'----- CONSTワークシート内のセルの名前
Private Const familyNameCellName = "FamilyName"
Private Const firstNameCellName = "FirstName"
Private Const genderCellName = "Gender"
Private Const ageCellName = "Age"
'----- 各定数の取得/設定
Public Property Get FamilyName()
      FamilyName = getConst(familyNameCellName).value
End Property
Public Property Let FamilyName(name)
      getConst(familyNameCellName).value = name
End Property
Public Property Get FirstName()
      FirstName = getConst(firstNameCellName).value
End Property
Public Property Let FirstName(name)
      getConst(firstNameCellName).value = name
End Property
Public Property Get Gender()
      Gender = getConst(genderCellName).value
End Property
Public Property Let Gender(sex)
      getConst(genderCellName).value = sex
End Property
Public Property Get Age()
      Age = getConst(ageCellName).value
End Property
Public Property Let Age(aetas)
      getConst(ageCellName).value = aetas
End Property
'----- 共通
Private Property Get getConst(cellName)
      Set getConst = ThisWorkbook.Worksheets("CONST").Range(cellName)
End Property

これだけ用意しておけば、次のステートメントで設定画面が表示され、そこでの設定内容がそれぞれ上のようなプロパティで参照できることになります。

標準モジュール    (任意のモジュール内で)

       SettingForm.Show vbModal