Vba excel ошибка в ячейке

 

N1K0

Пользователь

Сообщений: 70
Регистрация: 01.01.1970

Имеется ячейка с формулой, которая может выдавать значения ошибок (#Н/Д и т.п)  
требуется если Ячейка не содержит ошибку Then выполнить код  

  или if Ячейка является числом Then выполнить код  

  помогите!

 

ytk5kyky

Пользователь

Сообщений: 2410
Регистрация: 01.01.1970

If IsNumeric(ячейка.Value) Then  

  Если известен вид ошибки, то можно проверить значение, например, для #Н/Д:  
If ячейка.Value <> «#N/A»  Then  

  Или так:  
If Not Application.WorksheetFunction.IsError(ячейка.Value) Then  
‘IsError = ЕОШИБКА, IsNA = ЕНД

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

Или так: If Not IsError(ActiveCell) Then MsgBox «Нет ошибки»

 

N1K0

Пользователь

Сообщений: 70
Регистрация: 01.01.1970

Перепробовал все способы, работает.  
Спасибо.

 

Здравствуйте. Решил не создавать новую тему а эту освежить, таким вопросом. Как в коде 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  
(Excel не распознаёт этот текст как дату)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Игорь, я так понял из вопроса, надо на конкретную дату проверить, что-то вроде:  
If ActiveCell = #1/1/2011# Then MsgBox «В активной ячейке находится дата!»  
Но может я и ошибаюсь.

Я сам — дурнее всякого примера! …

 

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

Mat's user avatar

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 Hettinger's user avatar

Rachel HettingerRachel Hettinger

7,8322 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

SkipVought's user avatar

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:

  1. Use Excel’s SpecialCells to shortcut the process
  2. 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’)

enter image description here

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

brettdj's user avatar

brettdjbrettdj

54.6k16 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

Gaijinhunter's user avatar

GaijinhunterGaijinhunter

14.5k4 gold badges50 silver badges57 bronze badges

4

На чтение 25 мин. Просмотров 15.6k.

VBA Error Handling

Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.

Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.

Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.

Содержание

  1. Краткое руководство по обработке ошибок
  2. Введение
  3. Ошибки VBA
  4. Заявление об ошибке
  5. Err объект
  6. Логирование
  7. Другие элементы, связанные с ошибками
  8. Простая стратегия обработки ошибок
  9. Полная стратегия обработки ошибок
  10. Обработка ошибок в двух словах

Краткое руководство по обработке ошибок

Пункт Описание
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 Error Handling

Ошибки VBA

В VBA есть три типа ошибок

  1. Синтаксис
  2. Компиляция
  3. Время выполнения

Мы используем обработку ошибок для устранения ошибок во
время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было
ясно, что такое ошибка во время выполнения.

Синтаксические ошибки

Если вы использовали VBA в течение какого-то времени, вы
увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return,
VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.

Например, если вы введете If и забудете ключевое слово Then,
VBA отобразит следующее сообщение об ошибке.

VBA Error Handling

Некоторые примеры синтаксических ошибок

' 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.

VBA Error Handling

Использование 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 Error Handling

Например, представьте, что ваше приложение читает из внешней
рабочей книги. Если этот файл будет удален, то 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.

Заявление об ошибке

Как мы видели, есть два способа обработки ошибок во время
выполнения

  1. Ожидаемые ошибки — напишите конкретный код для
    их обработки.
  2. Неожиданные ошибки — используйте операторы
    обработки ошибок VBA для их обработки.

Оператор VBA On Error используется для обработки ошибок.
Этот оператор выполняет некоторые действия при возникновении ошибки во время
выполнения.

Есть четыре различных способа использовать это утверждение

  1. On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
  2. On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
  3. On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
  4. 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

Вторая строка присваивания приводит к ошибке деления на ноль. Когда мы запустим этот код, мы получим сообщение об ошибке, показанное на скриншоте ниже.

VBA Error Handling

Когда появляется ошибка, вы можете выбрать End или Debug

Если вы выберете Конец, то приложение просто остановится.

