Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / EXCEL. Функция IsError / 12 сообщений из 12, страница 1 из 1
14.01.2019, 10:49
    #39759215
Yagrus2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
Hello world!
На странице http://www.excelworld.ru/stuff/vba_function/system/iserror/24-1-0-98 расписано описание данной функции.
В частности:
Функция IsError
IsError( Expression )
1. Функция позволяет организовать удобную обработку ошибок при построчном контроле ошибок. Какой еще бывает режим контроля ошибок?
2. При этом всякая предусматриваемая, но не устраняемая внутри процедуры ошибка получает свой код и функция возвращает либо требуемое значение, либо код ошибки, который проверяется функцией.
Значения ошибки создаются путем преобразования действительных чисел в значения ошибки с помощью функции CVErr
Возвращаемое значение
Возвращает значение типа Boolean , указывающее, является ли значением ошибки.
Функция IsError возвращает значение True , если параметр Expression имеет значение ошибки; в противном случае возвращается False
Если функция возвращает тип Boolean, что значит второй пункт определения ф-ции IsError? ,
в котором написано: функция возвращает либо требуемое значение, либо код ошибки, который проверяется функцией
...
Рейтинг: 0 / 0
14.01.2019, 11:22
    #39759228
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
Yagrus2 Если функция возвращает тип Boolean, что значит второй пункт определения ф-ции IsError? это описание относится к функции, которая проверяется на возврат ей ошибки и дальнейшую проверку этого результата функцией IsError. А не к самой IsError.

Yagrus2 Какой еще бывает режим контроля ошибок? Про On Error слышали что-нибудь? Вот это тоже он, но не построчный, а более глобальный.
...
Рейтинг: 0 / 0
14.01.2019, 11:43
    #39759236
Yagrus2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
The_Prist Yagrus2 Какой еще бывает режим контроля ошибок? Про On Error слышали что-нибудь? Вот это тоже он, но не построчный, а более глобальный.
Да, конечно.
Читал Пользовался On error goto label On error goto labelOn error resume next On error resume nextOn error goto 0
Если они глобальные, то как включается построчный?
...
Рейтинг: 0 / 0
14.01.2019, 12:00
    #39759240
Yagrus2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
The_PristYagrus2 Если функция возвращает тип Boolean, что значит второй пункт определения ф-ции IsError? это описание относится к функции, которая проверяется на возврат ей ошибки и дальнейшую проверку этого результата функцией IsError. А не к самой IsError..
Я хочу написать функцию, которая проверяет наличие элемента в коллекции по заданному имени.
Ниже код процедуры, который сбоит если элемента с заданным именем нет.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub ds()

    Dim WBook As Workbook
    Set WBook = ThisWorkbook
    Dim TStyle As TableStyles
    Set TStyle = WBook.TableStyles
    Dim TStyleName As String
        TStyleName = "MyPivotStyle"
    
    Dim isExist As Variant
    isExist = Not IsError(TStyle(TStyleName))

End Sub


Почему IsError не возвращает False, если его выражение возвращает ошибку?
...
Рейтинг: 0 / 0
14.01.2019, 12:01
    #39759241
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
Yagrus2,

это прикол? Функция IsError и является неким построчным отловом ошибок. Она позволяет проверить на наличие ошибки конкретное значение или результат функции. И в зависимости от этого в строке принять решение что делать.
Например:
Код: vbnet
1.
2.
3.
4.
5.
If iserror(cells(7,1)) then
msgbox "ячейка содержит ошибку и мы не может использовать её в расчетах"
else
cells(7,1).value = cells(8,1).value * 1.18
end if


или чуть проще:
Код: vbnet
1.
2.
3.
If not iserror(cells(7,1)) then
cells(7,1).value = cells(8,1).value * 1.18
end if


Если бы мы использовали On Error Resume next, то у нас все строки выполнялись бы без пропуска. Это и дольше и не всегда желательно. Например, в примере у меня перезаписывается значение ячейки. В случае с On Error оно перезапишется в любом случае, а при IsError - только если в ячейке нет ошибки.
Пример не очень удачный, но суть должна быть ясна.
...
Рейтинг: 0 / 0
14.01.2019, 12:08
    #39759248
Yagrus2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
The_Prist Функция IsError и является неким построчным отловом ошибок. Этот момент понял, спасибо!
...
Рейтинг: 0 / 0
14.01.2019, 16:04
    #39759398
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
Yagrus2,
переменная типа Variant может иметь специальное значение: Empty, Null, Error, Missing.
Функция IsError - одна из функций, проверяющих такие значения. Другие функции из этого семейства, как нетрудно догадаться - IsEmpty, IsNull, IsMissing.
Функция IsError никак не может "отловить" ошибку, если она возникает при вычислении ее аргумента, в вашем случае - при обращении к несуществующему элементу коллекции. Здесь только On Error, можно так
Код: vbnet
1.
2.
3.
4.
  On Error Resume Next
  If Not IsObject(TStyle(TStyleName)) Then
  Else: isExist = True
  End If
