2016-04-26 3 views
0

Я использую vba, и я получаю str как строку Я хочу выполнить следующую задачу.Как проверить правильность значения в массиве

следующий массив;

array1 = (string1, string2, string4) 
array2 = (string3, string6, string7) 
array3 = (string3, string6, string7) 

str = some string 

if str is present in array2 then 
sbj = "subject2" 

if str is present in array1 then 
sbj = subject1 

как мудрый я KNO я запутанный, но в настоящее время я застрял с длинным выключателем Funciton (который работает хорошо)

Function sw(s) 
    sw = Switch(s = "a", "Apple", s = "b", "Banana", s = "c", "Apple", s="d", "banana") 
End Function 

означает и с обеими яблоками и б и d является банан, как что. Можем ли мы использовать что-то еще для этого?

+1

Создайте просто функцию, называемую, например. '' 'IsPresent (str, arr)' '' и в этой функции цикл через arr и сравнивать str против каждого элемента. При совпадении выйдите из цикла цикла и верните '' 'true'''. – dee

ответ

2

присоединиться массив и проверить, что путь

Dim test As Boolean 
Dim findStr As String 
Dim result As String 

findStr = "apple" 

varArray = Array("banana", "apple", "pear", "orange") 

test = Join$(varArray, " ") Like "*apple*" 

result = "apple is " & IIf(test, vbNullString, "not ") & "included" 

сейвы, имеющий цикл по массиву.


Еще лучше, это переосмыслить свой подход. Массивы для хранения наборов подобных данных очень просто, но вам нужно что-то более полезное, поэтому вместо этого используйте вместо этого объект Collection, Dictionary или ArrayList.

+0

Спасибо за ответ. Дай мне проверить. – Rahul

+0

Проблема в том, что вы можете иметь pinneaple в массиве, и тест вернет true, но яблоко не находится в массиве. – Clon

+0

@ Непонятный ответ на неопределенный вопрос - есть способы сделать его более точным (например, с использованием разделителя в шаблоне соответствия), но реальная точка, которую я хотел здесь сделать, состоит в том, что общий класс «Array», пожалуй, наименее подходящий объект для такого рода проблем. –

1

Вы можете определить частную функцию, чтобы проверить, находится ли элемент в массиве или нет, и использовать эту функцию в своих предложениях IF .. THEN.

Public Function elemInArray(ByVal elem As Variant, ByVal Arr As Variant) As Boolean 

    Dim el As Variant 

    elemInArray = False 

    Select Case IsObject(elem) 
    Case True 
     For Each el In Arr 
      If el Is elem Then elemInArray = True: Exit Function 
     Next el 

    Case False 
     For Each el In Arr 
      If el = elem Then elemInArray = True: Exit Function 
     Next el 

    End Select 

End Function 

EDIT: Или это, проще функция, если массив содержит только примитивные типы

Public Function elemInArray(ByVal elem As Variant, ByVal Arr As Variant) As Boolean 

    Dim el As Variant 

    elemInArray = False 

    For Each el In Arr 
     If el = elem Then elemInArray = True: Exit Function 
    Next el 

End Function 

Тогда вы можете задать такие вещи, как это:

if elemInArray(str, arr1) then 
    sbj = "subject1" 

Что касается вашего второго вопроса, вы также можете использовать условные обозначения IF или оператор SELECT CASE, например:

IF s = "a" or s = "c" then 
    sw = "Apple" 
ELSEIF s = "b" or s = "d" then 
    sw = "banana" 
ELSE 
    err.raise 10000,"Unexpected value" 
ENDIF 

или

SELECT CASE sw 
CASE "a","c" 
    sw = "Apple" 
CASE "b","d" 
    sw = "Banana" 
CASE else 
    err.raise 10000,"Unexpected value" 
END SELECT 

Вы можете опустить ELSE часть, если вы можете гарантировать, что S будет одним из «а», «б», «в» или «г».

С уважением

+0

Спасибо за ответ. Позвольте мне проверить – Rahul

+0

Вам действительно не нужен SELECT CASE в функции elemInArray. Вы можете просто сохранить (ДЛЯ КАЖДОГО el IN Arr ... Если el = elem Then .... Next el) part. Остальное на всякий случай, если вы хотите использовать функцию с массивом объектов. – Clon

Смежные вопросы