VBAでコレクションクラスを使って、シート上に並んだデータを読み込む関数を書いています。
プロパティが異なるクラスに対する処理のために、同じような関数を書くことになりますが、
型宣言の部分以外は、ルーチンがまったく同じです。
できればオブジェクト指向的に、使い回しをしたいのですが、この場合は関数のオーバーロードなのか、
インターフェイスによる継承なのか分かりませんが、コレクションの中に入れるオブジェクトの型宣言の部分を
汎化するには、どうしたらいいでしょうか?
(他の言語なら、さくっとできるのかもしれませんが、現時点ではアイデアが無くて困っています)
objshtというのが、ワークシートになっており、
この名前で、型宣言を可変にしたいです
vba
1(clsCollection) 2 3'項目を読み込むクラス 4Public Function 項目読込(ByVal objsht As Variant) As Collection 5 Dim ItemList As New Collection 6 Dim endflg As Boolean 7 row = 2 8 9 Do 10 With New clsSchedule 11 Set .WST = objsht 12 endflg = .セル読込(row) 13 ItemList.Add .Self 14 row = row + 1 15 End With 16 Loop While endflg = True 17 18 Set 項目読込 = ItemList 19 20End Function 21 22
VBA
1 2(clsSchedule) 3 4Option Explicit 5Public ID As Long 6Public 項目 As String 7Public 詳細項目 As String 8Public 作業分類 As Long 9Public ステータス As Boolean 10Public 計画者 As String 11Public 担当者 As String 12Public 予定開始時間 As Date 13Public 予定終了時間 As Date 14Public 実績開始時間 As Date 15Public 実績終了時間 As Date 16Public 実績工数 As Long 17Public 投入 As Long 18Public 取出 As Long 19Public ウェイト As Long 20 21Const MAX_COLUMN = 20 22Private DST As Worksheet 23 24Public Property Get Self() As clsSchedule 25 Set Self = Me 26End Property 27 28 29Public Function セル読込(ByVal row As Long) As Boolean 30 If DST.Cells(row, 1) = "" And DST.Cells(row, 2) = "" Then 31 セル読込 = False 32 Exit Function 33 End If 34 35 With New clsStrage 36 .value(row, 1, MAX_COLUMN) = 0 37 Set .WST = DST 38 39ID = .DATA 40項目 = .DATA 41詳細項目 = .DATA 42作業分類 = .DATA 43ステータス = .DATA 44計画者 = .DATA 45担当者 = .DATA 46予定開始時間 = .DATA 47予定終了時間 = .DATA 48実績開始時間 = .DATA 49実績終了時間 = .DATA 50実績工数 = .DATA 51 52投入 = .DATA 53取出 = .DATA 54 55 End With 56 57 If ウェイト < 1 Then ウェイト = 1 58 セル読込 = True 59 60End Function 61 62Property Set WST(ByVal newVal As Worksheet) 63 Set DST = newVal 64End Property 65
##自己解決方法
一応、自分なりに書いてみましたが、これでもかなり無駄が多いコードです。
VBA
1 2Option Explicit 3Private row As Integer 4 5'項目を読み込むクラス 6Public Function 読込(ByVal objsht As Variant) As Collection 7 Dim ItemList As New Collection 8 Dim endflg As Boolean 9 10 Debug.Print objsht.name 11 12 row = 2 13 14Do 15 16 Select Case objsht.name 17 18 Case "チャートクエリ" 19 With New clsSchedule 20 Set .WST = objsht 21 endflg = .セル読込(row) 22 ItemList.add .Self 23 row = row + 1 24 End With 25 26 Case "ビルド" 27 With New clsPeople 28 Set .WST = objsht 29 endflg = .セル読込(row) 30 ItemList.add .Self 31 row = row + 1 32 End With 33 34 Case "品種" 35 With New clsSchedule 36 Set .WST = objsht 37 endflg = .セル読込(row) 38 ItemList.add .Self 39 row = row + 1 40 End With 41 42 End Select 43 44Loop While endflg = True 45 46 Set 読込 = ItemList 47 48End Function
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。