Тема: Задать условие для выполнения операторов

Скажите пожалуйста как можно задать следующее условие:

If МойМассив содержит хоть один элемент Then
Выполнение операторов
End If

ну а если МойМассив пустой, то не выполняется ничего.
Под пустым я подразумеваю что в массиве нет ничего, он просто объявлен.

Re: Задать условие для выполнения операторов

Ну просто нет слов
UBound

  :!:

Re: Задать условие для выполнения операторов

> fixo
>Ну просто нет слов
>UBound
Я пробовала функцию UBound

If UBound(МойМассив) > 0 Then

выдается ошибка :!:
Subscript out of range (Error 9) :!:
:D

Re: Задать условие для выполнения операторов

А выдается она потому что  массив объявлен, но в нем нет элементов!!!!!!!!!!
А функция UBound выдает нижнюю границу массива (количество элементов в массиве), а массива то нет :D
что же ему выдавать??? только ошибку!!!
;)

Re: Задать условие для выполнения операторов

> fixo
LBound - это тоже не подходит!!!

Re: Задать условие для выполнения операторов

Ситуация заключается в том, что при разных обстоятельствах массив заполняется или наоборот не заполняется. Так вот когда он не заполняется нужно задать условие чтобы операторы не выполнялись

Re: Задать условие для выполнения операторов

Простым перебором подойдет?

Sub CheckOnStandingOneElement()
Dim a(999), i, counter
a(998) = 777
'a(999) = 777
Dim bool As Boolean
For i = LBound(a) To UBound(a)
If IsEmpty(a(i)) Then
bool = True
Else
counter = counter + 1
bool = False
End If
Next

Select Case counter
Case Is = 1
MsgBox "Hurray! Just one elements found! Run your function here"
Case Is > 1
MsgBox "Get the coffee and relax"
Exit Sub
Case Is = 0
MsgBox "No one elements found, do you need the cofee again?"
Exit Sub
End Select

End Sub

~'J'~

Re: Задать условие для выполнения операторов

Слишком мудрено ;)
Я думала это можно записать однеой строкой.
А нельзя как-нибудь попроще???

Re: Задать условие для выполнения операторов

а нет ли встроенного оператора, который проверяет пустой массив или нет???

(изменено: fixo, 17 марта 2009г. 21:50:39)

Re: Задать условие для выполнения операторов

Можно но только еще сложнее, зато
для любых типов массивов:
http://www.cpearson.com/excel/VBAArrays.htm -
см. в середине страницы функцию IsArrayEmpty
Здесь тоже типа того
http://www.sql.ru/forum/actualthread.aspx?tid=114571

~'J'~

Re: Задать условие для выполнения операторов

Я ввожу доп.переменную (bArrayIsEmpty например) для определения было ли занесено хоть одно значение в массив.
Неудобно конечно.
Для динамического массива, который был объявлен но небыл определен диапозон, можно обрабатывать исключение (при Ubounde том же).
Про простой оператор для этого дела операторы забыли :)

Re: Задать условие для выполнения операторов

Vildar прав, надо вводить переменную - счетчик динамического массива, - которая при каждом Redim Preserve ... для этого массива будет менять свое значение. У тебя скорее всего такая переменная используется при заполнении массива. Иначе как ты этот массив заполняешь,- Redim Preserve MyArr(Ubound(MyArr)+1) ? В таком случае перед началом цикла заполнения все-равно надо сначала поставить Redim MyArr(0), иначе та же ошибка вылезет.
Или же через обработчик ошибок, например - такая фунция:

Private Function Check_Array(myarr)
On Error Resume Next
Dim x As Integer
x = UBound(myarr)
If Err <> 0 Then
  Err.Clear
  x = -1
  'MsgBox "Массив пуст"
End If
Check_Array = x
End Function

Передаешь в нее массив и на выходе получаешь кол-во элементов в нем, если оно отрицательное, то элементов в массиве нет.
Не знаю, правда, насколько грамотно массив аргументом передавать... А если массив объявлен глобальным, то и передавать не надо, просто  Function Check_Array(), а в коде функции использовать непосредственно его имя..

Re: Задать условие для выполнения операторов

> Vildar
Если я Вас правильно поняла, то я делаю также, как и Вы. В коде я ставлю включатели (As Boolean), т.е. если происходит заполнение массива включатель = True? а далее ставлю условие:

If Включатель = True then 
Выполнение операторов
end if

Re: Задать условие для выполнения операторов

> AlexV
Очень хорошее и оригинальное решение!!!!!
:D
Я так думаю гораздо лучше моего :D
У меня получается куча включателей!!!!

Re: Задать условие для выполнения операторов

> fixo
Обязательно зайду по Вашим ссылкам и почитаю ;)

Re: Задать условие для выполнения операторов

Всем огромное спасибо!!!!!!!!!!!!!!!!!!!!
:)  ;)

Re: Задать условие для выполнения операторов

Я ввожу доп.переменную (bArrayIsEmpty например) для определения было ли занесено хоть одно значение в массив.
Неудобно конечно.
Для динамического массива, который был объявлен но небыл определен диапозон, можно обрабатывать исключение (при Ubounde том же).

Если массив объявлен не динамическим (dim arr(5) as ...) , то на ubound ошибки не будет, без разницы - присваивались значения его элементам или нет, - ubound выдаст тот размер, с которым его объявили. И с подобным массивом по-любому нужна переменная-счетчик, иначе никак не угадаешь, сколько значений в него поместили. Разве что перебором всех элементов (и то не для всех типов; если массив объявлен как integer, то по умолчанию все = 0, для string - "" и т.д.)

Re: Задать условие для выполнения операторов

А нельзя как-нибудь попроще???

Дарья, напиши себе один раз подходящую функцию и пользуйся ею всю оставшуюся жизнь.
Что может быть проще.
Например:

Sub Main()
    Dim MyArray(100) As Object
    Dim Result As Boolean
    
    Result = GetCheck(MyArray)
    MsgBox Result
End Sub
Private Function GetCheck(ByRef MyArray) As Boolean
    Dim i As Integer
    Dim obj As Object
    
    GetCheck = True 'array is empty
    
    If TypeName(MyArray) = "String()" Then
        For i = LBound(MyArray) To UBound(MyArray)
            If Len(MyArray(i)) > 0 Then
                GetCheck = False 'array is not empty
                Exit Function
            End If
        Next
    ElseIf TypeName(MyArray) = "Variant()" Then
        For i = LBound(MyArray) To UBound(MyArray)
            If MyArray(i) <> Empty Then
                GetCheck = False 'array is not empty
                Exit Function
            End If
        Next
    ElseIf TypeName(MyArray) = "Object()" Then
        For i = LBound(MyArray) To UBound(MyArray)
            Set obj = MyArray(i)
            If obj Is Nothing Then
            Else
                GetCheck = False 'array is not empty
                Exit Function
            End If
        Next
    Else
        For i = LBound(MyArray) To UBound(MyArray)
            If MyArray(i) <> 0 Then
                GetCheck = False 'array is not empty
                Exit Function
            End If
        Next
    End If
End Function