2016-09-05 11 views
2

私は過去数ヶ月にわたってVBAでクラスを使用する方法を学んできましたが、複数のクラスアイテムをまとめてグループ化する正しい方法を見つけ出すのに問題があります。このVBA構造を作成するにはどうすればよいですか?

たとえば、Name、Gender、DOB、Age(Today-DOB)などのプロパティを持つclsPersonsというクラスがあります。私はたった一人を追加したい場合は、私は、次の操作を行います。

Dim Person As New clsPersons 

    Person.Name = "Phillip" 
    Person.Gener = "Male" 
    Person.DOB = "#1/1/2000" 
    ' Person.Age would be automatically set by adding Person.DOB 

しかし、私はそれでみんなと一緒にスプレッドシートを持っていたし、名前が文字「P」で始まるのですみんなでレポートを作成することにした場合、

Dim Person As New clsPersons 
    Dim lastRow As Long 
    lastRow = Sheet1.Cells(Rows.Count, 1).Row(xlUp).End 

    For i = 1 To lastRow 
     If Worksheet.Function.Left(Sheet1.Cells(i, 1), 1) = "P" Then 
      Person.Name = Sheet1.Cells(i, 1) 
      Person.Gener = Sheet1.Cells(i, 2) 
      Person.DOB = Sheet1.Cells(i, 3) 
     End If 
    Next i 

それを充填した後、私はそれはアイテムを引き出すことをループにできるようにしたい:私は最初の(コレクション、辞書、など)、およびこのようなものは、それを埋めるために使用するオブジェクトのいくつかの種類を必要としますので、このような何か:

For Each Person In objPeople 
     Sheet2.Cells(i, 1) = Person.Name 
     Sheet2.Cells(i, 1) = Person.Gender 
     Sheet2.Cells(i, 1) = Person.Age 
    Next Person 

私が概説したことがうまくいけばうまくいきます。簡単に言えば、私は、人々をひとつのオブジェクトにまとめる適切な方法を探しています。私は後で自分の手順で繰り返すことができます。

答えて

6

あなたのクラスの複数のインスタンスをコレクションに入れることは問題ありません。

各インスタンスは1人の人物しか表さないので、おそらくクラス名はclsPersonです。

Dim col As New Collection 
Dim lastRow As Long 
lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row 

For i = 1 To lastRow 
    With Sheet1.Rows(i) 
     If Left(.Cells(1), 1) = "P" Then 
      col.Add Person(.Cells(1), .Cells(2), .Cells(3)) 
     End If 
    End with 
Next i 

パーソン機能:

Function Person(nm, gender, dob) as clsPerson 
    Dim p As New clsPerson 
    With p 
     .Name = nm 
     .Gender = gender 
     .DOB = dob 
    End With 
    Set Person = p 
End Function 
+0

私はコレクションでどのように動作するかわからなかったし、それが仕事をした場合には、本当にそう確認するためのおかげでそれを行うための正しい方法だった場合。それはまた、整頓されたコードの素晴らしい部分です、投稿していただきありがとうございます! – pheeper

関連する問題