2016-09-05 4 views
2

Я изучаю, как использовать классы в VBA за последние пару месяцев, но у меня возникли проблемы с выяснением того, что является подходящим способом группировки нескольких элементов класса вместе, чтобы я мог проходить через них.Как создать эту структуру VBA?

Например, у меня есть класс с именем clsPersons с такими свойствами, как Name, Gender, DOB и Age (Today - DOB). Если бы я просто хотел бы добавить один человек, я хотел бы сделать следующее:

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 

Однако, если бы я имел таблицу со всеми на нем и решили создать отчет со всеми, кто-то имя начинается с буквы «Р», то я сначала нужно какой-то объект для использования (сбор, словарь и т.д.) и что-то вроде этого, чтобы заполнить его:

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

Помещение нескольких экземпляров вашего класса в коллекцию будет в порядке.

Я бы назвал ваш класс 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 

Person функция:

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

Смежные вопросы