Если вы выберете Отладить, приложение остановится на строке
ошибки, как показано на скриншоте ниже.

VBA Error Handling

Это нормально, когда вы пишете код 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 Error Handling

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. В этом разделе я покажу вам, как
реализовать простую стратегию обработки ошибок, которую вы можете использовать
во всех своих приложениях.

Основная реализация

Это простой обзор нашей стратегии

  1. Поместите строку On Error Goto Label  в начале нашего верхнего Sub.
  2. Поместите Label у обработки ошибок в конце нашего верхнего
    Sub.
  3. Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
  4. Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
  5. В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.

На следующем рисунке показан обзор того, как это выглядит

error-handling

Следующий код показывает простую реализацию этой стратегии

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 чем-либо полезным, поэтому мы
должны сделать это сами.

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

Целью этой стратегии является предоставление вам стека * и
номера строки в случае возникновения ошибки.

* Стек — это список вспомогательных функций, которые
использовались в данный момент при возникновении ошибки.

Это наша стратегия

  1. Разместите обработку ошибок во всех
    подпрограммах.
  2. Когда происходит ошибка, обработчик ошибок
    добавляет подробности к ошибке и вызывает ее снова.
  3. Когда ошибка достигает самой верхней
    подпрограммы, она отображается.

Мы просто «всплываем» из-за ошибки. Следующая диаграмма
показывает простое визуальное представление о том, что происходит, когда в Sub3
возникает ошибка

Error Handling – bubbling

Единственная грязная часть этого — правильное форматирование
строк. Я написал две подводные лодки, которые справляются с этим, поэтому он
позаботится о вас.

Это две вспомогательные подводные лодки

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

Результат выглядит так

error handling output

Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.

error handling output line

Примечание: вы можете получить следующую ошибку при использовании этого кода:

“Programmatic Access to Visual Basic Project is not trusted”

Чтобы решить эту проблему, выполните следующие действия.

  1. Перейдите в раздел «Разработчик» на ленте и
    нажмите «Macro Security», которая находится под кодом.
  2. Нажмите «Настройка макроса» в левом списке.
  3. Поставьте флажок в поле «Доверительный доступ к
    объектной модели проекта VBA».
  4. Нажмите 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.

se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

1

Как задается условие «если ошибка» — #ЗНАЧ!

13.03.2018, 10:39. Показов 9203. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Подскажите, пожалуйста, как правильно задается условие «если ошибка»
Мне необходимо указать ошибку: #ЗНАЧ!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test3()
 
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To lastRow
        If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
        If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
'        If Cells(i, 6).Value = "#ЗНАЧ!" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = Error And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = "#Error" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = "#N/A" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
        
    Next i
    
End Sub

Вложения

Тип файла: zip If_Error.zip (13.7 Кб, 1 просмотров)



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

13.03.2018, 10:39

Ответы с готовыми решениями:

Какой функцией задать условие «Если область ячеек пустая» ?
Есть некий макрос, который шагает по рядам и окрашивает их в нужный цвет, или прячет, в зависимости…

Почему ошибка: «Next without for» если For абсолютно точно есть?
На строчку 23 мне тыкает

Sub isColNum()
Dim x As String, r As Long, c As Integer, numCount…

Если str довольно длинная,то выскакивает ошибка «type mismatch»
Делаю ODBC запрос,пишу .commandtext=array(str),где str=&quot;……..&quot;.Если str довольно длинная,то…

Создать цикл Анализ «что если»-«Подбор параметра.»
Добрый день.
В excel на работе есть классическая задача, которая решается с помощью подбора…

7

Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.03.2018, 10:41

2

Visual Basic
1
If Cells(i, 6).Value = CVErr(xlErrNA)



1



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

13.03.2018, 11:52

3

se_arts, #ЗНАЧ! это CVErr(xlErrValue)
Если любое значение ошибки, то

Visual Basic
1
If iserror(Cells(i, 6).Value) then



2



se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

13.03.2018, 11:54

 [ТС]

4

Hugo121, выдает ошибку
Run-time error ’13’:
Type mismatch

