|
▼tak さん:
こんばんは。
>現在以下のような構造体を作成し標準モジュール内で会社名の文字数カウントや
>社員名の文字数をカウントしたりしています。
>
>===================================
> 現在
>===================================
>
>構造体:会社
> 会社名
> 部署名
> 社員(100)
> 売上
>
>構造体:社員
> 社員名
> 入社年度
>
>
>クラス化することで処理をカプセル化できればと思い以下への変更を考えています。
>あまりメリットはないでしょうか?
メリットがあるか否かは、はっきりは分かりかねますが、
私も汎用的な再利用できるものは、クラス化する場合が多いのですが、
上記のようなかなりこのオブジェクトを動かすプログラムが限定されるような
クラスは、作成した事はありません。
ただ、このクラスを作成する事でtak さんのプログラム作成時間が短縮するのであれば
賛成ですが・・・。
>
>また、そもそもVBAで階層を持たせたクラスの作成は可能でしょうか?
>(私は階層のあるクラスを作成したことがありません。。。。ご教示ください。。)
作成したオブジェクトの中でオブジェクトを扱うと言う事でしたら
可能です。
例えば、Thisworkbook.Worksheets("Sheet1")のような・・・・。
>
>===================================
> クラス化
>p:プロパティ cls:クラス M:メソッド
>===================================
>
>クラス:会社
> 会社名 P
> 部署名 P
> 社員(100) cls
> 売上 P
> 会社名文字数 P (内部で算出)
>
>
>クラス: 社員
> 社員名 P
> 入社年度 P
> 社員数 P(内部で算出)
>
>
以下は、一例ですが・・・。
クラス名 ----会社
モジュール
'==========================================
'私は、そのまま加工なしにプールするようなデータは、
'Property・・・は、使いませんが・・・・。
Public 会社名 As String
Public 部署名 As String
Public 売上 As Long
Public 社員S As Collection
'==========================================
Private Sub Class_Initialize()
Set 社員S = New Collection
End Sub
'==========================================
Private Sub Class_Terminate()
Set 社員S = Nothing
End Sub
'==========================================
Sub add(Obj_社員 As 社員)
社員S.add Obj_社員, Obj_社員.社員名
End Sub
'==========================================
Sub delete(社員名 As String)
社員S.Remove 社員名
End Sub
'==========================================
Function 社員数() As Long
社員数 = 社員S.Count
End Function
'==========================================
Function 会社名文字数() As Long
会社名文字数 = Len(会社名)
End Function
'
'
クラス名 ----社員
モジュール
'=========================================
Public 社員名 As String
Public 入社年度 As Long
'今のところクラス社員は、上記のデータだけ
なんて定義すると、プロシジャーMainで
'====================================================
Sub main()
Dim shainmei
Dim nyusha
Dim o_会社 As 会社
Dim o_社員 As 社員
shainmei = Array("山田花子", "林家パー子")
nyusha = Array(1990, 1980)
'↑サンプルデータ作成
Set o_会社 = New 会社
With o_会社
.会社名 = "ichinose"
.部署名 = "お遊び部"
.売上 = 1000
For idx = LBound(shainmei) To UBound(shainmei)
Set o_社員 = New 社員
With o_社員
.社員名 = shainmei(idx)
.入社年度 = nyusha(idx)
End With
.add o_社員
Next idx
MsgBox .会社名 & "の社員数:" & .社員数
MsgBox "林家パー子の入社年度:" & .社員S("林家パー子").入社年度
MsgBox "クビにしたから削除します"
.delete "林家パー子"
MsgBox .会社名 & "の社員数:" & .社員数
End With
Set o_会社 = Nothing
End Sub
なんてコードが書けます。
コレクションを使用すると追加・削除は簡単そうですが、
コード記述時、オブジェクト社員のメンバ表示がされないのが難点です。
MsgBox "林家パー子の入社年度:" & .社員S("林家パー子").入社年度
の「.社員S("林家パー子").」を入力時に・・・。
こういうことがしたいと言うことですか?
|
|