ray88’s diary

お仕事で困ったとき用の自分用の覚書

VBA クラスモジュールを応用したコード②

CustomerクラスCustomersクラスを利用し、前回のコードに追記と変更
■前回コードからの変更箇所(3か所)
変数TableRangeを宣言

'表データを格納する変数
     Dim TableValue As Variant
     Dim TableRange As Range

変数TableRangeとTableValueへ値の代入

  '表データをバリアント型配列に格納
    With Worksheets("Sheet2")
        .Select
       lngLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
       Set TableRange = .Range(Cells(4, 2), Cells(lngLastRow, 5))
       TableValue = TableRange.Value       
    End With

If文のところと修正データを表に反映させるところ

If vIndex = False Then
        MsgBox "指定したIDは見つかりません", vbInformation
    Else
        TableValue(vIndex, 3) = 23 '23歳に変更する
    End If
    '修正したデータを表に反映する
    TableRange.Value = TableValue

■サンプルコード

Option Explicit
'表の列番号を定数化
Enum ColName
    ID = 1
    Name = 2
    Age = 3
    Gender = 4
End Enum
Sub 顧客情報を書き換え()

    '表データを格納する変数
     Dim TableValue As Variant
     Dim TableRange As Range
    '表最終行格納用変数
    Dim lngLastRow As Long

    '表データをバリアント型配列に格納
    With Worksheets("Sheet2")
        .Select
       lngLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
       Set TableRange = .Range(Cells(4, 2), Cells(lngLastRow, 5))
       TableValue = TableRange.Value       
    End With
    
    '顧客情報のセットのコレクションであるCustomersクラスのオブジェクトを生成する
    Dim objCustomers As Customers
    Set objCustomers = New Customers
 
    '表データより顧客情報を取得しCustomerオブジェクトに値を設定
    Dim i As Long
    For i = LBound(TableValue) To UBound(TableValue)
            objCustomers.Add TableValue(i, ColName.ID), TableValue(i, ColName.Name), _
                             TableValue(i, ColName.Age), TableValue(i, ColName.Gender)
    Next
    
    'IDが「A0004」の顧客を検索する
    Dim vIndex As Variant
    
    vIndex = objCustomers.SearchItemIndex("A0004")
    If vIndex = False Then
        MsgBox "指定したIDは見つかりません", vbInformation
    Else
        TableValue(vIndex, 3) = 23 '23歳に変更する
    End If
    '修正したデータを表に反映する
    TableRange.Value = TableValue
    Set objCustomers = Nothing
End Sub

実行結果
Valueプロパティを使用して貼り付けているため、表に計算式がある場合は工夫が必要となる。
 基本的には対象の列のみを配列にしてデータを変更すれば良い。
f:id:ray88:20210510222730p:plain