Visual Basic
1
2
3
4
5
6
7
8
Sub test3()
   lastRow = Cells(Rows.Count, 1).End(xlUp).Row
   For i = 4 To lastRow
       If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
       If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
       If Cells(i, 6).Value = CVErr(xlErrNA) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
   Next i
End Sub

Данные:

Кликните здесь для просмотра всего текста

5 6

0 0
0 2
3 3
5 4
5
6 6
2 8
2
5 6
4 8
5
5 3
1 1
4 #ЗНАЧ!
6 5
5 6
2 8
4 9
6 8
7 8
7 8
5 2
4 7
4 8
3 4
3 5
3 1
3 2
4 7
4 6
4 8



0



se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

13.03.2018, 12:23

 [ТС]

5

Казанский,

убрал проверку 2-ого условия (And Cells(i, 5).Value <> «»), попробовал CVErr(xlErrValue) и для любой ошибки
тоже выдает ошибку:
Run-time error ’13’:
Type mismatch

Что я неправильно пишу или указываю в коде?
Находит только перове правильное значение с строке 4 и дальше переходит к макросу и показывает ошибку «13».

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub test3()
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To LastRow
        If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
        If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
'        If IsError(Cells(i, 6).Value) Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = CVErr(xlErrNA) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = CVErr(xlErrValue) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
        If Cells(i, 6).Value = CVErr(xlErrValue) Then Cells(i, 7).Value = 15
    Next i
End Sub

Миниатюры

Как задается условие "если ошибка" - #ЗНАЧ!
 

Как задается условие "если ошибка" - #ЗНАЧ!
 

Вложения

Тип файла: zip If_Error.zip (13.8 Кб, 4 просмотров)



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

13.03.2018, 15:16

6

IsError(Cells(i, 6).Value) не подошел?
и по моему у вас ЕСЛИ не правильно устроин.

Добавлено через 1 минуту
вариант

Visual Basic
1
2
3
4
5
6
7
8
9
10
If Cells(i, 5).Value <> "" Then
          If IsError(Cells(i, 6).Value) Then
             Cells(i, 7).Value = 15
          Else
             Select Case Cells(i, 6).Value
                 Case 2: Cells(i, 7).Value = 5
                 Case 5: Cells(i, 7).Value = 10
             End Select
          End If
End If



1



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.03.2018, 22:37

7

Лучший ответ Сообщение было отмечено se_arts как решение

Решение

Посмотрел наконец файл — точно xlErrValue нужно:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test2()
 
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To lastRow
        If Cells(i, 5).Value <> "" Then
            Select Case CStr(Cells(i, 6).Value)
            Case CStr(CVErr(xlErrValue)): Cells(i, 7).Value = 15
            Case "2": Cells(i, 7).Value = 5
            Case "5": Cells(i, 7).Value = 10
            End Select
            End If
        Next i
 
    End Sub

Добавлено через 1 минуту
Или можно конечно искать просто «Error 2015»



1



0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

14.03.2018, 00:09

 [ТС]

8

Hugo121, заработало
Hugo121, Vlad999, Казанский — всем спасибо.



0



Поиск ошибок в таблице и их исправление с помощью кода VBA Excel. Создание словаря ошибок и автоматическое добавление в него слов с неправильным написанием.

Описание задачи

В одном из столбцов таблицы присутствует список объектов, часть из которых имеет ошибки в написании. Необходимо с помощью кода VBA Excel наименования одинаковых объектов привести к единому написанию.

Для этого нам понадобится словарь ошибочных слов и код VBA, который будет сверять содержимое ячеек заданного диапазона со словарем, исправлять ошибки и добавлять новые позиции в словарь.

Наименованиями объектов могут быть названия товаров, брендов, компьютерных игр, растений, животных, стран, курортов, городов, аэропортов и т.д. Мы будем использовать названия городов.

Создание словаря

Создайте новый лист и переименуйте его ярлык в «Словарь». Словарь может быть размещен в файле с таблицей или в отдельной книге Excel.

