使用类在Excel VBA中使用多个范围

德施泰因

关于在VBA中使用简单类的机制,有很多很好的建议:什么时候在VBA中使用类?什么是VBA使用类的好处是什么?

作为一个相对不熟悉OOP和类的人,很难知道如何实现它们,或者什至真正可行。

例如,我必须处理多个工作表中的较大范围,并且需要获取许多不同的数据子集。“做x的代理商”和“有y的客户” ...等等。我汇总了一个子项,以得出拥有两个以上客户的代理人数:

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

效果很好,但现在我希望根据其他条件获得更小的代理商和客户子集。因此,我将编写一个类似的函数,以处理类似的数据。我的直觉告诉我,使用课堂会让我的生活更轻松,但是我不知道该如何完成任务。

是否应该有一个包含有关代理的所有信息的Agent类?和/或客户类别?或者,这些课程应该用于查看整个范围还是整个表?

我不是在寻找特定的代码,而是在寻找一种分解方法。

迪克·库斯莱卡(Dick Kusleika)

我必须处理多张纸的大范围

如果您从计算机角度考虑,那么您的代码将很有用。这些范围代表着真实的东西(代理商,客户,发票,交易),因此请考虑这些术语。

我将拥有一个Agent类,其中包含Agent的所有属性。我将拥有一个Agents集合类,其中包含我的所有Agent类。然后,在我的Agents类中,我将具有Filter方法,这些方法返回Agents类的子集。

这是一个例子:我有客户。客户是否活跃。当我向客户发送某些信息时,我还会使用客户的模板。当我想给使用Table1模板的活跃客户发送电子邮件时,它看起来像这样

Set clsCustomersToEmail = clsCustomers.FilterOnActive(True).FilterOnTemplate("Table1")
For Each clsCustomer in clsCustomersToEmail
    'Do stuff
Next clsCustomer`

在我的CCustomers集合类中,我有几个属性可以返回比大CCustomers类(称为clsCustomers)少的客户的CCustomers类。

Public Property Get FilterOnActive() As CCustomers

    Dim clsReturn As CCustomers
    Dim clsCustomer As CCustomer

    Set clsReturn = New CCustomers

    For Each clsCustomer In Me
        If clsCustomer.Active Then
            clsReturn.Add clsCustomer
        End If
    Next clsCustomer

    Set FilterOnActive = clsReturn

End Property
Public Property Get FilterOnTemplate(ByVal sTemplate As String) As CCustomers

    Dim clsReturn As CCustomers
    Dim clsCustomer As CCustomer

    Set clsReturn = New CCustomers

    For Each clsCustomer In Me
        If clsCustomer.Template.TemplateName = sTemplate Then
            clsReturn.Add clsCustomer
        End If
    Next clsCustomer

    Set FilterOnTemplate = clsReturn

End Property

当我想做一些事情,例如将一堆客户数据写入一个范围时,我创建了一个返回数组的属性,并将该数组写入该范围。

Set clsCustomersPastDue = clsCustomers.FilterOnActive(True).FilterOnPastDue(True)
vaWrite = clsCsutomerPastDue.AgingReport
rCell.Resize(UBound(vaWrite,1),UBound(vaWrite,2)).Value = vaWrite

我倾向于思考我编码的是什么物理事物。它们不一定是有形的东西,但是如果您可以将其恢复为有形的东西,则可能会有所帮助。

交易是一回事。但是,如果该交易是发票,则确定该对象的属性变得容易。首先,您可以查看纸质发票并查看其属性。

下一个层次是关系。每个特工类都有客户。因此,您的Agent对象应该具有返回CCustomers类的Customers属性。或者,如果现实生活中的结构不是那么紧密,则您的CCustomers类可能具有FilterOnAgent属性,该属性返回您正在寻找的客户子集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在VBA和Excel中使用范围

来自分类Dev

Excel VBA在宏中使用范围

来自分类Dev

在Excel VBA中使用“设置”设置范围

来自分类Dev

使用VBA选择多个范围

来自分类Dev

使用VBA从多个范围创建单个范围

来自分类Dev

Excel中使用VBA的多个图形

来自分类Dev

在VBA中使用多个SUMIFS

来自分类Dev

在VBA中使用多个子

来自分类Dev

如何在VBA Excel中使用我定义的范围名称?

来自分类Dev

如何在Excel VBA中使用循环创建命名范围?

来自分类Dev

在Excel中使用大写字母选择范围-VBA

来自分类Dev

如何在VBA Excel中使用我定义的范围名称?

来自分类Dev

在 Excel VBA 中使用动态范围自动填充表格

来自分类Dev

在Office 365 API中使用多个范围

来自分类Dev

在工作表中使用多个范围

来自分类Dev

在VBA中使用Sort更改范围

来自分类Dev

如何在Excel VBA中使用c#类?

来自分类Dev

在Excel VBA中使用COM加载项中的CLR类?

来自分类Dev

如何在Excel VBA中使用另一个值范围更改值范围

来自分类Dev

Excel VBA - 在 VBA 函数中使用命名范围作为参数

来自分类Dev

在Java中使用多个类?

来自分类Dev

在多个工作表中使用范围变量

来自分类Dev

命名多个范围-在两列中使用数据

来自分类Dev

在VBA For循环中使用两个以上范围

来自分类Dev

在VBA中使用自动填充时如何更改目标范围

来自分类Dev

在VBA中使用偏移量复制动态范围

来自分类Dev

如何在 VBA 中使用 VLookup 作为范围参数?

来自分类Dev

在Excel中使用多个IF条件

来自分类Dev

在Excel VBA中使用“(全部)”