Использование Array в качестве аргумента в выражении Case Select - PullRequest
0 голосов
/ 02 июля 2018

Исходя из определенной информации, мой файл 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 голосов
/ 02 июля 2018

Вы также можете просто сложить значения:

 For each elem in status
     statussum=statussum + elem
 Next

Затем выполните SELECT / CASE на этом:

 SELECT CASE statussum
     Case 1
     Case 2
     Case 3
 End Select

Кроме того, поскольку маловероятно, что у вас будет 001 или 101 или 011, вы можете проверить каждый элемент массива в SELECT:

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

Наконец, в цикле вы можете определить статус. Что было бы полезно, если у вас есть экземпляры 001 или 011 или 101:

 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 
0 голосов
/ 02 июля 2018

Сравнение массивов не может быть выполнено явно - таким образом, приведенный ниже код дает несоответствие типов (Ошибка 13):

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

Таким образом, массивы сравниваются путем сравнения каждого из них или какой-либо другой бизнес-логики (например, можно считать, что массивы равны, если первые 2 элемента одинаковы или размер одинаков).


Возможно, самым простым решением было бы преобразовать массив в строку и сравнить эту строку с другой строкой. Тогда это будет работать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...