エクセルVBA オブジェクト指向備忘録クラス003延長(ユーザーフォームでの利用)

20240204エクセルVBA オブジェクト指向備忘録クラス003延長(ユーザーフォームでの利用)


エクセルVBA オブジェクト指向備忘録

<前書き>
エクセル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

////////////////////////////////////////


感想:
クラスで作ったものが、うまく使えれば、手続き型(上から下処理)のサブルーチンよりも使い勝手がいいのかもしれない。
サブルーチンは、一つの機能全体(それだけで一応のプログラムのまとまり)だけど、
クラスは部品のイメージなのか(部品をその箇所・箇所で組み立てて使う?)

まだ、全く分かってません。汗。