VBA比较多个变量

时间:2014-03-19 14:13:43

标签: excel vba excel-vba

有什么方法可以比较VBA中的多个变量?例如:

Dim x As Integer
Dim y As Integer
Dim z As Integer
x = 99
y = 2
z = 3

我想返回最小的值。 我知道我可以使用select case x > y来表示所有可能的排列,但对于3个以上的变量来说,这似乎很笨拙。

我已经尝试过工作表功能

solution = Application.WorksheetFunction.Min(x, y, z)

但返回2,我希望它返回变量名称以传递给另一个函数。

非常感谢,

编辑:如果这令人困惑,我很抱歉,我仍然是VBA新手。这里的问题更为普遍:

我有一个与名称对应的代码列表,每个代码都有许多名称。我想遍历每个代码的每个名称,并计算名称出现在列表中的实例数,并选择具有最少出现次数的名称。 (可以是0或可以与其他名称相同)。很明显,如果有2个名字,那么if x>y then就很容易了,但我很难比较3个以上。感谢阅读。

2 个答案:

答案 0 :(得分:3)

使用公共数组而不是多个变量。这样可以很容易地迭代它们并获得最高值,并在稍后引用具有最高值的变量:

Public myArray(0 To 2) As Integer
Public index As Integer


Public Sub calcMin()

    Dim i As Integer
    Dim maxValue As Integer


    myArray(0) = 99
    myArray(1) = 2
    myArray(2) = 3


    For i = 0 To UBound(myArray)
        If myArray(i) < maxValue Then
            maxValue = myArray(i)
            index = i
        End If
    Next i

End Sub

Function yourFunction(valueToPass As Integer)

'your function's code here

End Function

然后将变量传递给yourFunction,如下所示:yourFunction(myArray(index))

答案 1 :(得分:2)

与迈克的想法相同,但有一个例子来调用找到最小值的子:

Sub main()

    Dim arrComp(2) As Integer
    arrComp(0) = 99
    arrComp(1) = 2
    arrComp(2) = 3

    'It is important to initialize the tmpVal to a value from the array
    'to consider the chance where negative and positive values are used
    Dim tmpVal As Integer: tmpVal = arrComp(LBound(arrComp))
    Dim i As Integer, minIndex As Integer
    For i = LBound(arrComp) To UBound(arrComp)
        If arrComp(i) < tmpVal Then
            tmpVal = arrComp(i)
            minIndex = i
        End If
    Next i

    showMinVal arrComp(minIndex)

End Sub

Sub showMinVal(MinVal As Integer)

    MsgBox "The min value is " & MinVal

End Sub

或者解决方法如果您希望名称与该值相关联,则可以定义新的Type

'Types must be declared at the top of the module
Type tVarName
    varName As String
    varVal As Integer
End Type

Sub main()

    Dim arrComp(2) As tVarName
    arrComp(0).varName = "x"
    arrComp(0).varVal = 99
    arrComp(1).varName = "y"
    arrComp(1).varVal = 2
    arrComp(2).varName = "z"
    arrComp(2).varVal = 3

    Dim tmpVal As Integer: tmpVal = arrComp(LBound(arrComp)).varVal
    Dim i As Integer, minIndex As Integer
    For i = LBound(arrComp) To UBound(arrComp)
        If arrComp(i).varVal < tmpVal Then
            tmpVal = arrComp(i).varVal
            minIndex = i
        End If
    Next i

    showMinVal arrComp(minIndex)

End Sub

'Sub showing min value along with the name associated to it
Sub showMinVal(MinVal As tVarName)

    MsgBox "The min value is " & MinVal.varName & " = " & MinVal.varVal

End Sub