在Case Select语句中使用数组作为参数

时间:2018-07-02 14:50:35

标签: excel-vba vba excel

基于某些信息,我的Excel文件处于某个“状态”。例如,我们有服务流程; (1)要求,(2)处理,(3)付款。 在检查是否提供了所有信息之后,函数将返回1或0。1表示存在所有信息,否则返回0。

Dim Status(1 to 3) as Integer

CheckFunction(Request)
Status(1)= CheckFunction 'Return 1 
CheckFuntion(Process)
Status(2)= CheckFunction 'Return 1
CheckFuntion(Payment)
Status(3)= CheckFunction 'Return 0

现在我的数组看起来像这样

Status(1, 1, 0)

此文件现在应该处于“处理”状态。 我要使用它,以便确定服务的当前状态,例如;

Select Case Status()

Case (1, 0, 0)
  'Some code
Case (1, 1, 0)
  'Some code
Case (1, 1, 1)
  'Some code

End Select

但是我无法使它正常工作。 iv总共有15种不同的状态,这对我来说似乎是最优雅的方式。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

无法比较数组,因此下面的代码给出了Type Mismatch(错误13):

Public Sub TestMe()            
    Debug.Print Array(1, 2, 3) = Array(1, 2, 3)            
End Sub

通过比较数组中的每个元素或其他一些业务逻辑来比较数组(例如,如果前两个元素相同或大小相同,则可以认为数组相等)。


最简单的解决方案可能是将数组转换为字符串,然后将该字符串与另一个字符串进行比较。然后,这将起作用:

Public Sub TestMe()

    Dim status As Variant: status = Array(1, 1, 0)

    Select Case Join(status, "")
        Case "100"
            Debug.Print 100
        Case "110"
            Debug.Print 110
        Case "111"
            Debug.Print 111
    End Select

End Sub

答案 1 :(得分:1)

您也可以将这些值相加:

 For each elem in status
     statussum=statussum + elem
 Next

然后在该位置执行您的SELECT / CASE:

 SELECT CASE statussum
     Case 1
     Case 2
     Case 3
 End Select

此外,由于您似乎不太可能拥有001101011,因此可以在SELECT中检查数组的每个元素:

 If Status(1) = 1 Then
     ...
 ElseIf Status(2) = 1 Then
     ...
 ElseIf Status(3) = 1 Then
     ...
 End If

最后,您可以循环检测状态。如果您确实有001011101的实例,这将很有帮助:

 Dim statusCount as Integer, maxStatus as Integer
 For each elem in Status
     statusCount = statusCount + 1
     if elem = 1 then maxStatus = statusCount
 Next elem
 Debug.print maxStatus