Excel VBA質問箱 IV

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

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


31582 / 76738 ←次へ | 前へ→

【50403】Re:表の仕様のカプセル化
発言  neptune  - 07/7/23(月) 22:25 -

引用なし
パスワード
   行き掛りですんで、ちょっと書きました。

私のやり方だとこんな感じ
多分VB使いにはこちらの方がなじみ易いと思います。

でも、私なら本当はこんな面倒なことはしません。
Accessを使います。その方が工数は小、処理速度も速いはずです。
Excelにデータがあったとしても、Accessに流し込んだほうが(私には)楽チン
と思います。データの量の増大にも別段心配する必要もないし。

Accessのない環境に配布の必要があるなら、mdbファイルとインターフェイス用に
Excelでも使いますか。

※データを作るのが面倒なんで、ソースを書いたものの全く確認は
してませんので悪しからず。まぁこんな感じという事でお願いします。
'/////////////標準モジュール/////////////
Sub test()
  Dim cls1 As New DatasClass
  
  cls1.AddRecords Worksheets("Sheet1").Range("A2:D10")
  Debug.Print cls1.RecCount
End Sub

'/////////////////DatasClass//////////////
'データ管理用Class
'テーブルの仕様に依存

Private clsRec() As RecordClass
Private mCol As Collection


Private Sub Class_Initialize()
  Set mCol = New Collection
End Sub

'セル範囲を渡し、データをセットしてしまう。
'面倒なので既にセットされた場合の確認は省略してます。
'引数
'pSh :DataTableのセル範囲
Public Function AddRecords(pSh As Range)
Dim i As Long, imax As Long
Dim lcol As Long
Dim r As Long  '行番号

  ReDim clsRec(pSh.Rows.Count)
  r = 0
  For i = 1 To pSh.Rows.Count
    Set clsRec(i) = New RecordClass
    With clsRec(i)
      r = r + 1
      .idInited = pSh.Range(r, lcol).Value
      .notNullCol = pSh.Range(r, lcol + 1).Value
      .ランク = pSh.Range(r, lcol + 2).Value
      .管理番号 = pSh.Range(r, lcol + 3).Value
    End With
    '管理番号をKeyにしてRecordClassのCollectionを作成
    mCol.Add clsRec(i), CStr(clsRec(i).管理番号)
  Next i
End Function

'管理番号を受け取り、該当のレコードの内容を返す
'戻り値は配列変数
'ユーザー定義で返したい場合は標準モジュールにpublicでユーザー定義必要
Public Function GetData(pKanri As Long) As Variant
Dim ret(3) As Long
  With mCol(pKanri)
    ret(0) = .idInited
    ret(1) = .notNullCol
    ret(2) = .管理番号
  End With
  
End Function
'レコード数を返す
Public Function RecCount() As Long
  mCol.Count
End Function
'その他処理に必要な関数を作成

'以下は手抜きしてます
'Classのインスタンスを削除する処理
'Collectionのインスタンスを削除する処理

'/////////////RecordClass///////////Record格納用////////
'テーブルの仕様に依存
Private midInited As Boolean
Private mnotNullCol As Long
Private mCol管理番号 As Long
Private mColランク As Long

Public Property Let idInited(pData As Boolean)
  midInited = pData
End Property
Public Property Get idInited() As Boolean
  idInited = midInited
End Property

Public Property Let notNullCol(pData As Long)
  mnotNullCol = pData
End Property
Public Property Get notNullCol() As Long
  notNullCol = midInited
End Property

Public Property Let 管理番号(pData As Long)
  mCol管理番号 = pData
End Property
Public Property Get 管理番号() As Long
  管理番号 = mCol管理番号
End Property

Public Property Let ランク(pData As Long)
  mColランク = pData
End Property
Public Property Get ランク() As Long
  ランク = mColランク
End Property

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 お礼

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