Есть несколько очень хорошей ansewers на механике с использованием классов smple в VBA: When to use a Class in VBA? и What are the benefits of using Classes in VBA?с использованием классов для работы с несколькими диапазонами в Excel VBA
Как кто-то relativley новой ООП и классы, это трудно знать, как их реализовать, или что действительно возможно.
Например, я должен иметь дело с большими диапазонами в нескольких листах, и мне нужно получить множество разных подмножеств данных. «агенты, которые делают x» и «клиенты, у которых есть» ... и т. д. Вот я к югу, вместе взятым, чтобы в числе агентов, которые имеют более чем 2 клиентов:
Sub agent_subset(output_sheet As String, _
Input_sheet_name As String, _
email_col As Integer, _
vendor_count_col As Integer, _
client_count_col As Integer, _
modified_col As Integer, _
num_of_clients As Integer)
' get a list of all agents with 2 or more clients and put them into a sheet
Application.DisplayStatusBar = True
Dim sheet_rows As Long
sheet_rows = Worksheets(Input_sheet_name).Cells(rows.Count, 1).End(xlUp).Row
Dim email_range As Range ' range of agent emails
Dim client_count_range As Range ' range of client count
Dim vendor_count_range As Range ' range of vendor count
Dim modified_range As Range ' range of modified at
With Worksheets(Input_sheet_name)
Set email_range = .Range(.Cells(2, email_col), .Cells(sheet_rows, email_col))
Set client_count_range = .Range(.Cells(2, client_count_col), .Cells(sheet_rows, client_count_col))
Set vendor_count_range = .Range(.Cells(2, vendor_count_col), .Cells(sheet_rows, vendor_count_col))
Set modified_range = .Range(.Cells(2, modified_col), .Cells(sheet_rows, modified_col))
End With
Dim n As Long
Dim counter As Long
counter = 0
Dim modified_array() As String
For n = 2 To sheet_rows
If client_count_range(n, 1).Value > num_of_clients Then
counter = counter + 1
Worksheets(output_sheet).Cells(counter + 1, 1).Value = email_range(n, 1).Value
Worksheets(output_sheet).Cells(counter + 1, 2).Value = client_count_range(n, 1).Value
Worksheets(output_sheet).Cells(counter + 1, 3).Value = vendor_count_range(n, 1).Value
modified_array() = Split(modified_range(n, 1).Value, "T")
Worksheets(output_sheet).Cells(counter + 1, 4).Value = modified_array(0)
End If
Application.StatusBar = "Loop status: " & n & "of " & sheet_rows
Next n
Worksheets(output_sheet).Cells(counter + 3, 1).Value = "Last run was " & Now()
Application.StatusBar = False
End Sub
Он прекрасно работает, но теперь я хочу, чтобы получить еще меньшее подмножество агентов и клиентов на основе других критериев , Итак, я собираюсь написать аналогичную функцию, манипулируя подобными данными. Моя кишка говорит мне, что использование классов облегчит мне жизнь, но я не знаю, как разбить задачи.
Должен ли быть класс агента, который имеет всю информацию об агентах? и/или класса клиента? Или, если классы предназначены для просмотра целых диапазонов или листов?
Я не ищу конкретный код, а методологию о том, как сломать вещи.
Это превосходно! Очень полезно! Помимо прочего, я не был уверен, что коллекция объектов класса имеет смысл, то есть имеет класс агента, а затем свертывается в коллекцию. Огромное спасибо! – dwstein