Vba 分别从数组返回值

Vba 分别从数组返回值,vba,ms-access,Vba,Ms Access,我正在寻找一种方法来返回具有最高报销率的账单费率类型 在我搜索的三个变量中,我想存储返回到表中的变量的名称,以便用户可以确定使用了哪种计费类型 此代码从数据库中提取帐单费率 CenterAllRate=DLookup(“CenterBillRateAllVendors”、“Centers”、“CenterID=”&Chr(34)和CenterID&Chr(34)) CenterHospitalRate=DLookup(“CenterBillRateHospitalOnly”、“Centers”、

我正在寻找一种方法来返回具有最高报销率的账单费率类型

在我搜索的三个变量中,我想存储返回到表中的变量的名称,以便用户可以确定使用了哪种计费类型

此代码从数据库中提取帐单费率

CenterAllRate=DLookup(“CenterBillRateAllVendors”、“Centers”、“CenterID=”&Chr(34)和CenterID&Chr(34))
CenterHospitalRate=DLookup(“CenterBillRateHospitalOnly”、“Centers”、“CenterID=”&Chr(34)和CenterID&Chr(34))
VendorRate=DLookup(“VendorReimbRate”、“vendorrid=”&Chr(34)和Me.Parent.VendorID&Chr(34))
报销率=最大金额列表(CenterAllRate、CenterHospitalRate、VendorRate)
我正在使用我在网上找到的这个预先构建的函数来查找三个选项中最高的报销率

函数MaxOfList(ParamArray varValues())作为变量 Dim i作为“整数”循环控制器。 将varMax设置为迄今为止发现的变量的最大值。 varMax=Null'初始化为Null 对于i=LBound(varValues)到UBound(varValues) 如果IsNumeric(varValues(i))或IsDate(varValues(i)),则 如果varMax>=varValues(i),则 “什么也不做 其他的 varMax=varValues(i) 如果结束 如果结束 下一个 MaxOfList=varMax 端函数 我如何返回具有最高值的变量的名称,或者在创建记录时为它们提供别名?

欢迎使用SO

我设计了一个很差的解决方案,可能对您有用,但它在某些特定条件下有效:

  • 您必须始终使用与示例相同的顺序调用函数,这意味着您必须始终键入
    MaxOfList(CenterAllRate、CenterHospitalRate、VendorRate)
  • 我的解决方案只是将调用函数时使用的变量名存储在变量中如果与其他变量一起使用,则不会更新。这意味着,如果您的示例使用其他变量调用函数,如
    MaxOfList(AnotherAllRate、differentiallrate、ExampleRate)
    我的解决方案不会返回正确的名称。它只适用于
    CenterAllRate、CenterHospitalRate、VendorRate
  • 好的,在这之后,这是我糟糕的解决方案。我声明了一个公共字符串var来存储名为
    HighestVar
    的列表中最高层的名称。每次调用函数
    MaxofList

    Option Explicit
    Public HighestVar As String 'We declare the public Var to store name of max rate
    
    Function MaxOfList(ParamArray varValues()) As Variant
    Dim i As Integer        'Loop controller.
    Dim varMax As Variant   'Largest value found so far.
    HighestVar = "" 'We Reset the var
    
    varMax = Null           'Initialize to null
    
    For i = LBound(varValues) To UBound(varValues)
        If IsNumeric(varValues(i)) Or IsDate(varValues(i)) Then
            If varMax >= varValues(i) Then
                'do nothing
            Else
                varMax = varValues(i)
                Select Case i 'We use select Case to store in HighestVar the name of highest rate
                    Case 0
                        HighestVar = "CenterAllRate"
                    Case 1
                        HighestVar = "CenterHospitalRate"
                    Case 2
                        HighestVar = "VendorRate"
                End Select
            End If
        End If
    Next
    
    MaxOfList = varMax
    End Function
    
    每次调用函数
    MaxofList
    时,就会在var
    HighestVar
    中找到最高速率的名称。只要在你想要的地方使用它。例如:

    CenterAllRate = DLookup("CenterBillRateAllVendors", "Centers", "CenterID = " & Chr(34) & CenterID & Chr(34))
    CenterHospitalRate = DLookup("CenterBillRateHospitalOnly", "Centers", "CenterID = " & Chr(34) & CenterID & Chr(34))
    VendorRate = DLookup("VendorReimbRate", "Vendors", "VendorID = " & Chr(34) & Me.Parent.VendorID & Chr(34))
    ReimbursementRate = MaxOfList(CenterAllRate, CenterHospitalRate, VendorRate)
    
    Msgbox HighestVar & " is the highest rate" 'We show in Msgbox highest rate
    

    希望这能帮助你。让我知道。

    因为你是一名编码新手,所以这是一个深入挖掘的好机会。:)

    我将创建一个对象来包装
    Name
    Rate
    属性,并将其传递给我的函数

    例如:

    一个简单的报销类别:

    Option Explicit
    
    Private name_ As String
    Private rate_ As Variant
    
    Public Property Get Name() As String
        Name = name_
    End Property
    Public Property Let Name(Value As String)
        name_ = Value
    End Property
    
    Public Property Get Rate() As Variant
        Rate = rate_
    End Property
    Public Property Let Rate(Value As Variant)
        rate_ = Value
    End Property
    
    您的方法有一些小的更改:

    Function MaxOfList(varValues As Variant) As Reimbursement
        Dim i As Integer                    'Loop controller.
        Dim varMax As Reimbursement         'Largest value found so far.
        Set varMax = New Reimbursement
    
        For i = LBound(varValues) To UBound(varValues)
            If IsNumeric(varValues(i).Rate) Or IsDate(varValues(i).Rate) Then
                If varMax.Rate < varValues(i).Rate Then
                    With varMax
                        .Name = varValues(i).Name
                        .Rate = varValues(i).Rate
                    End With
                End If
            End If
        Next
    
        Set MaxOfList = varMax
    End Function
    

    非常感谢。这看起来是一个很好的解决方案。我从其他来源发现,我可能需要创建一个类,但不确定如何创建。我会试一试,然后用我的结果回复,效果非常好。再次感谢!
    Sub T()
    
        Dim centerAll As New Reimbursement
        Dim centerHospital As New Reimbursement
        Dim vendor As New Reimbursement
        Dim maxReimbursement As New Reimbursement
    
        With centerAll
            .Name = "centerAll"
            '.Rate = DLookup("CenterBillRateAllVendors", "Centers", "CenterID = " & Chr(34) & CenterID & Chr(34))
            .Rate = 3
        End With
        With centerHospital
            .Name = "centerHospital"
            '.Rate = DLookup("CenterBillRateHospitalOnly", "Centers", "CenterID = " & Chr(34) & CenterID & Chr(34))
            .Rate = 8
        End With
        With vendor
            .Name = "vendor"
            '.Rate = DLookup("VendorReimbRate", "Vendors", "VendorID = " & Chr(34) & Me.Parent.VendorID & Chr(34))
            .Rate = 5
        End With
    
        Set maxReimbursement = MaxOfList(Array(centerAll, centerHospital, vendor))
    
        Debug.Print maxReimbursement.Name, maxReimbursement.Rate
    End Sub
    
    'Output
    'centerHospital           8