エクセルVBAのクラスを使うってなんかできる人っぽくて使いたがり。だがしかし、いまいち利用価値が分かっていないし、しょっちゅうエラーを出してしまう。
仕事で同じ書式のファイルを店舗数作成し、各ファイルの中身は各店舗のデータを入れる、というのがあった。これをクラスを使ってやってみようというもの。
クラスのproperty let / property get ってどうやって使うんだろう、というのがあったので使ってみる(あまり意味はない。自分が理解するための実験)
■■■ 流れ ■■■
①データSTORE
クラス用意:no、tenpo、area
テーブルシートのデータ
↓
1行分のデータをクラスにセット
↓
ディクショナリに追加(※コレクションでもいいと思う。なんとなくディクショナリが好きなので)
②ファイルを作成
~データの数だけ繰り返し~
原本シートコピー
↓
データ入力
↓
名前を付けて保存
~データの数だけ繰り返し~
■■■ コード、テーブル ■■■
(1)テーブルデータ
「TB」シートにデータを入力しておく
no , tenpo , area
1 , 北海道店 , 北海道
2 , 福島店 , 東北
3 , 青森店 , 東北
4 , 東京店 , 関東
5 , 埼玉店 , 関東
6 , 福岡店 , 九州
7 , 長崎店 , 九州
(2)テーブルデータを入れるクラス
プロパティLet/Getを使ってみる
①クラスモジュールを作成する
VBEにて クラスモジュール を挿入
プロパティでクラスモジュールのオブジェクト名をcDataとする
②LETで使うプライベート変数を用意する。変数の最後にアンダーバーをつけるのが流儀らしい。
Private no_ As String
Private tenpo_ As String
Private area_ As String
③LETの部分
Property Let no(ByVal vNo As String)
no_ = vNo
End Property
ほかの二つも同様に
④GETの部分
Property Get no() As String
no = no_
End Property
ほかの二つも同様に
Property Let でTBシートからデータをno_に取り込み、Property Get で no にデータを入れる。なぜ二段階でやるのか初心者の私には利点がわからない。この例では意味がないが、役に立つことがきっとあるのであろう。
(3)部品1:テーブルデータをディクショナリに格納
ここも実験的にクラスでもなく標準モジュールでもなくシートモジュールを使ってみる。いつも隣にITのお仕事のタカハシさんが、シートモジュールを使ってクラスのデータを入れていたのを見たことがあったので。
Sheet1(TB) のモジュール(※1ディクショナリを利用しやすくするためにMicrosoft Scripting Runtimeを事前に参照設定しています)
2 Sub getdataDic()
3 Dim i As Long
4 Set myDic = New Dictionary
5 For i = 2 To Cells(Rows.Count, 1).End(xlUp).row
6 Dim c As cData
7 Set c = New cData
8 c.no = Cells(i, 1).Value
9 c.tenpo = Cells(i, 2).Value
10 c.area = Cells(i, 3).Value
11 myDic.Add c.no, c
12 Set c = Nothing
13 Next i
2 With ActiveSheet
3 .Range(“A2”).Value = myDic(trgNo).no
4 .Range(“B2”).Value = myDic(trgNo).tenpo
5 .Range(“C2”).Value = myDic(trgNo).area
6 .Name = myDic(trgNo).tenpo
7 End With
8 End Sub
2 Application.ScreenUpdating = False
3 Dim path As String ‘ファイルを保存するフォルダ
4 path = ThisWorkbook.path & “\”
5 Dim wsGen As Worksheet ‘原本シートセット
6 Set wsGen = Worksheets(“原本”)
7 Me.getdataDic ‘テーブルデータセット (3)のプロシージャ
8 Dim v As Variant
9 For Each v In myDic.Keys ‘ディクショナリのキー(no)すべて処理
10 wsGen.Copy ’原本シートコピー
11 Me.inputdataDic v ‘データインプット((4)のプロシージャ)
12 With ActiveWorkbook ‘ファイルを名前を付けて保存
13 .SaveAs Filename:=path & myDic(v).tenpo & “.xlsx”
14 .Close ‘ファイル閉じる
15 End With
16 Next
~シートモジュールについての余談~
これまでにシートモジュールを意図的に使ったことがあるのは、マクロでシートをコピーして別ファイルにするとき、いっしょにマクロもコピーしたかったとき。
ファイルのコピーだとマクロも一緒にコピーされるが、シートをコピーして新たなファイルとして保存すると、元ファイルの標準モジュールのマクロは新しいファイルについていかない。
マクロ元ファイルのシートをコピーし新たなファイルとして保存、その新たなファイルでボタンを押したら「指定の動き」をするマクロをつけたかった。
コピーされるシートモジュールに「指定の動き」のコードを書いておいたらそれもコピーされて一件落着、ということがあった(それに気が付くまでにかなり苦労した)
~余談終わり~
With WorkSheets(“TB”)
no_ = .Cells(vRow, 1).Value
tenpo_ = .Cells(vRow, 2).Value
area_ = .Cells(vRow, 3).Value
End With
End Property
c.gdata = i
myDic.Add c.no, c
With ws
no_ = .Cells(vRow, 1).Value
tenpo_ = .Cells(vRow, 2).Value
area_ = .Cells(vRow, 3).Value
End With
End Sub
c.gdata Me, i
コメント