2015-01-20 2 views
2

Я пытаюсь создать массив целых чисел в QTP (ints - 9, 16, 25,34,43). Я думаю, что код для создания экземпляра это должно быть (но я могу ошибаться, так как я никогда не создали массив в QTP раньше),Создание массивов в QTP

Dim pages(5) 
pages(0) = 9 
pages(1) = 16 
... 

Тогда у меня есть цикл с переменной, которая идет от 1 до 50 и основанный на значении переменной, он делает одну вещь, и если переменная является одним из значений в массиве, она делает что-то еще. Для этого у меня есть,

For g = 1 to 50 
    if g<> 9 and g<> 16 and g<> 25 and g<>34 and g<> 43 Then 
    DoCoolStuff... 
    else 
    DoBoringStuff... 
    End If 
Next 

Мой вопрос, есть ли команда, которая позволит мне заменить это некрасиво, если заявление с чем-то вроде если г <> на страницах *?

+0

Не существует оператора 'in', который вы указали в VBA. Однако вы можете инициализировать флаг, сделать цикл 'For'-' Each' (который действительно использует ключевое слово 'in') для перебора элементов 'pages' и установить флаг (и выйти из цикла) если 'g' равно текущему элементу' page'. После цикла флаг сообщает вам, видел ли вы один из значений 'g' во внутреннем цикле в' страницах', таким образом, вы должны были бы ветвиться в зависимости от флага и 'DoCoolStuff' или' DoBoringStuff'. Дайте мне знать, если это поможет, или если вам нужен ответ, показывающий именно это в коде. – TheBlastOne

ответ

3

Если вам нужен размерный массив, то это единственный способ объявить массив. Если вы хотели Non размеров массива, то можно использовать,

Dim pages() 
pages = Array(9, 16, 25, 34, 43) 

Однако, вы также можете сделать это,

Dim pages() 
ReDim pages(5) 
pages = Array(9, 16, 25, 34, 43) 

Приходя к вашей проблеме, вы можете получить это происходит с помощью функции фильтра. Хотя есть очень маленькая проблема. Filter метод принимает в строке, так что даже с этой функцией вашего будет соответствовать 1, 2, 3, 4, 5, 6 вместе с реальными/фактическими значениями 9, 16, 25, 34, 43.

В,

  • 1 происходит в 16.
  • 2 происходит в 25.
  • 3 происходит в 34 и 43.
  • 4occurs в 34 и 43.
  • 5 происходит в 25.
  • 6 происходит в 16.

Он по-прежнему считает, что они встречаются в строке. Один из способов обойти это - форматировать числа как два литерала. Что-то вроде.

Dim pages(), g As Integer 

ReDim pages(5) 
pages = Array("09", "16", "25", "34", "43") 

For g = 1 To 50 
    If UBound(Filter(pages, Format(g, "00"))) > -1 Then 
     'Do Cool Stuff here 
    Else 
     'Do Boring Stuff here 
    End If 
Next 

EDIT:

Другой способ заключается в создании определенной функции пользователя, которые могли бы Петля через массив и найти, если значение найдено в массиве. Что-то вроде,

Public Function FindArrayElement(SearchArray As Variant, LookupValue As Integer) As Boolean 
    Dim aCtr As Integer 

    For aCtr = 0 To UBound(SearchArray) 
     If CLng(SearchArray(aCtr)) = LookupValue Then 
      FindArrayElement = True 
      Exit Function 
     End If 
    Next 

    FindArrayElement = False 
End Function 

Функция принимает два аргумента. Первый - это массив, в котором определены значения, второй - значение, которое искал. Таким образом, ваш исходный код изменится.

Dim pages(), g As Integer 

ReDim pages(5) 
pages = Array(9, 16, 25, 34, 43) 

For g = 1 To 50 
    If FindArrayElement(pages, g) Then 
     'Do Cool Stuff here 
    Else 
     'Do Boring Stuff here 
    End If 
Next 
+0

Что мне не нравится в этом предположении, так это то, что оно основано на сравнении строк, а задача - сравнивать числовые значения. Но +1, потому что назначение массива - это хорошо. – TheBlastOne

+0

@ TheBlastOne, спасибо. Я собирался предложить UDF, который мог бы работать одинаково, хотя он работает немного сложнее. Для каждого цикла необходимо вызвать UDF, который будет запускать цикл For. Тем не менее, я все равно добавлю его к своему ответу. – PaulFrancis

+0

Благодарим вас за отзыв! – user3782816

1

Во-первых, я тоже хотел бы предложить, чтобы инициализировать Pages так:

Dim Pages(): Pages=(9,16,25,34,43) 

Во-вторых, независимо от первого аспекта, вы могли бы использовать этот код, чтобы проверить, если g содержится в Pages :

Dim Elem 
Dim Found: Found=false 
For Each Elem in Pages 
    If Elem = g then 
     Found=true 
     Exit For 
    End If 
End For 
If Found then 
    DoBoringStuff 
else 
    DoCoolStuff 
End If 

в For .. Each цикл повторяется столько раз, сколько есть элементы в Pages массив. Для каждой итерации Elem устанавливается в один элемент массива Pages.

Обратите внимание, что сравнение осуществляется между целыми числами, как было запрошено.