N1K0 Пользователь Сообщений: 70 |
Имеется ячейка с формулой, которая может выдавать значения ошибок (#Н/Д и т.п) или if Ячейка является числом Then выполнить код помогите! |
ytk5kyky Пользователь Сообщений: 2410 |
If IsNumeric(ячейка.Value) Then Если известен вид ошибки, то можно проверить значение, например, для #Н/Д: Или так: |
ZVI Пользователь Сообщений: 4338 |
Или так: If Not IsError(ActiveCell) Then MsgBox «Нет ошибки» |
N1K0 Пользователь Сообщений: 70 |
Перепробовал все способы, работает. |
Здравствуйте. Решил не создавать новую тему а эту освежить, таким вопросом. Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. Знаю что ексель хранит дату и время в числовом формате, но может есть какой то способ? Спасибо! |
|
{quote}{login=}{date=06.04.2011 06:40}{thema=Как проверить что в ячейке формат даты}{post}Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. {/post}{/quote} If IsDate(ActiveCell) Then MsgBox «В активной ячейке находится дата!» Вот только IsDate почему-то распознаёт дату даже в ячейке, где содержится текст 1,2,2011 |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Игорь, я так понял из вопроса, надо на конкретную дату проверить, что-то вроде: Я сам — дурнее всякого примера! … |
Guest Гость |
#8 06.04.2011 07:29:07 Да Игорь все правильно вы поняли, надо именно на формат проверить, а не на конкретную дату, я думаю если к вашему методу добавить такую проверку: If (IsDate(ActiveCell) And ActiveCell.Value Like «*.*.*» Then MsgBox «В активной ячейке находится дата!» |
Q: How do i determine if an error is in any cell in the entire workbook with Excel VBA?
Normally errors will be divide by 0 or #value errors, but this list is not exhaustive (or is it? — i don’t know if more exist)
Is there a way to determine if a cell contains an error then to skip over further processing in my script without spitting out a debug/warning/error message.
something such like
if value in current.Workbook.cell is error then go to <jump>
OR
if value in old.Workbook.cell is error then go to <jump>
where jump
is a marker at the end of an if statement but within a loop.
the script compares values between two workbooks and updates the current workbook with colours to show difference.
I have no VBA experience at all. but i get the gist of the script i have been given.
thank you kindly.
asked Nov 22, 2011 at 17:00
MatMat
1,2211 gold badge22 silver badges46 bronze badges
1
You can skip cells with errors by using the VarType
function. For example:
If VarType(ActiveCell.Value) <> vbError Then
' do something
End If
The VarType
function is also very useful to validate the data type. For example if your code expects a date value but sometimes encounters text, you can use this function to vet the data and handle exceptions gracefully.
answered Nov 22, 2011 at 19:18
Rachel HettingerRachel Hettinger
7,8622 gold badges21 silver badges31 bronze badges
1
Here’s an snippet of code that records in the Immediate Window, the worksheet name, cell address and formula, where there is a spreadsheet formula error…
Dim ws As Worksheet, r As Range
For Each ws In Worksheets
For Each r In ws.UsedRange
If IsError(r.Value) Then
Debug.Print r.Parent.Name, r.Address, r.Formula
End If
Next
Next
answered Nov 22, 2011 at 21:39
1
Given your initial question was how do you detect errors in any cell of the workbook with VBA then you should be looking for a very efficient approach — looking at each cell is very expensive time wise!
Two options for this are:
- Use Excel’s SpecialCells to shortcut the process
- use my Mappit! addin which is configured to report on spreadsheet errors
For SpecialCells please see the code below. This takes advantage of the ready-made collection of errors that exist as formulas
Please that that constants also have an errors collection, so if you have copied then run a paste special as value on a formula error then you would need to use Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors)
to detect these
You can use also detect SpecialCells manually by
- Select all cells in the area of interest
- Press F5
- Click Special
- select ‘Errors’ under ‘Formulas’ (or ‘Constants’)
Please be aware that prior to xl2010 there is a limit of 8192 areas that SpecialCells can handle
Sub ErrorList()
Dim ws As Worksheet
Dim rng1 As Range
Dim strOut As String
For Each ws In ActiveWorkbook.Sheets
Set rng1 = Nothing
On Error Resume Next
Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
On Error GoTo 0
If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
Next ws
If Len(strOut) > 0 Then
MsgBox "Error List:" & vbNewLine & strOut
Else
MsgBox "No Errors", vbInformation
End If
End Sub
answered Nov 23, 2011 at 9:35
brettdjbrettdj
54.7k16 gold badges113 silver badges176 bronze badges
There’s another way to do handle this: add On Error Resume Next
into your code (usually just put it before the loop).
If a cell is an error, it’ll just skip it and move to the next element in the loop
answered Nov 23, 2011 at 0:33
GaijinhunterGaijinhunter
14.6k4 gold badges51 silver badges57 bronze badges
4
N1K0 Пользователь Сообщений: 70 |
Имеется ячейка с формулой, которая может выдавать значения ошибок (#Н/Д и т.п) или if Ячейка является числом Then выполнить код помогите! |
ytk5kyky Пользователь Сообщений: 2410 |
If IsNumeric(ячейка.Value) Then Если известен вид ошибки, то можно проверить значение, например, для #Н/Д: Или так: |
ZVI Пользователь Сообщений: 4325 |
Или так: If Not IsError(ActiveCell) Then MsgBox «Нет ошибки» |
N1K0 Пользователь Сообщений: 70 |
Перепробовал все способы, работает. |
Здравствуйте. Решил не создавать новую тему а эту освежить, таким вопросом. Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. Знаю что ексель хранит дату и время в числовом формате, но может есть какой то способ? Спасибо! |
|
{quote}{login=}{date=06.04.2011 06:40}{thema=Как проверить что в ячейке формат даты}{post}Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. {/post}{/quote} If IsDate(ActiveCell) Then MsgBox «В активной ячейке находится дата!» Вот только IsDate почему-то распознаёт дату даже в ячейке, где содержится текст 1,2,2011 |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Игорь, я так понял из вопроса, надо на конкретную дату проверить, что-то вроде: Я сам — дурнее всякого примера! … |
Guest Гость |
#8 06.04.2011 07:29:07 Да Игорь все правильно вы поняли, надо именно на формат проверить, а не на конкретную дату, я думаю если к вашему методу добавить такую проверку: If (IsDate(ActiveCell) And ActiveCell.Value Like «*.*.*» Then MsgBox «В активной ячейке находится дата!» |
Q: How do i determine if an error is in any cell in the entire workbook with Excel VBA?
Normally errors will be divide by 0 or #value errors, but this list is not exhaustive (or is it? — i don’t know if more exist)
Is there a way to determine if a cell contains an error then to skip over further processing in my script without spitting out a debug/warning/error message.
something such like
if value in current.Workbook.cell is error then go to <jump>
OR
if value in old.Workbook.cell is error then go to <jump>
where jump
is a marker at the end of an if statement but within a loop.
the script compares values between two workbooks and updates the current workbook with colours to show difference.
I have no VBA experience at all. but i get the gist of the script i have been given.
thank you kindly.
asked Nov 22, 2011 at 17:00
MatMat
1,2211 gold badge22 silver badges46 bronze badges
1
You can skip cells with errors by using the VarType
function. For example:
If VarType(ActiveCell.Value) <> vbError Then
' do something
End If
The VarType
function is also very useful to validate the data type. For example if your code expects a date value but sometimes encounters text, you can use this function to vet the data and handle exceptions gracefully.
answered Nov 22, 2011 at 19:18
Rachel HettingerRachel Hettinger
7,7122 gold badges22 silver badges31 bronze badges
1
Here’s an snippet of code that records in the Immediate Window, the worksheet name, cell address and formula, where there is a spreadsheet formula error…
Dim ws As Worksheet, r As Range
For Each ws In Worksheets
For Each r In ws.UsedRange
If IsError(r.Value) Then
Debug.Print r.Parent.Name, r.Address, r.Formula
End If
Next
Next
answered Nov 22, 2011 at 21:39
1
Given your initial question was how do you detect errors in any cell of the workbook with VBA then you should be looking for a very efficient approach — looking at each cell is very expensive time wise!
Two options for this are:
- Use Excel’s SpecialCells to shortcut the process
- use my Mappit! addin which is configured to report on spreadsheet errors
For SpecialCells please see the code below. This takes advantage of the ready-made collection of errors that exist as formulas
Please that that constants also have an errors collection, so if you have copied then run a paste special as value on a formula error then you would need to use Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors)
to detect these
You can use also detect SpecialCells manually by
- Select all cells in the area of interest
- Press F5
- Click Special
- select ‘Errors’ under ‘Formulas’ (or ‘Constants’)
Please be aware that prior to xl2010 there is a limit of 8192 areas that SpecialCells can handle
Sub ErrorList()
Dim ws As Worksheet
Dim rng1 As Range
Dim strOut As String
For Each ws In ActiveWorkbook.Sheets
Set rng1 = Nothing
On Error Resume Next
Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
On Error GoTo 0
If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
Next ws
If Len(strOut) > 0 Then
MsgBox "Error List:" & vbNewLine & strOut
Else
MsgBox "No Errors", vbInformation
End If
End Sub
answered Nov 23, 2011 at 9:35
brettdjbrettdj
54.4k15 gold badges112 silver badges175 bronze badges
There’s another way to do handle this: add On Error Resume Next
into your code (usually just put it before the loop).
If a cell is an error, it’ll just skip it and move to the next element in the loop
answered Nov 23, 2011 at 0:33
GaijinhunterGaijinhunter
14.4k4 gold badges50 silver badges57 bronze badges
4
Q: How do i determine if an error is in any cell in the entire workbook with Excel VBA?
Normally errors will be divide by 0 or #value errors, but this list is not exhaustive (or is it? — i don’t know if more exist)
Is there a way to determine if a cell contains an error then to skip over further processing in my script without spitting out a debug/warning/error message.
something such like
if value in current.Workbook.cell is error then go to <jump>
OR
if value in old.Workbook.cell is error then go to <jump>
where jump
is a marker at the end of an if statement but within a loop.
the script compares values between two workbooks and updates the current workbook with colours to show difference.
I have no VBA experience at all. but i get the gist of the script i have been given.
thank you kindly.
asked Nov 22, 2011 at 17:00
MatMat
1,2211 gold badge22 silver badges46 bronze badges
1
You can skip cells with errors by using the VarType
function. For example:
If VarType(ActiveCell.Value) <> vbError Then
' do something
End If
The VarType
function is also very useful to validate the data type. For example if your code expects a date value but sometimes encounters text, you can use this function to vet the data and handle exceptions gracefully.
answered Nov 22, 2011 at 19:18
Rachel HettingerRachel Hettinger
7,7122 gold badges22 silver badges31 bronze badges
1
Here’s an snippet of code that records in the Immediate Window, the worksheet name, cell address and formula, where there is a spreadsheet formula error…
Dim ws As Worksheet, r As Range
For Each ws In Worksheets
For Each r In ws.UsedRange
If IsError(r.Value) Then
Debug.Print r.Parent.Name, r.Address, r.Formula
End If
Next
Next
answered Nov 22, 2011 at 21:39
1
Given your initial question was how do you detect errors in any cell of the workbook with VBA then you should be looking for a very efficient approach — looking at each cell is very expensive time wise!
Two options for this are:
- Use Excel’s SpecialCells to shortcut the process
- use my Mappit! addin which is configured to report on spreadsheet errors
For SpecialCells please see the code below. This takes advantage of the ready-made collection of errors that exist as formulas
Please that that constants also have an errors collection, so if you have copied then run a paste special as value on a formula error then you would need to use Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors)
to detect these
You can use also detect SpecialCells manually by
- Select all cells in the area of interest
- Press F5
- Click Special
- select ‘Errors’ under ‘Formulas’ (or ‘Constants’)
Please be aware that prior to xl2010 there is a limit of 8192 areas that SpecialCells can handle
Sub ErrorList()
Dim ws As Worksheet
Dim rng1 As Range
Dim strOut As String
For Each ws In ActiveWorkbook.Sheets
Set rng1 = Nothing
On Error Resume Next
Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
On Error GoTo 0
If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
Next ws
If Len(strOut) > 0 Then
MsgBox "Error List:" & vbNewLine & strOut
Else
MsgBox "No Errors", vbInformation
End If
End Sub
answered Nov 23, 2011 at 9:35
brettdjbrettdj
54.4k15 gold badges112 silver badges175 bronze badges
There’s another way to do handle this: add On Error Resume Next
into your code (usually just put it before the loop).
If a cell is an error, it’ll just skip it and move to the next element in the loop
answered Nov 23, 2011 at 0:33
GaijinhunterGaijinhunter
14.4k4 gold badges50 silver badges57 bronze badges
4
se_arts 0 / 0 / 0 Регистрация: 15.10.2016 Сообщений: 91 |
||||||
1 |
||||||
Как задается условие «если ошибка» — #ЗНАЧ!13.03.2018, 10:39. Показов 8792. Ответов 7 Метки нет (Все метки)
Подскажите, пожалуйста, как правильно задается условие «если ошибка»
Вложения
__________________ 0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
13.03.2018, 10:39 |
Ответы с готовыми решениями: Какой функцией задать условие «Если область ячеек пустая» ? Почему ошибка: «Next without for» если For абсолютно точно есть? Sub isColNum() Если str довольно длинная,то выскакивает ошибка «type mismatch»
7 |
Hugo121 6874 / 2806 / 533 Регистрация: 19.10.2012 Сообщений: 8,550 |
||||
13.03.2018, 10:41 |
2 |
|||
1 |
Казанский 15131 / 6405 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
13.03.2018, 11:52 |
3 |
|||
se_arts, #ЗНАЧ! это CVErr(xlErrValue)
2 |
se_arts 0 / 0 / 0 Регистрация: 15.10.2016 Сообщений: 91 |
||||
13.03.2018, 11:54 [ТС] |
4 |
|||
Hugo121, выдает ошибку
Данные: Кликните здесь для просмотра всего текста 5 6 0 0 0 |
se_arts 0 / 0 / 0 Регистрация: 15.10.2016 Сообщений: 91 |
||||||
13.03.2018, 12:23 [ТС] |
5 |
|||||
Казанский, убрал проверку 2-ого условия (And Cells(i, 5).Value <> «»), попробовал CVErr(xlErrValue) и для любой ошибки Что я неправильно пишу или указываю в коде?
Миниатюры
Вложения
0 |
Vlad999 3815 / 2244 / 749 Регистрация: 02.11.2012 Сообщений: 5,894 |
||||
13.03.2018, 15:16 |
6 |
|||
IsError(Cells(i, 6).Value) не подошел? Добавлено через 1 минуту
1 |
Hugo121 6874 / 2806 / 533 Регистрация: 19.10.2012 Сообщений: 8,550 |
||||
13.03.2018, 22:37 |
7 |
|||
РешениеПосмотрел наконец файл — точно xlErrValue нужно:
Добавлено через 1 минуту 1 |
0 / 0 / 0 Регистрация: 15.10.2016 Сообщений: 91 |
|
14.03.2018, 00:09 [ТС] |
8 |
Hugo121, заработало 0 |
Точно так же, как мы используем ЕСЛИОШИБКА в Excel, чтобы знать, что делать, когда возникает ошибка перед каждой функцией, у нас есть встроенная функция ЕСЛИОШИБКА в VBA, которая используется таким же образом, поскольку это функция рабочего листа, мы используем эту функцию с worksheet.function метод в VBA, а затем мы предоставляем аргументы для функции.
Ожидать, что код будет работать без ошибок, — преступление. Для обработки ошибок в VBA у нас есть несколько способов использования таких операторов, как При ошибке Возобновить следующий VBAОператор VBA On Error Resume — это аспект обработки ошибок, используемый для игнорирования строки кода, из-за которой возникла ошибка, и продолжения со следующей строки сразу после строки кода с ошибкой.читать далее, При ошибке Возобновить Перейти к 0, При ошибке Перейти к метке. Обработчики ошибок VBA могут переходить только к следующей строке кода. Но в случае, если вычисление не происходит, нам нужно заменить ошибку на какое-то другое идентификационное слово. В этой статье мы увидим, как добиться этого с помощью VBA. ЕСЛИОШИБКА Функция в ExcelФункция ЕСЛИОШИБКА в Excel проверяет формулу (или ячейку) на наличие ошибок и возвращает указанное значение вместо ошибки.читать далее.
Вы можете использовать это изображение на своем веб-сайте, в шаблонах и т. д. Пожалуйста, предоставьте нам ссылку на авторствоСсылка на статью должна быть гиперссылкой
Например:
Источник: VBA IFERROR (wallstreetmojo.com)
Как использовать ЕСЛИОШИБКА в VBA?
Здесь следует помнить, что это не Функция VBAФункции VBA служат основной цели для выполнения определенных вычислений и возврата значения. Поэтому в VBA мы используем синтаксис для указания параметров и типа данных при определении функции. Такие функции называются пользовательскими функциями.читать далее скорее просто как функция рабочего листа.
Вы можете скачать этот шаблон Excel VBA IFERROR здесь — Шаблон Excel для VBA ЕСЛИОШИБКА
Для примера возьмем приведенные выше данные только для демонстрации.
Шаг 1: Определите переменную как целое число.
Код:
Sub Iferror_Example1() Dim i As Integer End Sub
Шаг 2: Для выполнения расчета откройте For Следующий цикл.
Код:
Sub Iferror_Example1() Dim i As Integer For i = 2 To 6 Next i End Sub
Шаг 3: Внутри напишите код как Ячейки(I,3).Значение =
Код:
Sub Iferror_Example1() Dim i As Integer For i = 2 To 6 Cells(i,3).Value = Next i End Sub
Шаг 4: Чтобы получить доступ к функции ЕСЛИОШИБКА, мы не можем просто ввести формулу; скорее, нам нужно использовать «Функция рабочего листа» класс.
Код:
Sub Iferror_Example1() Dim i As Integer For i = 2 To 6 Cells(i, 3).Value = WorksheetFunction.If Next i End Sub
Шаг 5: Как вы можете видеть на изображении выше, после вставки класса команды «WorksheetFunction» мы получаем формулу ЕСЛИОШИБКА. Выберите формулу.
Код:
Sub Iferror_Example1() Dim i As Integer For i = 2 To 6 Cells(i, 3).Value = WorksheetFunction.IfError( Next i End Sub
Шаг 6: Одна из проблем в VBA при доступе к функциям рабочего листа: мы не видим аргументы, подобные тому, что мы видели на рабочем листе. Вы должны быть уверены в аргументах, которые мы используем.
По этой причине, прежде чем я покажу вам IFERROR в VBA, я показал вам синтаксис функции рабочего листа.
Первый аргумент здесь — «Значение», т. е. какую ячейку вы хотите проверить? Перед этим примените расчет в Cell.
Теперь в VBA примените приведенные ниже коды.
Код:
Sub Iferror_Example1() Dim i As Integer For i = 2 To 6 Cells(i, 4).Value = WorksheetFunction.IfError(Cells(i, 3).Value, "Not Found") Next i End Sub
Теперь функция ЕСЛИОШИБКА проверяет наличие ошибок в столбце C. Если обнаруживается какая-либо ошибка, в столбце D отображается результат «Не найдено».
Таким образом, используя функцию ЕСЛИОШИБКА, мы можем изменить результаты по своему желанию. В этом случае я изменил результат как «Не обнаружена.» Вы можете изменить это по своему требованию.
Типы ошибок, VBA IFERROR, можно найти
Важно знать виды Эксель ошибкиОшибки в Excel распространены и часто возникают во время применения формул. Список из девяти наиболее распространенных ошибок Excel: #DIV/0, #N/A, #NAME?, #NULL!, #NUM!, #REF!, #VALUE!, #####, Circular Reference.читать далее функция ЕСЛИОШИБКА может обработать. Ниже приведены типы ошибок, которые может обработать IFERROR.
#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? или #NULL!.
УЗНАТЬ БОЛЬШЕ >>
Post Views: 805
В этом учебном материале вы узнаете, как использовать Excel функцию ЕОШИБКА с синтаксисом и примерами.
Описание
Функцию Microsoft Excel ЕОШИБКА можно использовать для проверки таких значений ошибок, как #Н/Д, #ЗНАЧ!, #ССЫЛКА!, #ДЕЛ/0!, #ЧИСЛО!, #ИМЯ? или #ПУСТО!.
Функция ЕОШИБКА — это встроенная в Excel функция, которая относится к категории информационных функций.
Её можно использовать как функцию рабочего листа (WS) и функцию VBA в Excel.
Как функцию рабочего листа, функция ЕОШИБКА может быть введена как часть формулы в ячейке рабочего листа.
В качестве функции VBA вы можете использовать функцию ISERROR в коде макросов, который вводится через редактор Microsoft Visual Basic.
Синтаксис
Синтаксис функции ЕОШИБКА в Microsoft Excel:
ЕОШИБКА(значение)
Аргументы или параметры
- значение
- Значение, которое вы хотите проверить.
Еслизначение
является значением ошибки (#Н/Д, #ЗНАЧ!, #ССЫЛКА!, #ДЕЛ/0!, #ЧИСЛО!, #ИМЯ? или #ПУСТО!), функция ЕОШИБКА вернет ИСТИНА. В противном случае она вернет ЛОЖЬ.
Возвращаемое значение
Функция ЕОШИБКА возвращает ИСТИНА, если значение является любым значением ошибки (#Н/Д, #ЗНАЧ!, #ССЫЛКА!, #ДЕЛ/0!, #ЧИСЛО!, #ИМЯ? или #ПУСТО!).
В противном случае функция ЕОШИБКА возвращает ЛОЖЬ.
Применение
- Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000
Тип функции
- Функция рабочего листа (WS)
- Функция VBA
Пример (как функция рабочего листа)
Рассмотрим несколько примеров функции ЕОШИБКА, чтобы понять, как использовать Excel функцию ЕОШИБКА в качестве функции рабочего листа в Microsoft Excel:
На основании, приведенной выше электронной таблицы Excel функция ЕОШИБКА вернет ИСТИНА, поскольку ячейка C2 содержит ошибку #ДЕЛ/0!:
=ЕОШИБКА(C2) Результат: ИСТИНА |
Однако функция ЕОШИБКА в ячейке E3 вернет ЛОЖЬ, потому что C3 содержит значение $0.50 и не является ошибкой:
=ЕОШИБКА(C3) Результат: ЛОЖЬ |
ЕОШИБКА не должна просто смотреть на значение в ячейке, вы также можете использовать функцию ЕОШИБКА для проверки результата формулы, например:
=ЕОШИБКА(9.75/0) Результат: ИСТИНА |
Если вы проверили, было ли деление 9,75 на 0 ошибкой, функция ЕОШИБКА также вернет ИСТИНА, поскольку эта формула вернет ошибку #ДЕЛ/0!.
См. еще примеры функции ЕОШИБКА:
как подсчитать ячейки, содержащие ошибки
как подсчитать ячейки, которые не содержат ошибок.
Затем рассмотрим пример использования функции ISERROR в коде Excel VBA. В нашем примере электронной таблицы мы создали кнопку на Листе2, которая называется «Содержит ли ячейка A2 ошибку?».
Когда мы нажимаем на эту кнопку, запускается следующий код VBA:
Sub TestIsErrorFunction() ‘Отображение функции IsError для ячейки A2 на Листе2 MsgBox IsError(Лист2.Range(«A2»)), vbOKOnly, «В ячейке A2 есть ошибка?» End Sub |
Этот код VBA отобразит окно сообщения, в котором будет показано, содержит ли значение в ячейке A2 на листе Лист2 ошибку.
Поскольку ячейка A2 на листе Лист2 содержит ошибку #ДЕЛ/0!, в окне сообщения отображается True.
На чтение 8 мин. Просмотров 24k.
Содержание
- Объяснение Type Mismatch Error
- Использование отладчика
- Присвоение строки числу
- Недействительная дата
- Ошибка ячейки
- Неверные данные ячейки
- Имя модуля
- Различные типы объектов
- Коллекция Sheets
- Массивы и диапазоны
- Заключение
Объяснение Type Mismatch Error
Type Mismatch Error VBA возникает при попытке назначить значение между двумя различными типами переменных.
Ошибка отображается как:
run-time error 13 – Type mismatch
Например, если вы пытаетесь поместить текст в целочисленную переменную Long или пытаетесь поместить число в переменную Date.
Давайте посмотрим на конкретный пример. Представьте, что у нас есть переменная с именем Total, которая является длинным целым числом Long.
Если мы попытаемся поместить текст в переменную, мы получим Type Mismatch Error VBA (т.е. VBA Error 13).
Sub TypeMismatchStroka() ' Объявите переменную типа long integer Dim total As Long ' Назначение строки приведет к Type Mismatch Error total = "Иван" End Sub
Давайте посмотрим на другой пример. На этот раз у нас есть переменная ReportDate типа Date.
Если мы попытаемся поместить в эту переменную не дату, мы получим Type Mismatch Error VBA.
Sub TypeMismatchData() ' Объявите переменную типа Date Dim ReportDate As Date ' Назначение числа вызывает Type Mismatch Error ReportDate = "21-22" End Sub
В целом, VBA часто прощает, когда вы назначаете неправильный тип значения переменной, например:
Dim x As Long ' VBA преобразует в целое число 100 x = 99.66 ' VBA преобразует в целое число 66 x = "66"
Тем не менее, есть некоторые преобразования, которые VBA не может сделать:
Dim x As Long ' Type Mismatch Error x = "66a"
Простой способ объяснить Type Mismatch Error VBA состоит в том, что элементы по обе стороны от равных оценивают другой тип.
При возникновении Type Mismatch Error это часто не так просто, как в этих примерах. В этих более сложных случаях мы можем использовать средства отладки, чтобы помочь нам устранить ошибку.
Использование отладчика
В VBA есть несколько очень мощных инструментов для поиска ошибок. Инструменты отладки позволяют приостановить выполнение кода и проверить значения в текущих переменных.
Вы можете использовать следующие шаги, чтобы помочь вам устранить любую Type Mismatch Error VBA.
- Запустите код, чтобы появилась ошибка.
- Нажмите Debug в диалоговом окне ошибки. Это выделит строку с ошибкой.
- Выберите View-> Watch из меню, если окно просмотра не видно.
- Выделите переменную слева от equals и перетащите ее в окно Watch.
- Выделите все справа от равных и перетащите его в окно Watch.
- Проверьте значения и типы каждого.
- Вы можете сузить ошибку, изучив отдельные части правой стороны.
Следующее видео показывает, как это сделать.
На скриншоте ниже вы можете увидеть типы в окне просмотра.
Используя окно просмотра, вы можете проверить различные части строки кода с ошибкой. Затем вы можете легко увидеть, что это за типы переменных.
В следующих разделах показаны различные способы возникновения Type Mismatch Error VBA.
Присвоение строки числу
Как мы уже видели, попытка поместить текст в числовую переменную может привести к Type Mismatch Error VBA.
Ниже приведены некоторые примеры, которые могут вызвать ошибку:
Sub TextErrors() ' Long - длинное целое число Dim l As Long l = "a" ' Double - десятичное число Dim d As Double d = "a" ' Валюта - 4-х значное число Dim c As Currency c = "a" Dim d As Double ' Несоответствие типов, если ячейка содержит текст d = Range("A1").Value End Sub
Недействительная дата
VBA очень гибок в назначении даты переменной даты. Если вы поставите месяц в неправильном порядке или пропустите день, VBA все равно сделает все возможное, чтобы удовлетворить вас.
В следующих примерах кода показаны все допустимые способы назначения даты, за которыми следуют случаи, которые могут привести к Type Mismatch Error VBA.
Sub DateMismatch() Dim curDate As Date ' VBA сделает все возможное для вас ' - Все они действительны curDate = "12/12/2016" curDate = "12-12-2016" curDate = #12/12/2016# curDate = "11/Aug/2016" curDate = "11/Augu/2016" curDate = "11/Augus/2016" curDate = "11/August/2016" curDate = "19/11/2016" curDate = "11/19/2016" curDate = "1/1" curDate = "1/2016" ' Type Mismatch Error curDate = "19/19/2016" curDate = "19/Au/2016" curDate = "19/Augusta/2016" curDate = "August" curDate = "Какой-то случайный текст" End Sub
Ошибка ячейки
Тонкая причина Type Mismatch Error VBA — это когда вы читаете из ячейки с ошибкой, например:
Если вы попытаетесь прочитать из этой ячейки, вы получите Type Mismatch Error.
Dim sText As String ' Type Mismatch Error, если ячейка содержит ошибку sText = Sheet1.Range("A1").Value
Чтобы устранить эту ошибку, вы можете проверить ячейку с помощью IsError следующим образом.
Dim sText As String If IsError(Sheet1.Range("A1").Value) = False Then sText = Sheet1.Range("A1").Value End If
Однако проверка всех ячеек на наличие ошибок невозможна и сделает ваш код громоздким. Лучший способ — сначала проверить лист на наличие ошибок, а если ошибки найдены, сообщить об этом пользователю.
Вы можете использовать следующую функцию, чтобы сделать это:
Function CheckForErrors(rg As Range) As Long On Error Resume Next CheckForErrors = rg.SpecialCells(xlCellTypeFormulas, xlErrors).Count End Function
Ниже приведен пример использования этого кода.
Sub DoStuff() If CheckForErrors(Sheet1.Range("A1:Z1000")) > 0 Then MsgBox "На листе есть ошибки. Пожалуйста, исправьте и запустите макрос снова." Exit Sub End If ' Продолжайте здесь, если нет ошибок End Sub
Неверные данные ячейки
Как мы видели, размещение неверного типа значения в переменной вызывает Type Mismatch Error VBA. Очень распространенная причина — это когда значение в ячейке имеет неправильный тип.
Пользователь может поместить текст, такой как «Нет», в числовое поле, не осознавая, что это приведет к Type Mismatch Error в коде.
Если мы прочитаем эти данные в числовую переменную, то получим
Type Mismatch Error VBA.
Dim rg As Range Set rg = Sheet1.Range("B2:B5") Dim cell As Range, Amount As Long For Each cell In rg ' Ошибка при достижении ячейки с текстом «Нет» Amount = cell.Value Next rg
Вы можете использовать следующую функцию, чтобы проверить наличие нечисловых ячеек, прежде чем использовать данные.
Function CheckForTextCells(rg As Range) As Long ' Подсчет числовых ячеек If rg.Count = rg.SpecialCells(xlCellTypeConstants, xlNumbers).Count Then CheckForTextCells = True End If End Function
Вы можете использовать это так:
Sub IspolzovanieCells() If CheckForTextCells(Sheet1.Range("B2:B6").Value) = False Then MsgBox "Одна из ячеек не числовая. Пожалуйста, исправьте перед запуском макроса" Exit Sub End If ' Продолжайте здесь, если нет ошибок End Sub
Имя модуля
Если вы используете имя модуля в своем коде, это может привести к
Type Mismatch Error VBA. Однако в этом случае причина может быть не очевидной.
Например, допустим, у вас есть модуль с именем «Module1». Выполнение следующего кода приведет к о
Type Mismatch Error VBA.
Sub IspolzovanieImeniModulya() ' Type Mismatch Error Debug.Print module1 End Sub
Различные типы объектов
До сих пор мы рассматривали в основном переменные. Мы обычно называем переменные основными типами данных.
Они используются для хранения одного значения в памяти.
В VBA у нас также есть объекты, которые являются более сложными. Примерами являются объекты Workbook, Worksheet, Range и Chart.
Если мы назначаем один из этих типов, мы должны убедиться, что назначаемый элемент является объектом того же типа. Например:
Sub IspolzovanieWorksheet() Dim wk As Worksheet ' действительный Set wk = ThisWorkbook.Worksheets(1) ' Type Mismatch Error ' Левая сторона - это worksheet - правая сторона - это workbook Set wk = Workbooks(1) End Sub
Коллекция Sheets
В VBA объект рабочей книги имеет две коллекции — Sheets и Worksheets. Есть очень тонкая разница.
- Worksheets — сборник рабочих листов в Workbook
- Sheets — сборник рабочих листов и диаграммных листов в Workbook
Лист диаграммы создается, когда вы перемещаете диаграмму на собственный лист, щелкая правой кнопкой мыши на диаграмме и выбирая «Переместить».
Если вы читаете коллекцию Sheets с помощью переменной Worksheet, она будет работать нормально, если у вас нет рабочей таблицы.
Если у вас есть лист диаграммы, вы получите
Type Mismatch Error VBA.
В следующем коде Type Mismatch Error появится в строке «Next sh», если рабочая книга содержит лист с диаграммой.
Sub SheetsError() Dim sh As Worksheet For Each sh In ThisWorkbook.Sheets Debug.Print sh.Name Next sh End Sub
Массивы и диапазоны
Вы можете назначить диапазон массиву и наоборот. На самом деле это очень быстрый способ чтения данных.
Sub IspolzovanieMassiva() Dim arr As Variant ' Присвойте диапазон массиву arr = Sheet1.Range("A1:B2").Value ' Выведите значение в строку 1, столбец 1 Debug.Print arr(1, 1) End Sub
Проблема возникает, если ваш диапазон имеет только одну ячейку. В этом случае VBA не преобразует arr в массив.
Если вы попытаетесь использовать его как массив, вы получите
Type Mismatch Error .
Sub OshibkaIspolzovanieMassiva() Dim arr As Variant ' Присвойте диапазон массиву arr = Sheet1.Range("A1").Value ' Здесь будет происходить Type Mismatch Error Debug.Print arr(1, 1) End Sub
В этом сценарии вы можете использовать функцию IsArray, чтобы проверить, является ли arr массивом.
Sub IspolzovanieMassivaIf() Dim arr As Variant ' Присвойте диапазон массиву arr = Sheet1.Range("A1").Value ' Здесь будет происходить Type Mismatch Error If IsArray(arr) Then Debug.Print arr(1, 1) Else Debug.Print arr End If End Sub
Заключение
На этом мы завершаем статью об Type Mismatch Error VBA. Если у вас есть ошибка несоответствия, которая не раскрыта, пожалуйста, дайте мне знать в комментариях.
На чтение 25 мин. Просмотров 16.4k.
Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.
Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.
Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.
Содержание
- Краткое руководство по обработке ошибок
- Введение
- Ошибки VBA
- Заявление об ошибке
- Err объект
- Логирование
- Другие элементы, связанные с ошибками
- Простая стратегия обработки ошибок
- Полная стратегия обработки ошибок
- Обработка ошибок в двух словах
Краткое руководство по обработке ошибок
Пункт | Описание |
On Error Goto 0 | При возникновении ошибки код останавливается и отображает ошибку. |
On Error Resume Next | Игнорирует ошибку и продолжает. |
On Error Goto [Label] | Переход к определенной метке при возникновении ошибки. Это позволяет нам справиться с ошибкой. |
Err Object | При возникновении ошибки информация об ошибке сохраняется здесь. |
Err.Number | Номер ошибки. (Полезно, только если вам нужно проверить, произошла ли конкретная ошибка.) |
Err.Description | Содержит текст ошибки. |
Err.Source | Вы можете заполнить это, когда используете Err.Raise. |
Err.Raise | Функция, которая позволяет генерировать вашу собственную ошибку. |
Error Function | Возвращает текст ошибки из номера ошибки. Вышло из употребления. |
Error Statement | Имитирует ошибку. Вместо этого используйте Err.Raise. |
Введение
Обработка ошибок относится к коду, который написан для обработки ошибок, возникающих во время работы вашего приложения. Эти ошибки обычно вызваны чем-то вне вашего контроля, например отсутствующим файлом, недоступностью базы данных, недействительными данными и т.д.
Если мы считаем, что ошибка может произойти в какой-то
момент, рекомендуется написать специальный код для обработки ошибки, если она
возникнет, и устранить ее.
Для всех остальных ошибок мы используем общий код для их
устранения. Это где оператор обработки ошибок VBA вступает в игру. Они
позволяют нашему приложению корректно обрабатывать любые ошибки, которые мы не
ожидали.
Чтобы понять обработку ошибок, мы должны сначала понять
различные типы ошибок в VBA.
Ошибки VBA
В VBA есть три типа ошибок
- Синтаксис
- Компиляция
- Время выполнения
Мы используем обработку ошибок для устранения ошибок во
время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было
ясно, что такое ошибка во время выполнения.
Синтаксические ошибки
Если вы использовали VBA в течение какого-то времени, вы
увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return,
VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.
Например, если вы введете If и забудете ключевое слово Then,
VBA отобразит следующее сообщение об ошибке.
Некоторые примеры синтаксических ошибок
' then отсутствует If a > b ' не хватает = после i For i 2 To 7 ' отсутствует правая скобка b = left("АБВГ",1
Синтаксические ошибки относятся только к одной строке. Они
возникают, когда синтаксис одной строки неверен.
Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.
Ошибки компиляции
Ошибки компиляции происходят более чем в одной строке.
Синтаксис в одной строке правильный, но неверный, если учесть весь код проекта.
Примеры ошибок компиляции:
- Оператор If без соответствующего оператора End If
- For без Next
- Select без End Select
- Вызов Sub или Function, которые не существуют
- Вызов Sub или Function с неверными параметрами
- Присвоение Sub или Function того же имени, что и для модуля
- Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)
На следующем снимке экрана показана ошибка компиляции,
которая возникает, когда цикл For не имеет соответствующего оператора Next.
Использование Debug-> Compile
Чтобы найти ошибки компиляции, мы используем Debug->
Compile VBA Project из меню Visual Basic.
Когда вы выбираете Debug-> Compile, VBA отображает первую
обнаруженную ошибку.
Когда эта ошибка исправлена, вы можете снова запустить
Compile, и VBA найдет следующую ошибку.
Debug-> Compile также будет включать синтаксические
ошибки в поиск, что очень полезно.
Если ошибок не осталось и вы запускаете Debug-> Compile,
может показаться, что ничего не произошло. Однако «Компиляция» будет недоступна
в меню «Отладка». Это означает, что ваше приложение не имеет ошибок компиляции
в текущий момент.
Debug->Compile Error Summary
Debug-> Compile находит ошибки компиляции (проекта).
Он также найдет синтаксические ошибки.
Он находит одну ошибку каждый раз, когда вы ее используете.
Если нет ошибок компиляции, оставленная опция Компиляция
будет отображаться серым цветом в меню.
Debug-> Compile Usage
Вы должны всегда использовать Debug-> Compile, прежде чем
запускать свой код. Это гарантирует, что ваш код не будет иметь ошибок
компиляции при запуске.
Если вы не запускаете Debug-> Compile, то VBA может
обнаружить ошибки компиляции при запуске. Их не следует путать с ошибками
времени выполнения.
Ошибки во время выполнения
Ошибки во время выполнения возникают, когда ваше приложение
работает. Обычно они находятся вне вашего контроля, но могут быть вызваны
ошибками в вашем коде.
Например, представьте, что ваше приложение читает из внешней
рабочей книги. Если этот файл будет удален, то VBA отобразит ошибку, когда ваш
код попытается открыть его.
Другие примеры ошибок времени выполнения
- база данных недоступна
- пользователь вводит неверные данные
- ячейка, содержащая текст вместо числа
Как мы уже видели, целью обработки ошибок является обработка
ошибок времени выполнения, когда они возникают.
Ожидаемые и неожиданные ошибки
Когда мы думаем, что может произойти ошибка во время
выполнения, мы помещаем код на место для ее обработки. Например, мы обычно
помещаем код на место, чтобы иметь дело с файлом, который не найден.
Следующий код проверяет, существует ли файл, прежде чем он
пытается его открыть. Если файл не существует, отображается сообщение, удобное
для пользователя, и код выходит из подпрограммы.
Sub OtkritFail() Dim sFile As String sFile = "C:ДокументыОтчет.xlsx" ' Используйте Dir, чтобы проверить, существует ли файл If Dir(sFile) = "" Then ' если файл не существует, отобразить сообщение MsgBox "Файл не найден" & sFile Exit Sub End If ' Код достигнет только если файл существует Workbooks.Open sFile End Sub
Когда мы думаем, что в какой-то момент может произойти
ошибка, рекомендуется добавить код для обработки ситуации. Мы обычно называем
эти ошибки ожидаемыми.
Если у нас нет специального кода для обработки ошибки, это
считается неожиданной ошибкой. Мы используем операторы обработки ошибок VBA для
обработки непредвиденных ошибок.
Ошибки времени выполнения, которые не являются ошибками VBA
Прежде чем мы рассмотрим VBA Handling, мы должны упомянуть
один тип ошибок. Некоторые ошибки во время выполнения не рассматриваются как
ошибки VBA, а только пользователем.
Позвольте мне объяснить это на примере. Представьте, что у
вас есть приложение, которое требует, чтобы вы добавили значения в переменные a
и b
Допустим, вы по ошибке используете звездочку вместо знака
плюс
Это не ошибка VBA. Ваш синтаксис кода является совершенно
законным. Однако, с вашей точки зрения, это ошибка.
Эти ошибки не могут быть обработаны с помощью обработки ошибок, поскольку они, очевидно, не будут генерировать никаких ошибок. Вы можете справиться с этими ошибками, используя Unit Testing and Assertions.
Заявление об ошибке
Как мы видели, есть два способа обработки ошибок во время
выполнения
- Ожидаемые ошибки — напишите конкретный код для
их обработки. - Неожиданные ошибки — используйте операторы
обработки ошибок VBA для их обработки.
Оператор VBA On Error используется для обработки ошибок.
Этот оператор выполняет некоторые действия при возникновении ошибки во время
выполнения.
Есть четыре различных способа использовать это утверждение
- On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
- On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
- On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
- On Error Goto -1 — очищает текущую ошибку.
Давайте посмотрим на каждое из этих утверждений по очереди.
On Error Goto 0
Это поведение по умолчанию VBA. Другими словами, если вы не
используете On Error, это поведение вы увидите.
При возникновении ошибки VBA останавливается на строке с
ошибкой и отображает сообщение об ошибке. Приложение требует вмешательства
пользователя с кодом, прежде чем оно сможет продолжить. Это может быть
исправление ошибки или перезапуск приложения. В этом случае обработка ошибок не
происходит.
Давайте посмотрим на пример. В следующем коде мы не
использовали строку On Error, поэтому VBA будет использовать поведение On Error
Goto 0 по умолчанию.
Sub IspDefault() Dim x As Long, y As Long x = 6 y = 6 / 0 x = 7 End Sub
Вторая строка присваивания приводит к ошибке деления на ноль. Когда мы запустим этот код, мы получим сообщение об ошибке, показанное на скриншоте ниже.
Когда появляется ошибка, вы можете выбрать End или Debug
Если вы выберете Конец, то приложение просто остановится.
Если вы выберете Отладить, приложение остановится на строке
ошибки, как показано на скриншоте ниже.
Это нормально, когда вы пишете код VBA, поскольку он
показывает вам точную строку с ошибкой.
Это поведение не подходит для приложения, которое вы
передаете пользователю. Эти ошибки выглядят непрофессионально и делают
приложение нестабильным.
Подобная ошибка, по сути, приводит к сбою приложения.
Пользователь не может продолжить работу без перезапуска приложения. Они могут
вообще не использовать его, пока вы не исправите для них ошибку.
Используя On Error Goto [label], мы можем дать пользователю
более контролируемое сообщение об ошибке. Это также предотвращает остановку
приложения. Мы можем заставить приложение работать предопределенным образом.
On Error Resume Next
Использование On Error Resume Next указывает VBA
игнорировать ошибку и продолжать работу.
Есть конкретные случаи, когда это полезно. Большую часть
времени вы должны избегать его использования.
Если мы добавим Resume Next к нашему примеру Sub, то VBA
проигнорирует ошибку деления на ноль
Sub UsingResumeNext() On Error Resume Next Dim x As Long, y As Long x = 6 y = 6 / 0 x = 7 End Sub
Это не очень хорошая идея, чтобы сделать это. Если вы
игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может
повлиять на приложение несколькими способами. Вы можете получить неверные
данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что
вы подавили ошибку.
Приведенный ниже код является примером использования Resume
Next.
Sub OtprSoobsch() On Error Resume Next ' Требуется ссылка: ' Библиотека объектов Microsoft Outlook 15.0 Dim Outlook As Outlook.Application Set Outlook = New Outlook.Application If Outlook Is Nothing Then MsgBox " Не удается создать сеанс Microsoft Outlook." _ & " Письмо не будет отправлено." Exit Sub End If End Sub
В этом коде мы проверяем, доступен ли Microsoft Outlook на компьютере. Все,
что мы хотим знать — это доступно или нет. Нас не интересует конкретная ошибка.
В приведенном выше коде мы продолжаем, если есть ошибка.
Затем в следующей строке мы проверяем значение переменной Outlook. Если произошла ошибка, тогда
значение этой переменной будет установлено равным Nothing.
Это пример того, когда Резюме может быть полезным. Дело в
том, что, хотя мы используем Resume,
мы все равно проверяем наличие ошибки. Подавляющее большинство времени вам не
нужно будет использовать Resume.
On Error Goto [label]
Вот как мы используем обработку ошибок в VBA. Это эквивалент функциональности Try and Catch, которую вы видите на
таких языках, как C # и
Java.
При возникновении ошибки вы отправляете ошибку на
определенный ярлык. Обычно это внизу саба.
Давайте применим это к подводной лодке, которую мы
использовали
Sub IspGotoLine() On Error Goto eh Dim x As Long, y As Long x = 6 y = 6 / 0 x = 7 Done: Exit Sub eh: MsgBox "Произошла следующая ошибка: " & Err.Description End Sub
Снимок экрана ниже показывает, что происходит при возникновении ошибки.
VBA переходит на метку eh, потому что мы указали это в
строке «Перейти к ошибке».
Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.
Примечание 2: Когда возникает ошибка при использовании On Error Goto [label], обработка ошибок возвращается к поведению по умолчанию, т.е. код остановится на строке с ошибкой и отобразит сообщение об ошибке. См. Следующий раздел для получения дополнительной информации об этом.
On Error Goto -1
Это утверждение отличается от других трех. Он используется
для очистки текущей ошибки, а не для настройки конкретного поведения.
При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.
Это поведение относится только к текущей подпрограмме. Как
только мы выйдем из саба, ошибка будет очищена автоматически.
Посмотрите на код ниже. Первая ошибка приведет к переходу
кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.
Sub DveOshibki() On Error Goto eh ' генерировать ошибку «Несоответствие типов» Error (13) Done: Exit Sub eh: ' генерировать «определенную приложением» ошибку Error (1034) End Sub
Если мы добавим дальнейшую обработку ошибок, она не будет
работать, поскольку ловушка ошибок не была очищена.
В коде ниже мы добавили строку
после того как мы поймаем первую ошибку.
Это не имеет никакого эффекта, так как ошибка не была
очищена. Другими словами, код остановится на строке с ошибкой и отобразит
сообщение.
Sub DveOshibki() On Error Goto eh ' генерировать ошибку «Несоответствие типов» Error (13) Done: Exit Sub eh: On Error Goto eh_other ' генерировать «определенную приложением» ошибку Error (1034) Exit Sub eh_other: Debug.Print "ehother " & Err.Description End Sub
Для устранения ошибки мы используем On Error Goto -1.
Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам
нужно установить ее снова.
В приведенном ниже коде мы добавляем эту строку, и вторая
ошибка теперь приведет к переходу кода на метку eh_other.
Sub DveOshibki() On Error Goto eh ' генерировать ошибку «Несоответствие типов» Error (13) Done: Exit Sub eh: ' явная ошибка On Error Goto -1 On Error Goto eh_other ' генерировать «определенную приложением» ошибку Error (1034) Exit Sub eh_other: Debug.Print "ehother " & Err.Description End Sub
Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.
Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.
Использование On Error
Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:
- Остановитесь и отобразите ошибку.
- Игнорируйте ошибку и продолжайте.
- Перейти к определенной строке.
VBA всегда будет настроен на одно из этих действий. Когда вы
используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.
В следующем подпункте VBA изменяет поведение ошибки каждый
раз, когда мы используем оператор On Error
Sub ErrorSostoyaniya() Dim x As Long ' Перейти на этикетке, если ошибка On Error Goto eh ' это проигнорирует ошибку в следующей строке On Error Resume Next x = 1 / 0 ' это отобразит сообщение об ошибке в следующей строке On Error Goto 0 x = 1 / 0 Done: Exit Sub eh: Debug.Print Err.Description End Sub
Err объект
При возникновении ошибки вы можете просмотреть детали
ошибки, используя объект Err.
При возникновении ошибки времени выполнения VBA
автоматически заполняет объект Err деталями.
Приведенный ниже код выведет «Error Number: 13 Type
Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в
длинное целое число.
Sub IspErr() On Error Goto eh Dim total As Long total = "aa" Done: Exit Sub eh: Debug.Print "Номер ошибки: " & Err.Number _ & " " & Err.Description End Sub
Err.Description предоставляет подробную информацию об ошибке, которая происходит. Это текст, который вы обычно видите, когда возникает ошибка, например, «Несоответствие типов»
Err.Number — это идентификационный номер ошибки, например, номер ошибки для «Несоответствие типов» — 13. Единственное время, когда вам действительно нужно это, если вы проверяете, что произошла конкретная ошибка, и это необходимо только в редких случаях.
Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.
Получение номера строки
Функция Erl используется для возврата номера строки, где
произошла ошибка.
Это часто вызывает путаницу. В следующем коде Erl вернет ноль.
Sub IspErr() On Error Goto eh Dim val As Long val = "aa" Done: Exit Sub eh: Debug.Print Erl End Sub
Это потому, что нет номеров строк. Большинство людей не
понимают этого, но VBA позволяет вам иметь номера строк.
Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.
Sub IspErr() 10 On Error Goto eh Dim val As Long 20 val = "aa" Done: 30 Exit Sub eh: 40 Debug.Print Erl End Sub
Добавление номеров строк в код вручную затруднительно.
Однако есть инструменты, которые позволят вам легко добавлять и удалять номера
строк в подпрограмме.
Когда вы закончите работу над проектом и передадите его
пользователю, в этот момент может быть полезно добавить номера строк. Если вы
используете стратегию обработки ошибок в последнем разделе этого поста, то VBA
сообщит строку, где произошла ошибка.
Использование Err.Raise
Err.Raise позволяет нам создавать ошибки. Мы можем
использовать его для создания пользовательских ошибок для нашего приложения,
что очень полезно. Это эквивалент оператора Throw в Java C #.
Формат следующий
Err.Raise [error number], [error source], [error description]
Давайте посмотрим на простой пример. Представьте, что мы
хотим убедиться, что в ячейке есть запись длиной 5 символов. Мы могли бы иметь конкретное сообщение для
этого
Public Const ERROR_INVALID_DATA As Long = vbObjectError + 513 Sub ReadWorksheet() On Error Goto eh If Len(Sheet1.Range("A1")) <> 5 Then Err.Raise ERROR_INVALID_DATA, "ReadWorksheet" _ , "Значение в ячейке A1 должно иметь ровно 5 символов." End If ' продолжить, если ячейка имеет действительные данные Dim id As String id = Sheet1.Range("A1") Done: Exit Sub eh: ' Err.Raise отправит код сюда MsgBox " Обнаружена ошибка: " & Err.Description End Sub
Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое
число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером,
например
Err.Raise vbObjectError + 513
Использование Err.Clear
Err.Clear используется для очистки текста и чисел из объекта
Err.Object. Другими словами, он очищает описание и номер.
Редко вам понадобится его использовать, но давайте
рассмотрим пример, где вы могли бы.
В приведенном ниже коде мы подсчитываем количество ошибок,
которые могут возникнуть. Для простоты мы генерируем ошибку для каждого
нечетного числа.
Мы проверяем номер ошибки каждый раз, когда проходим цикл.
Если число не равно нулю, то произошла ошибка. Как только мы посчитаем ошибку,
нам нужно установить номер ошибки на ноль, чтобы он был готов проверить
следующую ошибку.
Sub IspErrClear() Dim count As Long, i As Long ' Продолжите, если ошибка, так как мы проверим номер ошибки On Error Resume Next For i = 0 To 9 ' генерировать ошибку для каждого второго If i Mod 2 = 0 Then Error (13) ' Проверьте на ошибку If Err.Number <> 0 Then count = count + 1 Err.Clear ' Очистить Err, как только он считается End If Next Debug.Print " Количество ошибок было: " & count End Sub
Примечание: Err.Clear сбрасывает текст и цифры в объекте ошибки, но не очищает ошибку — см. On Error Goto -1 для получения дополнительной информации об очистке фактической ошибки.
Логирование
Ведение журнала означает запись информации из вашего
приложения, когда оно запущено. При возникновении ошибки вы можете записать
детали в текстовый файл, чтобы у вас была запись об ошибке.
Код ниже показывает очень простую процедуру регистрации
Sub Logger(sType As String, sSource As String, sDetails As String) Dim sFilename As String sFilename = "C:templogging.txt" ' Архивный файл определенного размера If FileLen(sFilename) > 20000 Then FileCopy sFilename _ , Replace(sFilename, ".txt", Format(Now, "ddmmyyyy hhmmss.txt")) Kill sFilename End If ' Откройте файл для записи Dim filenumber As Variant filenumber = FreeFile Open sFilename For Append As #filenumber Print #filenumber, CStr(Now) & "," & sType & "," & sSource _ & "," & sDetails & "," & Application.UserName Close #filenumber End Sub
Вы можете использовать это так:
' Создать уникальный номер ошибки Public Const ERROR_DATA_MISSING As Long = vbObjectError + 514 Sub CreateReport() On Error Goto eh If Sheet1.Range("A1") = "" Then Err.Raise ERROR_DATA_MISSING, "CreateReport", "Данные отсутствуют в ячейке A1" End If ' другой код здесь Done: Exit Sub eh: Logger "Error", Err.Source, Err.Description End Sub
Журнал не только для записи ошибок. Вы можете записывать
другую информацию во время работы приложения. При возникновении ошибки вы
можете проверить последовательность событий до того, как произошла ошибка.
Ниже приведен пример регистрации. То, как вы реализуете
журналирование, зависит от характера приложения и его полезности.
Sub ReadingData() Logger "Information", "ReadingData()", "Starting to read data." Dim coll As New Collection ' Read data Set coll = ReadData If coll.Count < 10 Then Logger "Warning", "ReadingData()", "Number of data items is low." End If Logger "Information", "ReadingData()", "Number of data items is " & coll.Count Logger "Information", "ReadingData()", "Finished reading data." End Sub
Наличие большого количества информации при работе с ошибкой
может быть очень полезным. Часто пользователь может не дать вам точную информацию
об ошибке, которая произошла. Глядя на журнал, вы можете получить более точную
информацию об информации.
Другие элементы, связанные с ошибками
В этом разделе рассматриваются некоторые другие инструменты
обработки ошибок, которые есть в VBA. Эти элементы считаются устаревшими, но я
включил их, поскольку они могут существовать в устаревшем коде.
Функция ошибки
Функция Error используется для печати описания ошибки с
заданным номером ошибки. Он включен в VBA для обеспечения обратной
совместимости и не нужен, поскольку вместо него можно использовать описание
Err.Description.
Ниже приведены некоторые примеры
' Распечатать текст «Деление на ноль» Debug.Print Error(11) ' Распечатать текст "Несоответствие типов" Debug.Print Error(13) ' Распечатать текст "Файл не найден" Debug.Print Error(53)
Заявление об ошибке
Заявление об ошибке позволяет имитировать ошибку. Он включен
в VBA для обратной совместимости. Вместо этого вы должны использовать
Err.Raise.
В следующем коде мы моделируем ошибку «Разделить на ноль».
Sub ZayavlObOshibke() On Error Goto eh ' Это создаст деление на ноль ошибок Error 11 Exit Sub eh: Debug.Print Err.Number, Err.Description End Sub
Это утверждение включено в VBA для обратной совместимости.
Вместо этого вы должны использовать Err.Raise.
Простая стратегия обработки ошибок
Со всеми различными опциями вы можете быть озадачены тем,
как использовать обработку ошибок в VBA. В этом разделе я покажу вам, как
реализовать простую стратегию обработки ошибок, которую вы можете использовать
во всех своих приложениях.
Основная реализация
Это простой обзор нашей стратегии
- Поместите строку On Error Goto Label в начале нашего верхнего Sub.
- Поместите Label у обработки ошибок в конце нашего верхнего
Sub. - Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
- Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
- В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.
На следующем рисунке показан обзор того, как это выглядит
Следующий код показывает простую реализацию этой стратегии
Public Const ERROR_NO_ACCOUNTS As Long = vbObjectError + 514 Sub BuildReport() On Error Goto eh ' Если ошибка в ReadAccounts, то перейти к ошибке ReadAccounts ' Сделай что-нибудь с кодом Done: Exit Sub eh: ' Все ошибки будут прыгать сюда MsgBox Err.Source & ": Произошла следующая ошибка " & Err.Description End Sub Sub ReadAccounts() ' ОЖИДАЕМАЯ ОШИБКА - Может обрабатываться кодом ' Приложение может обрабатывать A1 равным нулю If Sheet1.Range("A1") = 0 Then Sheet1.Range("A1") = 1 End If ' ОЖИДАЕМАЯ ОШИБКА - не может быть обработана кодом ' Приложение не может быть продолжено, если нет учетной записи If Dir("C:ДокументыОтчет.xlsx") = "" Then Err.Raise ERROR_NO_ACCOUNTS, "UsingErr" _ , "There are no accounts present for this month." End If ' НЕОЖИДАННАЯ ОШИБКА - не может быть обработана кодом ' Если ячейка B3 содержит текст, мы получим ошибку несоответствия типов Dim total As Long total = Sheet1.Range("B3") ' продолжить и читать счета End Sub
Это хороший способ реализации обработки ошибок, потому что
- Нам не нужно добавлять код обработки ошибок в
каждую подпрограмму. - Если возникает ошибка, то VBA корректно
завершает работу приложения.
Полная стратегия обработки ошибок
Стратегия выше имеет один недостаток. Он не сообщает вам,
где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы
должны сделать это сами.
В этом разделе я собираюсь представить более полную
стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую
работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.
Целью этой стратегии является предоставление вам стека * и
номера строки в случае возникновения ошибки.
* Стек — это список вспомогательных функций, которые
использовались в данный момент при возникновении ошибки.
Это наша стратегия
- Разместите обработку ошибок во всех
подпрограммах. - Когда происходит ошибка, обработчик ошибок
добавляет подробности к ошибке и вызывает ее снова. - Когда ошибка достигает самой верхней
подпрограммы, она отображается.
Мы просто «всплываем» из-за ошибки. Следующая диаграмма
показывает простое визуальное представление о том, что происходит, когда в Sub3
возникает ошибка
Единственная грязная часть этого — правильное форматирование
строк. Я написал две подводные лодки, которые справляются с этим, поэтому он
позаботится о вас.
Это две вспомогательные подводные лодки
Option Explicit Public Const MARKER As String = "NOT_TOPMOST" ' Вызывает ошибку и добавляет номер строки и имя текущей процедуры Sub RaiseError(ByVal errorno As Long, ByVal src As String _ , ByVal proc As String, ByVal desc As String, ByVal lineno As Long) Dim sLineNo As Long, sSource As String ' Если маркера нет, тогда RaiseError вызывается впервые. If Left(src, Len(MARKER)) <> MARKER Then ' Добавить номер строки ошибки, если она есть If lineno <> 0 Then sSource = vbCrLf & "Line no: " & lineno & " " End If ' Добавить маркер и процедуру к источнику sSource = MARKER & sSource & vbCrLf & proc Else ' Если ошибка уже возникла, просто добавьте имя процедуры sSource = src & vbCrLf & proc End If ' Если код останавливается здесь, убедитесь, что DisplayError находится в верхней части Sub Err.Raise errorno, sSource, desc End Sub ' Отображает ошибку, когда она достигает самого верхнего sub ' Примечание: вы можете добавить вызов для входа из этого подпункта Sub DisplayError(ByVal src As String, ByVal desc As String _ , ByVal sProcname As String) ' Удалить маркер src = Replace(src, MARKER, "") Dim sMsg As String sMsg = " Произошла следующая ошибка: " & vbCrLf & Err.Description _ & vbCrLf & vbCrLf & " Расположение ошибки: " sMsg = sMsg + src & vbCrLf & sProcname ' Показать сообщение MsgBox sMsg, Title:="Ошибка " End Sub
Пример использования этой стратегии
Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.
Sub Topmost() On Error Goto EH Level1 Done: Exit Sub EH: DisplayError Err.source, Err.Description, "Module1.Topmost" End Sub Sub Level1() On Error Goto EH Level2 Done: Exit Sub EH: RaiseError Err.Number, Err.source, "Module1.Level1", Err.Description, Erl End Sub Sub Level2() On Error Goto EH ' Ошибка здесь Dim a As Long a = "7 / 0" Done: Exit Sub EH: RaiseError Err.Number, Err.source, "Module1.Level2", Err.Description, Erl End Sub
Результат выглядит так
Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.
Примечание: вы можете получить следующую ошибку при использовании этого кода:
“Programmatic Access to Visual Basic Project is not trusted”
Чтобы решить эту проблему, выполните следующие действия.
- Перейдите в раздел «Разработчик» на ленте и
нажмите «Macro Security», которая находится под кодом. - Нажмите «Настройка макроса» в левом списке.
- Поставьте флажок в поле «Доверительный доступ к
объектной модели проекта VBA». - Нажмите Ok.
Обработка ошибок в двух словах
- Обработка ошибок используется для обработки ошибок, возникающих во время работы приложения.
- Вы пишете определенный код для обработки ожидаемых ошибок. Вы используете оператор обработки ошибок VBA
On Error Goto [label] для отправки VBA на метку при возникновении непредвиденной ошибки. - Вы можете получить подробную информацию об ошибке из Err.Description.
- Вы можете создать свою собственную ошибку, используя Err.Raise.
- Использование одного оператора On Error в самой верхней подпрограмме перехватит все ошибки в подпрограммах, которые вызываются отсюда.
- Если вы хотите записать имя Sub с ошибкой, вы можете обновить ошибку и сбросить ее.
- Вы можете использовать журнал для записи информации о приложении, когда оно запущено.
Содержание
- Обзор функции ЕСЛИОШИБКА
- Что такое функция ЕСЛИОШИБКА?
- Дополнительные примеры формул ЕСЛИОШИБКА
- ЕСЛИ ОШИБКА в Google Таблицах
- ЕСЛИОШИБКА Примеры в VBA
В этом руководстве показано, как использовать функцию Excel ЕСЛИОШИБКА для обнаружения ошибок формулы, заменяя их другой формулой, пустым значением, 0 или настраиваемым сообщением.
Обзор функции ЕСЛИОШИБКА
Функция ЕСЛИОШИБКА Проверяет, приводит ли формула к ошибке. Если ЛОЖЬ, вернуть исходный результат формулы. Если ИСТИНА, вернуть другое указанное значение.
ЕСЛИОШИБКА Синтаксис
Чтобы использовать функцию таблицы Excel ЕСЛИОШИБКА, выберите ячейку и введите:= ЕСЛИОШИБКА (
Обратите внимание, как появляются входные данные формулы ЕСЛИОШИБКА:
Синтаксис и входные данные функции ЕСЛИОШИБКА:
1 | = ЕСЛИОШИБКА (ЗНАЧЕНИЕ; значение_если_ошибка) |
ценить — Выражение. Пример: 4 / A1
value_if_error — Значение или расчет для выполнения, если предыдущий ввод привел к ошибке. Пример 0 или «» (пусто)
Что такое функция ЕСЛИОШИБКА?
Функция ЕСЛИОШИБКА относится к категории логических функций в Microsoft Excel, которая включает ISNA, ISERROR и ISERR. Все эти функции помогают обнаруживать и обрабатывать ошибки формул.
ЕСЛИОШИБКА позволяет выполнить расчет. Если расчет не приведет к ошибке, затем отобразится результат расчета. Если расчет делает приводит к ошибке, тогда выполняется другое вычисление (или выводится статическое значение, такое как 0, пробел или какой-то текст).
Когда бы вы использовали функцию ЕСЛИОШИБКА?
- При делении чисел во избежание ошибок, связанных с делением на 0
- При выполнении поиска для предотвращения ошибок, если значение не найдено.
- Если вы хотите выполнить другое вычисление, если первое приводит к ошибке (например, поиск значения в 2nd table, если его нет в первой таблице)
Необработанные ошибки формул могут вызвать ошибки в вашей книге, но видимые ошибки также делают вашу электронную таблицу менее привлекательной.
Если ошибка, то 0
Давайте посмотрим на простой пример. Ниже вы делите два числа. Если вы попытаетесь разделить на ноль, вы получите сообщение об ошибке:
Вместо этого вставьте вычисление в функцию ЕСЛИОШИБКА, и если вы разделите на ноль, вместо ошибки будет выведено 0:
1 | = ЕСЛИОШИБКА (A2 / B2; 0) |
Если ошибка, то пусто
Вместо того, чтобы устанавливать для ошибок значение 0, вы можете установить их как «пустые» с двойными кавычками («»):
1 | = ЕСЛИОШИБКА (A2 / B2; «») |
Мы рассмотрим больше случаев использования ЕСЛИОШИБКИ с функцией ВПР …
ЕСЛИ ОШИБКА с ВПР
Функции поиска, такие как VLOOKUP, будут генерировать ошибки, если значение поиска не будет найдено. Как показано выше, вы можете использовать функцию ЕСЛИОШИБКА для замены ошибок пробелами («») или нулями:
1 | = ЕСЛИОШИБКА (ВПР (A2, LookupTable1! $ A $ 2: $ B $ 4,2; FALSE), «не найдено») |
Если ошибка, то сделайте что-нибудь еще
Функцию ЕСЛИОШИБКА также можно использовать для выполнения второго вычисления, если первое вычисление приводит к ошибке:
12 | = ЕСЛИОШИБКА (ВПР (A2; LookupTable1! $ A $ 2: $ B $ 4,2; FALSE),ВПР (A2, LookupTable2! $ A $ 2: $ B $ 4,2, FALSE)) |
Здесь, если данные не найдены в «LookupTable1», вместо этого выполняется ВПР для «LookupTable2».
Дополнительные примеры формул ЕСЛИОШИБКА
Вложенная ЕСЛИОШИБКА — ВПР на нескольких листах
Вы можете вложить ЕСЛИОШИБКУ в другую ЕСЛИОШИБКА, чтобы выполнить 3 отдельных вычисления. Здесь мы будем использовать два IFERROR для выполнения ВПР на 3 отдельных листах:
123 | = ЕСЛИОШИБКА (ВПР (A2; LookupTable1! $ A $ 2: $ B $ 4,2; FALSE),ЕСЛИОШИБКА (ВПР (A2; LookupTable2! $ A $ 2: $ B $ 4,2; FALSE),ВПР (A2, LookupTable3! $ A $ 2: $ B $ 4,2, FALSE))) |
Индекс / соответствие и XLOOKUP
Конечно, IFERROR также будет работать с формулами Index / Match и XLOOKUP.
ЕСЛИ ОШИБКА XLOOKUP
Функция XLOOKUP — это расширенная версия функции VLOOKUP.
1 | = ЕСЛИОШИБКА (XLOOKUP (A2, LookupTable1! $ A $ 2: $ A $ 4, LookupTable1! $ B $ 2: $ B $ 4), «Не найдено») |
ИНДЕКС ЕСЛИ ОШИБКА / СООТВЕТСТВИЕ
ИНДЕКС и ПОИСКПОЗ можно использовать для создания более мощных ВПР (аналогично тому, как работает новая функция XLOOKUP) в Excel.
1 | = ЕСЛИОШИБКА (ИНДЕКС (LookupTable1! $ B $ 2: $ B $ 4, MATCH (A3, LookupTable1! $ A $ 2: $ A $ 4,0)), «Не найдено») |
ЕСЛИОШИБКА в массивах
Формулы массива в Excel используются для выполнения нескольких вычислений с помощью одной формулы. Предположим, есть три столбца: Год, Продажи и Средняя цена. Вы можете узнать общее количество по следующей формуле в столбце E.
1 | {= СУММ ($ B $ 2: $ B $ 4 / $ C $ 2: $ C $ 4)} |
Формула работает хорошо до тех пор, пока она не попытается разделить на ноль, в результате чего получится # DIV / 0! ошибка.
Вы можете использовать функцию ЕСЛИОШИБКА для устранения ошибки следующим образом:
1 | {= СУММ (ЕСЛИОШИБКА ($ B $ 2: $ B $ 4 / $ C $ 2: $ C $ 4,0))} |
Обратите внимание, что функция ЕСЛИОШИБКА должна быть вложена в функцию СУММ, иначе ЕСЛИОШИБКА будет применяться к общей сумме, а не к каждому отдельному элементу в массиве.
IFNA против ЕСЛИ ОШИБКА
Функция IFNA работает точно так же, как функция ЕСЛИОШИБКА, за исключением того, что функция IFNA выявляет только ошибки # Н / Д. Это чрезвычайно полезно при работе с функциями поиска: обычные ошибки формул по-прежнему будут обнаруживаться, но ошибки не появятся, если значение поиска не найдено.
1 | = IFNA (ВПР (A2; LookupTable1! $ A $ 2: $ B $ 4,2; FALSE); «Не найдено») |
Если ISERROR
Если вы все еще используете Microsoft Excel 2003 или более старую версию, вы можете заменить IFERROR комбинацией IF и ISERROR. Вот краткий пример:
1 | = ЕСЛИ (ЕСТЬ ОШИБКА (A2 / B2); 0; A2 / B2) |
Функция ЕСЛИОШИБКА работает в Google Таблицах точно так же, как и в Excel:
ЕСЛИОШИБКА Примеры в VBA
VBA не имеет встроенной функции ЕСЛИОШИБКА, но вы также можете получить доступ к функции ЕСЛИОШИБКА Excel из VBA:
12 | Dim n до тех пор, покаn = Application.WorksheetFunction.IfError (Значение, значение_если_ошибка) |
Application.WorksheetFunction дает вам доступ ко многим (не всем) функциям Excel в VBA.
Обычно ЕСЛИОШИБКА используется при чтении значений из ячеек. Если ячейка содержит ошибку, VBA может выдать сообщение об ошибке при попытке обработать значение ячейки. Попробуйте это с помощью приведенного ниже примера кода (где ячейка B2 содержит ошибку):
1234567891011 | Sub IFERROR_VBA ()Dim n по длине, м по длинеЕСЛИ ОШИБКАn = Application.WorksheetFunction.IfError (Диапазон («b2»). Значение, 0)«Нет ЕСЛИОШИБКИm = Диапазон («b2»). ЗначениеКонец подписки |
Код присваивает ячейку B2 переменной. Второе присвоение переменной вызывает ошибку, потому что значение ячейки # Н / Д, но первое работает нормально из-за функции ЕСЛИОШИБКА.
Вы также можете использовать VBA для создания формулы, содержащей функцию ЕСЛИОШИБКА:
1 | Диапазон («C2»). FormulaR1C1 = «= ЕСЛИОШИБКА (RC [-2] / RC [-1], 0)» |
Обработка ошибок в VBA сильно отличается от обработки ошибок в Excel. Обычно для обработки ошибок в VBA используется обработка ошибок VBA. Обработка ошибок VBA выглядит так:
12345678910111213141516171819 | Sub TestWS ()MsgBox DoesWSExist («тест»)Конец подпискиФункция DoesWSExist (wsName As String) As BooleanDim ws как рабочий листПри ошибке Возобновить ДалееУстановить ws = Sheets (wsName)’Если ошибка WS не существуетЕсли Err.Number 0, тоDoesWSExist = FalseЕщеDoesWSExist = TrueКонец, еслиПри ошибке GoTo -1Конечная функция |
Обратите внимание, что мы используем Если Err.Number 0, то чтобы определить, произошла ли ошибка. Это типичный способ отлова ошибок в VBA. Однако функция ЕСЛИОШИБКА имеет некоторые применения при взаимодействии с ячейками Excel.