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