Excel VBA質問箱 IV

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

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


31591 / 76738 ←次へ | 前へ→

【50394】表の仕様のカプセル化
質問  りった  - 07/7/23(月) 16:24 -

引用なし
パスワード
   いつもお世話になっております。
表の仕様(どこの列に何のデータが入っている等)の情報とプログラムを分離する為に下記の仕組みを考えました。
チーム内に展開し使用したいのですが、あんまり自信ないので良くない箇所など後指摘頂ければ助かります。
運用してしまってからだと変更工数が大きいので...

背景:
 各種表(10数個)を元に色々な集計を行っています。
 何を集計するかは頻繁に変わります。

目的:
 テーブルの使用をカプセル化し、既存のテーブルで
 新たな集計を行う際にはテーブルの仕様を考えずに
 コーディングしたい

モジュールの構成
 ・試験用ルートモジュール
  テスト用のメインです。
 ・Rバグ票
  1レコードのクラスです。
  テーブルの仕様に依存します。
 ・Rバグ票data
  Rバグ票のクラス変数を入れる
 ・TblFRows
 ・クラス変数

その他
 ・テーブル追加の作業が面倒です。もう少し減らしたい。
 ・実際には列の数は何十個かあり、20個程度を判定等に使用します。

^^^^^^^^^^^^^^^^^^^^^^^^ 試験用ルートモジュール
Sub classDebug()
 Dim tbl As New TblFRows
 Dim rcd As New Rバグ票
 Dim s As Worksheet
 Dim i As Integer
 Dim cnt As Integer
 initClassData
 Set s = ThisWorkbook.Worksheets("Sheet1")
 tbl.init s.Range("C2")
 rcd.init tbl
 cnt = 0
 For i = 0 To tbl.nRows - 1
  rcd.idx = i
  If rcd.ランク = "A" Then cnt = cnt + 1
 Next
 MsgBox (cnt)
End Sub

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Rバグ票
Private cData As Rバグ票data
Public tbl As TblFRows
Public idx As Integer

Public Function 管理番号() As Range
 Dim i As Integer
 i = Me.idx
 Set 管理番号 = Me.tbl.sht.Cells(Me.tbl.getRecStartRow(Me.idx), クラス変数.gCD_Rバグ票.myCol管理番号 + Me.tbl.oriCol)
End Function

Public Function ランク() As Range
 Set ランク = Me.tbl.sht.Cells(Me.tbl.getRecStartRow(Me.idx), クラス変数.gCD_Rバグ票.myColランク + Me.tbl.oriCol)
End Function

Public Function init(ByRef t As TblFRows) As Boolean
 Dim myRngTitle As Range
 Dim r As Range
 
 Set Me.tbl = t
 Set r = t.sht.Cells(t.oriRow, t.oriCol)
 Set myRngTitle = t.sht.Range(r, r.Offset(0, t.nCols - 1))
 
 With クラス変数.gCD_Rバグ票
  If Not .idInited Then
   .myColランク = myRngTitle.Find("ランク", , , xlWhole).Column - Me.tbl.oriCol
   .myCol管理番号 = myRngTitle.Find("管理番号", , , xlWhole).Column - Me.tbl.oriCol
   .idInited = True
   .notNullCol = Me.管理番号.Column - Me.tbl.oriCol
   Me.tbl.adjstRowDown (Me.管理番号.Column)
  End If
 End With

 init = True
End Function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Rバグ票data
Public idInited As Boolean
Public notNullCol As Integer
Public myCol管理番号 As Integer
Public myColランク As Integer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TblFRows
Public sht As Worksheet
Public nRows As Integer
Public nCols As Integer
Public oriRow As Integer
Public oriCol As Integer
Public notNullCol As Integer
Public rowsPerRec

Public Function init(ByRef ori As Range) As Boolean
 Set Me.sht = ori.Worksheet
 Me.oriRow = ori.Row
 Me.oriCol = ori.Column
 Me.adjstCol
 Me.notNullCol = 0
End Function

Public Function adjstCol() As Boolean
 Dim r As Range
 Set r = Me.sht.Cells(oriRow, oriCol)
 Me.nCols = r.End(xlToRight).Column - oriCol + 1
 adjstCol = True
End Function

Public Function getRecStartRow(ByVal idx As Integer) As Integer
 getRecStartRow = Me.oriRow + (idx * Me.rowsPerRec) + 1
End Function

Public Function adjstRowDown(ByVal col As Integer) As Boolean
 Dim r As Range
 Set r = Me.sht.Cells(oriRow, col)
 Me.nRows = r.End(xlDown).Row - oriRow
 adjstRowDown = True
End Function

Public Function adjstRowUp(ByVal col As Integer) As Boolean
 Dim r As Range
 Set r = Me.sht.Cells(65536, col)
 Me.nRows = r.End(xlUp).Row - oriRow
 adjstRowUp = True
End Function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ クラス変数
Public gCD_Rバグ票 As Rバグ票data
Public Sub initClassData()
 Set gCD_Rバグ票 = New Rバグ票data
End Sub
0 hits

【50394】表の仕様のカプセル化 りった 07/7/23(月) 16:24 質問
【50403】Re:表の仕様のカプセル化 neptune 07/7/23(月) 22:25 発言
【50416】Re:表の仕様のカプセル化 りった 07/7/24(火) 17:38 質問
【50417】Re:表の仕様のカプセル化 neptune 07/7/24(火) 18:15 回答
【50518】Re:表の仕様のカプセル化 りった 07/7/30(月) 17:24 お礼

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