Если вам приходится исправлять ошибки в нескольких различных списках объектов, лучше создать отдельный файл со всеми словарями.

Изначально на листе «Словарь» следует дать названия первым двум колонкам. Например, так:

Наименование с ошибкой Правильное написание

Первый запуск кода VBA Excel добавит все уникальные наименования из указанного диапазона таблицы в первую колонку словаря. В этом столбце будут содержаться и по одному экземпляру правильного наименования.

Если в исходной таблице все наименования одного объекта окажутся ошибочными, то в первый столбец словаря следует вручную добавить правильное написание этого объекта.

Вторая колонка словаря заполняется вручную. Напротив каждого наименования с ошибкой пишем правильное во втором столбце.

Второй запуск программы исправит все ошибки в указанном диапазоне таблицы.

При обработке следующих списков программа также будет добавлять новые наименования в первую колонку словаря. Второй столбец заполняется вручную.

Исправление ошибок

Будем решать задачу с условием, что таблица и словарь расположены в одной книге Excel. Активный лист – лист с таблицей.

Для ускорения кода VBA будем использовать в циклах массивы, а не переменные диапазона (as Range). Словарь загрузим в объект Dictionary.

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

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

Sub IspravleniyeOshibok()

Dim colList As Long, strList As Long, strDict As Long, _

i As Long, myList1 As Variant, myList2 As Variant, _

myDict As Object

On Error GoTo Instr

‘Указываем номер столбца со списком в таблице

colList = CLng(InputBox(«Введите номер столбца»))

‘colList = 2

‘Определяем номер последней строки в таблице

strList = Cells(1, colList).CurrentRegion.Rows.Count

‘Загружаем список без заголовка в массив myList1

myList1 = Range(Cells(2, colList), Cells(strList, colList))

With Sheets(«Словарь»)

  ‘Определяем номер последней строки в словаре

  strDict = .Cells(1, 1).CurrentRegion.Rows.Count

  ‘Загружаем словарь с заголовками в массив myList2

  myList2 = .Range(.Cells(1, 1), .Cells(strDict, 2))

End With

  ‘Загружаем словарь в объект Dictionary

Set myDict = CreateObject(«Scripting.Dictionary»)

For i = 1 To strDict

  myDict.Add myList2(i, 1), myList2(i, 2)

Next

For i = 1 To strList 1

  ‘Проверяем наличие слова из myList1 в списке

  ‘ключей объекта Dictionary

  If myDict.Exists(myList1(i, 1)) Then

    ‘Если есть слово в списке ключей, меняем

    ‘слово в myList1 на элемент объекта Dictionary

    myList1(i, 1) = myDict.Item(myList1(i, 1))

  Else

    ‘Если нет слова в списке ключей,

    ‘добавляем новое слово на лист «Словарь»

    strDict = strDict + 1

    Sheets(«Словарь»).Cells(strDict, 1) = myList1(i, 1)

  End If

Next

‘Перезаписываем список в таблице списком из массива myList1

Range(Cells(2, colList), Cells(strList, colList)) = myList1

Instr:

If Err.Description <> «» Then

  MsgBox «Произошла ошибка: « & Err.Description

End If

End Sub

Переменные:

  • colList – номер столбца со списком в таблице;
  • strList – номер последней строки в таблице;
  • strDict – номер последней строки в словаре на листе «Словарь»;
  • i – счетчик циклов;
  • myList1 – массив для списка из таблицы;
  • myList2 – массив для списков из словаря на листе «Словарь»;
  • myDict – объект Dictionary (словарь).

Работа кода в картинках

Исходная таблица:

Исходный словарь:

Словарь после первого запуска кода:

Дозаполненный вручную словарь:

Таблица после второго запуска кода:

Лист с таблицей при запуске представленного выше кода VBA Excel должен быть активным.

Понравилась статья? Поделить с друзьями:
  • Vba excel ошибка 457
  • Vba excel ошибка 438
  • Vba excel очистка массива
  • Vba excel очистить текст
  • Vba excel очистить содержимое ячейки