有什么方法可以比较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个以上。感谢阅读。
答案 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