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プロパティを使用して貼り付けているため、表に計算式がある場合は工夫が必要となる。
基本的には対象の列のみを配列にしてデータを変更すれば良い。