20240204エクセルVBA オブジェクト指向備忘録クラス003延長(ユーザーフォームでの利用)
<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
エクセルVBAで、オブジェクト指向を必要とすることもなかったので、諦めていましたが、
youtubeで、「ひとりごとワンダーランド」様のエクセルVBAでのクラスに関する動画を見させていただき、
少しだけやる気になっています。感謝。
(まだ、動画は最後まで見ていません。汗)
<以上前書き>
前回
youtube「ひとりごとワンダーランド」様のクラスモジュールの作法(なるべくprivateでpublicを減らすとか、クラス内変数の書き方とか)を使って、ネットHPで「いつも隣にITのお仕事」様の記事「エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット」をコード化しました。
分かっていないので、間違っているかも。(多分、間違っている。汗)
注:もしこのブログ記事に関し、youtube「ひとりごとワンダーランド」様、ネットHP「いつも隣にITのお仕事」様におかれまして、不都合があり、削除すべき場合は、即削除いたします。
前回に引き続き、以下自分用のメモ。
今回
「いつも隣にITのお仕事」の記事に、ちらっと「ユーザーフォームで扱えるようにすると・・・」と書いてありました。
それをやってみました。
このようなユーザーフォームを用意。
最初、昔ながらに、Private Sub UserForm_Initialize()に、
dim a_row as long
a_row = Cells(Rows.Count, 1).End(xlUp).Row
で、書き始めたのですが、そもそもクラスpersonsでItemsコレクションを取得するので、こんなやり方ではないのだろうと、
BingAI様に何回か質問して、下記のコードになりました。
(エラー処理は、ほぼ実装してないです。)
注:以下、BingAI様にほぼ作成いただきました。不都合あれば削除します。
前回の記事のクラス(2)(3)を使います。((1)の標準モジュールMySubは使ってません。)
/////////////////////////////////////
(4)ユーザーフォーム
Private Sub UserForm_Initialize()
' Personsクラスのインスタンスを作成
Dim vPersons As Persons
Set vPersons = New Persons
' スクロールバーの最小値と最大値を設定
With ScrollBar1
.Min = 1
On Error GoTo ErrorHandler
.Max = vPersons.Items.Count
On Error GoTo 0
End With
' 初期表示
Call ShowPerson(1)
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。PersonsクラスのItemsが存在しない可能性があります。", vbCritical
End Sub
Private Sub ScrollBar1_Change()
' スクロールバーの値に対応するPersonを表示
Call ShowPerson(ScrollBar1.Value)
End Sub
Private Sub ShowPerson(index As Integer)
' Personsクラスのインスタンスを作成
Dim vPersons As Persons
Set vPersons = New Persons
' Personを取得
Dim person As person
Set person = vPersons.Item(index)
' テキストボックスに表示
TextBox1.Text = person.id
TextBox2.Text = person.FirstName
TextBox3.Text = person.Gender
TextBox4.Text = Format(person.Birthday, "yyyy/mm/dd")
End Sub
Private Sub CommandButton1_Click()
' テキストボックスの値をチェック
If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text = "" Then
MsgBox "全てのテキストボックスに値を入力してください。", vbExclamation
Exit Sub
End If
' Personsクラスのインスタンスを作成
Dim vPersons As Persons
Set vPersons = New Persons
' 新しいPersonを追加
Dim values As Variant
values = Array(TextBox1.Text, TextBox2.Text, TextBox3.Text, CDate(TextBox4.Text))
Call vPersons.Add(values)
' スクロールバーの最大値を更新
ScrollBar1.Max = vPersons.Items.Count
' エクセルシートに反映
Call vPersons.ApplyToSheet
End Sub
Private Sub CommandButton2_Click()
' テキストボックスからIDを取得
Dim id As String
id = TextBox1.Text
' Personsクラスのインスタンスを取得
Dim vPersons As Persons
Set vPersons = New Persons
' 指定されたIDのデータを削除
vPersons.Remove id
' スクロールバーの最大値を1減らす
ScrollBar1.Max = ScrollBar1.Max - 1
' エクセルシートから該当のデータを削除
Dim rng As Range
Set rng = Sheet1.Columns(1).Find(id)
If Not rng Is Nothing Then
rng.EntireRow.Delete
End If
' エクセルシートに反映
Call vPersons.ApplyToSheet
End Sub
Private Sub CommandButton3_Click()
' テキストボックスからIDを取得
Dim id As String
id = TextBox1.Text
' Personsクラスのインスタンスを取得
Dim vPersons As Persons
Set vPersons = New Persons
' 指定されたIDのデータを取得
Dim person As person
Set person = vPersons.Item(id)
' テキストボックスのデータで上書き
person.FirstName = TextBox2.Text
person.Gender = TextBox3.Text
person.Birthday = CDate(TextBox4.Text)
' エクセルシートに反映
Call vPersons.ApplyToSheet
End Sub
////////////////////////////////////////
感想:
クラスで作ったものが、うまく使えれば、手続き型(上から下処理)のサブルーチンよりも使い勝手がいいのかもしれない。
サブルーチンは、一つの機能全体(それだけで一応のプログラムのまとまり)だけど、
クラスは部品のイメージなのか(部品をその箇所・箇所で組み立てて使う?)
まだ、全く分かってません。汗。