Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10838 / 13644 ツリー ←次へ | 前へ→

【19611】クラスか?構造体か? tak 04/11/11(木) 9:46 質問[未読]
【19635】Re:クラスか?構造体か? ichinose 04/11/11(木) 19:48 発言[未読]

【19611】クラスか?構造体か?
質問  tak  - 04/11/11(木) 9:46 -

引用なし
パスワード
   現在以下のような構造体を作成し標準モジュール内で会社名の文字数カウントや
社員名の文字数をカウントしたりしています。

===================================
現在
===================================

構造体:会社 
 会社名
 部署名
 社員(100)
 売上 

構造体:社員
    社員名
   入社年度


クラス化することで処理をカプセル化できればと思い以下への変更を考えています。
あまりメリットはないでしょうか?

また、そもそもVBAで階層を持たせたクラスの作成は可能でしょうか?
(私は階層のあるクラスを作成したことがありません。。。。ご教示ください。。)

===================================
クラス化
p:プロパティ cls:クラス M:メソッド
===================================

クラス:会社 
 会社名    P
 部署名        P
 社員(100)  cls
 売上        P
 会社名文字数 P (内部で算出)
 

クラス: 社員  
     社員名  P
     入社年度  P
     社員数   P(内部で算出)
    

具体的なデータなどはございませんのでイメージしづらいかとは思いますが
構造体とクラスの判断の方法など、皆さんのご意見をお聞かせ願えればと思い書込み
しました。

またVBAのクラス作成についてなど参考になるHPなどお教えいただければ助かります。
以上よろしくお願いいたします。

【19635】Re:クラスか?構造体か?
発言  ichinose  - 04/11/11(木) 19:48 -

引用なし
パスワード
   ▼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("林家パー子").」を入力時に・・・。

こういうことがしたいと言うことですか?

10838 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free