...
Рейтинг: 0 / 0
18.01.2019, 09:56
    #39761266
Yagrus2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
КазанскийYagrus2,
переменная типа Variant может иметь специальное значение: Empty, Null, Error, Missing.
Функция IsError - одна из функций, проверяющих такие значения. Другие функции из этого семейства, как нетрудно догадаться - IsEmpty, IsNull, IsMissing.
Функция IsError никак не может "отловить" ошибку, если она возникает при вычислении ее аргумента, в вашем случае - при обращении к несуществующему элементу коллекции. Здесь только On Error, можно так
Код: vbnet
1.
2.
3.
4.
  On Error Resume Next
  If Not IsObject(TStyle(TStyleName)) Then
  Else: isExist = True
  End If


Спасибо за разъяснение.
...
Рейтинг: 0 / 0
18.01.2019, 11:10
    #39761329
Yagrus2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
правильно ли я понял второй пункт в описании ф-ции есть?
2. При этом всякая предусматриваемая, но не устраняемая внутри процедуры ошибка получает свой код и
функция возвращает либо требуемое значение, либо код ошибки, который проверяется функцией.
Значения ошибки создаются путем преобразования действительных чисел в значения ошибки с помощью функции CVErr

Правильно я понимаю, что под
предусматриваемая, но не устраняемая внутри процедуры ошибка имеется ввиду любая ошибка, а не только
Empty

Null

Error

Missing
Например мой случай - объект не существует элемент коллекции.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Function F_ItemInCollection(oCollection As Variant, sItemName As String) As Object
' Функция - ищет в коллекции элемент с заданным именем . 
'           Возвращает значение типа Object (Либо элемент коллекции, либо код ошибки)
    'oCollection    - Коллекция
    'sItemName      - Имя проверяемого элемента
On Error GoTo ErrHndlNorExists
    If IsObject(oCollection(sItemName)) Then
        Set F_ItemInCollection = oCollection(sItemName)
    End If
    Exit Function
ErrHndlNorExists:
On Error GoTo 0
    Set F_ItemInCollection = CVErr(32767)
End Function

Sub MainSub()
    Dim WBook As Workbook
    Set WBook = ThisWorkbook
    Dim TStyle As TableStyles
    Set TStyle = WBook.TableStyles
    Dim TStyleName As String
        TStyleName = "MyPivotStyle5"
    Dim TStyleCur As Object
    If IsError(F_ItemInCollection(TStyle, TStyleName)) Then
        TStyle.Add (TStyleName)
    Else: Set TStyleCur = F_ItemInCollection(TStyle, TStyleName)
    End If
End Sub

Правда на строке
Код: vbnet
1.
Set F_ItemInCollection = CVErr(32767)

возникает ошибка.
...
Рейтинг: 0 / 0
19.01.2019, 01:41
    #39761795
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
Yagrus2,
оставьте в покое IsError, CVErr. Неприменимы они тут. Значение Variant/Error не является объектом, поэтому его нельзя использовать в операторе Set.
Переменная, объявленная As Object, исходно имеет значение Nothing. Идентификатор функции - та же переменная. Поэтому функцию можно написать так, и в MainSub проверять на Nothing.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Function F_ItemInCollection(oCollection As Variant, vItemID As String) As Object
' Функция - ищет в коллекции элемент с заданным именем .
'           Возвращает значение типа Object (Либо элемент коллекции, либо Nothing)
    'oCollection    - Коллекция
    'vItemID        - идентификатор проверяемого элемента - имя или номер
    On Error Resume Next
    Set F_ItemInCollection = oCollection(vItemID)
End Function

Sub MainSub()
    Dim WBook As Workbook
    Set WBook = ThisWorkbook
    Dim TStyle As TableStyles
    Set TStyle = WBook.TableStyles
    Dim TStyleName As String
        TStyleName = "MyPivotStyle5"
    Dim TStyleCur As Object
    
    Set TStyleCur = F_ItemInCollection(TStyle, TStyleName)
    If TStyleCur Is Nothing Then TStyle.Add TStyleName
End Sub

Как видите, функция фактически получилась из одной команды. Поэтому обычно эту команду включают в тело вызывающей программы, конечно под On Error.
...
Рейтинг: 0 / 0
19.01.2019, 10:53
    #39761814
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
* vItemID As Variant
...
Рейтинг: 0 / 0
19.01.2019, 16:21
    #39761867
ldfanate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXCEL. Функция IsError
Yagrus2Я хочу написать функцию, которая проверяет наличие элемента в коллекции по заданному имени.
Ниже код процедуры, который сбоит если элемента с заданным именем нет.


Надо както так.
IsError() тут непригодна.

Код: vbnet
1.
2.
3.
4.
5.
6.
dim e as long
on error resume next
...ваша команда проверки наличия элемента
e=err.Number
no error goto 0
if e <> 0 then реакция на ошибку...
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / EXCEL. Функция IsError / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]