Remkomplekty.ru

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ошибка 424 vba

Как исправить ошибку Microsoft Excel 424

Совместима с Windows 2000, XP, Vista, 7, 8 и 10

Признаки ошибки 424

  • Появляется сообщение «Ошибка 424» и окно активной программы вылетает.
  • Ваш компьютер часто прекращает работу после отображения ошибки 424 при запуске определенной программы.
  • Отображается “Excel Error 424”.
  • Windows медленно работает и медленно реагирует на ввод с мыши или клавиатуры.
  • Компьютер периодически «зависает» на несколько секунд.

Такие сообщения об ошибках 424 могут появляться в процессе установки программы, когда запущена программа, связанная с Microsoft Corporation (например, Microsoft Excel), при запуске или завершении работы Windows, или даже при установке операционной системы Windows. Отслеживание момента появления ошибки 424 является важной информацией при устранении проблемы.

Причины ошибки 424

  • Поврежденная загрузка или неполная установка программного обеспечения Microsoft Excel.
  • Повреждение реестра Microsoft Excel из-за недавнего изменения программного обеспечения (установка или удаление), связанного с Microsoft Excel.
  • Вирус или вредоносное ПО, которые повредили файл Windows или связанные с Microsoft Excel программные файлы.
  • Другая программа злонамеренно или по ошибке удалила файлы, связанные с Microsoft Excel.

Ошибки типа Ошибки во время выполнения, такие как «Ошибка 424», могут быть вызваны целым рядом факторов, поэтому важно устранить каждую из возможных причин, чтобы предотвратить повторение ошибки в будущем.

Ошибки во время выполнения в базе знаний

star rating here

Как исправить ошибку Microsoft Excel 424

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

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

Шаг 1: Восстановить записи реестра, связанные с ошибкой 424

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей Ошибка 424 не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как WinThruster [Загрузить] (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с Ошибка 424. Используя очистку реестра [Загрузить], вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку %%error_name%%) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра [Загрузить] может резко повысить скорость и производительность системы.

Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с Ошибка 424 (например, Microsoft Excel):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска. ПОКА НЕ НАЖИМАЙТЕENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Черный ящик открывается мигающим курсором.
  7. Введите «regedit» и нажмите ENTER.
  8. В Редакторе реестра выберите ключ, связанный с Ошибка 424 (например, Microsoft Excel), для которого требуется создать резервную копию.
  9. В меню Файл выберите Экспорт.
  10. В списке Сохранить в выберите папку, в которую вы хотите сохранить резервную копию ключа Microsoft Excel.
  11. В поле Имя файла введите название файла резервной копии, например «Microsoft Excel резервная копия».
  12. Убедитесь, что в поле Диапазон экспорта выбрано значение Выбранная ветвь.
  13. Нажмите Сохранить.
  14. Файл будет сохранен с расширением .reg.
  15. Теперь у вас есть резервная копия записи реестра, связанной с Microsoft Excel.

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

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

Fix run-time error ‘424’: Object required in Excel VBA

I am working on an Excel Userform to capture transport jobs performed each day. However, I am having a problem in the code with run-time error. I will appreciate it if someone can help me fix the error in the attached Excel document.

Files

(69.63 kB, downloaded 75 times, last: Feb 25th 2020 )

Re: Fix run-time error ‘424’: Object required in Excel VBA

You don’t have a form called frmDate.

The form in your file is called frmTrans.

Re: Fix run-time error ‘424’: Object required in Excel VBA

Norie, I changed it from frmTrans to frmDate thinking that was the problem. However, it did not solve the run-time error 424 in the code.

Re: Fix run-time error ‘424’: Object required in Excel VBA

The object required error is because you have cEquipment instead of cEquip here.

  1. For Each cEquip In ws.Range(«EquipmentList»)
  2. With Me.cboEquipment
  3. .AddItem cEquipment.Value
  4. .List(.ListCount — 1, 1) = cEquipment.Offset(0, 1).Value
  5. End With
  6. Next cEquip

However that isn’t the only problem.

The combobox cboEquipment is already populated via it’s RowSource property.

There is no named range called ‘LocationList’.

Also, each of the comboboxes you are trying to populate from ‘LocationList’ are already populated by their RowSource property.

Re: Fix run-time error ‘424’: Object required in Excel VBA

wow, I like the way you break down the problem with the code. As I am a beginner with VBA, formatting the code to get rid of the error is a challenge for me. If you can help me address these issues and attach the Excel file with these changes, I will appreciate it. Thanks much.

Re: Fix run-time error ‘424’: Object required in Excel VBA

I can’t really do that.

For example, I don’t know what LocationList should be or what it should be replaced with.

I could guess, but that guess might be totally wrong and cause further problems.

Perhaps you should just delete the code since the comboboxes are being populated without it anyway.

Re: Fix run-time error ‘424’: Object required in Excel VBA

What I have is a LookupLists worksheet for the combo boxes. The whole goal of the LookupLists was developed for the combo boxes in the actual userform (for example, equipment combo box, select wheelchair or cart depending on what was used in performing the job from the equipment list). I did not set-up any LocationList in the file that was attached. Thanks a lot for your time on this.

Re: Fix run-time error ‘424’: Object required in Excel VBA

If you have no LocationList and the comboboxes are getting populated fine without the code, which they are — I checked, then just delete the code.

Re: Fix run-time error ‘424’: Object required in Excel VBA

The combo boxes are pulling those information from the LookupLists. That is why they are already populated when you view the userform in the object mode.

Re: Fix run-time error ‘424’: Object required in Excel VBA

Norie, I changed the code as suggested and I am still getting the same error code. There must be something I am not doing right. Any assistance will be greatly appreciated. Thanks.

Читать еще:  Ттк 651 ошибка при подключении

Re: Fix run-time error ‘424’: Object required in Excel VBA

What changes did you make?

Can you post the workbook with the current code?

Re: Fix run-time error ‘424’: Object required in Excel VBA

I changed the line: Dim lDate As Long to Dim lTrans As Long.

When I ran the code, I received run-time error 70, permission denied. I have attached the workbook as requested. Thank you very much for your time.

Files

(59.39 kB, downloaded 26 times, last: Feb 17th 2020 )

Re: Fix run-time error ‘424’: Object required in Excel VBA

Is that all you changed?

That wouldn’t make any difference, and definitly wouldn’t cause that error.

Did you not try what I suggested and remove these lines of code?

  1. For Each cEquip In ws.Range(«EquipmentList»)
  2. With Me.cboEquipment
  3. .AddItem cEquip.Value
  4. .List(.ListCount — 1, 1) = cEquipment.Offset(0, 1).Value
  5. End With
  6. Next cEquip
  7. For Each cComplStat In ws.Range(«LocationList»)
  8. With Me.cboCompletionStatus
  9. .AddItem cComplStat.Value
  10. End With
  11. Next cComplStat
  12. For Each cCancRea In ws.Range(«LocationList»)
  13. With Me.cboCancellationReason
  14. .AddItem cCancRea.Value
  15. End With
  16. Next cCancRea
  17. For Each cShf In ws.Range(«LocationList»)
  18. With Me.cboShift
  19. .AddItem cShf.Value
  20. End With
  21. Next cShf

Re: Fix run-time error ‘424’: Object required in Excel VBA

Wow,Norie, you are the best. The code is now working; Your suggestion to remove this part of the code actually did the magic.

For Each cEquip In ws.Range(«EquipmentList») With Me.cboEquipment .AddItem cEquip.Value .List(.ListCount — 1, 1) = cEquipment.Offset(0, 1).Value End With Next cEquip For Each cComplStat In ws.Range(«LocationList») With Me.cboCompletionStatus .AddItem cComplStat.Value End With Next cComplStat For Each cCancRea In ws.Range(«LocationList») With Me.cboCancellationReason .AddItem cCancRea.Value End With Next cCancRea For Each cShf In ws.Range(«LocationList») With Me.cboShift .AddItem cShf.Value End With Next cShf

Re: Fix run-time error ‘424’: Object required in Excel VBA

Now that the userform is working, is there a code I can write to format time properly even if it was typed into the dispatch time dialogue box wrongly (such as 12:00pm instead of 12:00 p.m)? Also, is there a code to format lower case letters to upper case letters for «Dispatch By» and «To» on the userform? I also want to limit the «JOB ID» box to take 7 digits — anything less or more should flag error. Thank you very much for all your help. Truly appreciate it.

Re: Fix run-time error ‘424’: Object required in Excel VBA

Excel VBA Ошибка времени выполнения ‘424’ требуется объект

Я совершенно новичок в VBA и кодировании в целом, пытаюсь получить данные из ячеек из той же книги (get framework path . ) а затем запустить приложение (QTP) и запустить тесты.

Я получаю эту ошибку при попытке получить значения, введенные в ячейках excel:

Я считаю, что мне не хватает некоторых основных правил, но я ценю вашу помощь. Пожалуйста, смотрите ниже ту часть кода, о которой идет речь:

3 Ответа

Первая строка кода, Option Explicit , означает (простыми словами), что все ваши переменные должны быть явно объявлены операторами Dim . Они могут быть любого типа, включая объект, целое число, строку или даже вариант.

Эта строка: Dim envFrmwrkPath As Range объявляет переменную envFrmwrkPath типа Range . Это означает, что вы можете установить его только в диапазон.

Эта строка: Set envFrmwrkPath = ActiveSheet.Range(«D6»).Value пытается установить переменную типа Range в определенное значение, которое находится в ячейке D6 . Это может быть целое число или строка, например (зависит от того, что у вас есть в этой ячейке), но это не диапазон.

Я предполагаю, что вы хотите сохранить значение в переменной. Попробуйте что-нибудь вроде этого:

Это предполагает, что у вас есть число (например, 5) в ячейке D6. Теперь ваша переменная будет иметь значение.

Для простоты обучения вы можете удалить или закомментировать строку Option Explicit , а VBA попытается определить тип переменных во время выполнения.

Попробуйте сделать это, чтобы пройти через эту часть вашего кода

Просто удалите .value из вашего кода.

вместо этого используйте:

Похожие вопросы:

Написание макроса для запуска цикла, который запускает VLOOKUP через каждую ячейку в столбце. Я получаю ошибку Ошибка времени выполнения ‘424’ требуется объект, но не могу определить основную.

Это приводит к ошибке: Ошибка времени выполнения ‘424’: требуется объект Private Function Y_Mode() As Double Dim MaxGrad As Double MaxGrad = WorksheetFunction.Max(Graduation_Series) Y_Mode =.

Я столкнулся с проблемой Ошибка времени выполнения ‘424’ требуется объект. Это решение, которое я получил от моего предыдущего поста, потратив некоторое время на устранение неполадок, я все еще не.

Я продолжаю получать сообщение Ошибка времени выполнения ‘424’: требуется объект, и я не знаю, почему, когда я нажимаю кнопку debug, она приводит меня к строке qdf.SQL = strSQL и выделяет ее желтым.

У меня есть простой код, чтобы найти первую и последнюю строку, заполненную в excel. Когда я выполняю это, я получаю ошибку VBA Ошибка времени выполнения 424: требуется объект. Я искал другие ошибки.

я пытаюсь очистить textbox называется text box 2 я пробовал следующее: TextBox2.Value = ^ получает 424 требуется объект ошибка TextBox2.Text = ^ получает 424 требуется объект ошибка.

Я получил ошибку времени выполнения ошибка 424: требуется объект. Я застрял в создании формулы для расчета стандартного отклонения. Наверное, я сделал что-то не так, определив тип диапазона. Есть.

У меня есть простая функция, которая позволяет пользователю выбрать файл, используя свойство Excel 2010 VBA msoFileDialogOpen для выбора файла. Когда я запускаю его, я получаю ошибку: Ошибка времени.

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

Я пытаюсь очистить 37.59% от веб-сайта с помощью VBA:- 37.59% Мне удалось перейти на сайт и сделать различные выборы. Ниже приведен мой.

VBA, InputBox, Run-time error ‘424’: Object required

Go to page

NathanW

New Member

I’m having an issue with my InputBox command, I have underlined the part that’s returning the error.

.
SelectHeading:
On Error Resume Next
‘Need to let the user select the proper heading.
Dim rng As Range
Set rng = Nothing
Set rng = Application.InputBox(prompt:=»Select the heading you wish to use.», Default:=Cells(4, 2).Value, Type:=8)
If rng = False Then

End If
.
If the user hits cancel during the input box part, it returns the Run-time error ‘424’: Object required. No error handling commands have let me get past it. Please please help!!

Some videos you may like

Excel Facts

kevatarvind

Well-known Member

Hi And Welcome to The Board

What Actually you want to do with this code can you pls explain in word ?

NathanW

New Member

Thank you very much for your timely response, I will gladly go into more detail.

Essentially, the program I am creating takes data in one worksheet and transfers it to a different worksheet within the same workbook. While it is doing this, it is also sorting it by column under certain headings (matching up the column headings in the first worksheet with the column headings in the second worksheet). If the program can not find the correct heading, it gives the user the ability to select a heading (by selecting a cell on the screen) and then it will list the data in the cells below it. This is where the input box comes into play. The program works perfectly fine if the user selects a cell, but if the user chooses ‘cancel’, it gives the Run-time error: 424

kevatarvind

Well-known Member

Gary’s Student

Well-known Member

This avoids your error:

NathanW

New Member

Thank you both very much for you assistance thus far, I really appreciate it! Gary, unfortunately with your code I am still getting the same error =(

Читать еще:  Ошибка 4013 iphone 7

I will provide the full code, however, it is rather lengthy, so I apologize in advance for the headaches that may ensue.
.

Sub CopySortPaste()
‘This finds the total number of columns and rows used in the spreadsheet
iTotColumns = Sheets(«PasteHere»).UsedRange.Columns.Count
iTotRows = Sheets(«PasteHere»).UsedRange.Rows.Count

‘This will give the array the dimensions it needs to fit the data
ReDim MyArray(iTotRows, iTotColumns)

‘This will begin the for loop which will store the data in a 2 dimensional array
‘The first for loop stores the column number
For ColCount = 1 To iTotColumns

‘This will begin the nested for loop which cycles through the rows
For RowCount = 1 To iTotRows

‘This is storing the data located in each cell in its individual place in the array
MyArray(RowCount, ColCount) = Sheets(«PasteHere»).Cells(RowCount, ColCount)

Next RowCount
Next ColCount

‘This activates the sheet which the data is being transferred to and then selecting the first cell
Sheets(«Equipment»).Activate
Range(«A1»).Select

‘This finds the total number of rows used in the document we are transferring to. By doing this,
‘we can insert the new data at the bottom of the new sheet.
iNewTotRowsUsed = ActiveSheet.UsedRange.Rows.Count

‘Because the previous bit of code is usually inaccurate, this Do Until loop has been added
‘to make sure that the last cell used in the document (by the computer’s standards) is indeed
‘the last used cell.
Do Until Cells(iNewTotRowsUsed, 1) <> «»

iNewTotRowsUsed = iNewTotRowsUsed — 1

‘This begins the for loop which will be used to transfer the data from the array to the spreadsheet
For ColCount = 1 To iTotColumns
For RowCount = 1 To iTotRows

‘The RowCount variable keeps track of which piece of data to pull from the array
‘If RowCount = 1, then it must be the heading and not a piece of equipment
If RowCount = 1 Then

‘This will store the heading name in a variable which will be used for searching.
‘The goal is to find the heading in the new document and then input the data from
‘the array into the spreadsheet below the heading.
sHeading = MyArray(RowCount, ColCount)

‘This is the label for when there is an error. Specifically, it is for when the heading
‘can not be found when using the find command. If the heading can not be found, it will
‘go to the label «HeadingNotFound», which offers to create a new heading.
ErrorHandling:
On Error GoTo HeadingNotFound

‘This command will search the document for the heading title. Once it has found it,
‘the program will begin to list the data below the heading at the bottom of the table.
Cells.Find(What:=sHeading, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate

‘iColNumber is a new variable which gets the column number of the active cell, which should be
‘the heading which was just searched for.
iColNumber = ActiveCell.Column

‘The RowCount variable must be incremented by 1 so that the heading from the array is not
‘placed within the document. iRowNumber has been set to the value of the row after the
‘very last row which has been used in the document. iNewTotRowsUsed is the variable which
‘holds the row number of the last non blank cell in the document being transferred to.
RowCount = RowCount + 1
iRowNumber = iNewTotRowsUsed + 1

‘This places the data from the array into the new data sheet
ActiveSheet.Cells(iRowNumber, iColNumber) = MyArray(RowCount, ColCount)

If RowCount > 2 Then

iRowNumber = iRowNumber + 1
ActiveSheet.Cells(iRowNumber, iColNumber) = MyArray(RowCount, ColCount)

Next RowCount
Next ColCount

‘This is where the program runs if the find command could not find the
‘heading it was searching for. It will produce a message asking if the
‘user would like to sort the data beneath a user-selected column heading.
HeadingNotFound:

Msg = «It appears one of your headings, » & sHeading
Msg = Msg & » could not be found. Would you like »
Msg = Msg & «to choose which heading to put its data under?»
Ans1 = MsgBox(Msg, vbYesNo, «Heading Not Found»)

If Ans1 = vbYes Then

On Error GoTo 0

SelectHeading:
‘Need to let the user select the proper heading.
Dim rng As Range
Set rng = Nothing
On Error Resume Next
Set rng = Application.InputBox(prompt:=»Select the heading you wish to use for » & sHeading & «.», Default:=Cells(4, 2).Value, Type:=8)
If rng Is Nothing Then

NewColumn:
NewMsg = «Would you like to put this data in a new »
NewMsg = NewMsg & «column under the heading » & sHeading & «?»

Ans2 = MsgBox(NewMsg, vbYesNo, «New Column?»)

If Ans2 = vbYes Then

Msg = «Please select where you would like to place this heading. »
Msg = Msg & «The column will be placed between the cell you select »
Msg = Msg & «and the cell to its left.»

Set rng = Application.InputBox(prompt:=Msg, Type:=8)
iColNumber = rng.Column
ActiveSheet.Cells(4, iColNumber).Activate
ActiveCell.EntireColumn.Insert (xlRight)
Cells(4, iColNumber) = sHeading

DoNothing:
If ColCount <> iTotColumns Then

Ошибка 424 vba

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

Простите, но — немного словоблудия 🙂

Ошибки в программе

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

Вы обращаетесь к объекту по имени, а объекта с таким именем в коллекции нет

Вы хотите выделить ячеку на одном листе, а этот лист в данный момент не является активным (типичнейшая ошибка новичков в Excel VBA)

Вы хотите удалить отфильтрованные автофильтром строки, а фильтр вообще не вернул записей и удалять нечего

Вы ссылаетесь на элемент массива, который находится за пределами его границ.

Вы пытаетесь присвоить переменной значение, которое оно не может хранить. Например, переменной типа Long нельзя присвоить строковую константу или переменной типа Integer присвоить знанчение превышающее число 32767 .

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

Continue (продолжить) — этот пункт во время возникновения ошибки всегда не активен. Он активен, когда по ходу выполнения программы вы использовали оператор Stop . Кстати это очень полезный оператор для отладки программы.

End (завершить) — завершение исполнения программы

Debug (отладка) — переход в режим отладки, в котором можно посмотреть, на каком операторе возникла ошибка, что содержат переменные, можно даже перетащить жёлтую полоску, подсвечивающую текущий оператор, назад, и модифицировать знанчение переменных через окно Immediate window (впрочем это экзотика). В общем случае кнопка Debug позволяет посмотреть, где случилась ошибка и попытаться понять почему так случилось.

Если вы — автор программы, в которой случилась ошибка, то вы, должно быть, в начале будете рады увидеть подобное окно, ибо только так вы сможете отловить основные ошибки, скрытые в вашем коде. Однако, если эту ошибку видит пользователь, то для него это, мягко говоря, безрадостное и малопонятное зрелище. Ещё хуже, если за эту программу вам заплатили деньги. Поэтому в среде худо-бедно профессиональных программистов принято предусматривать обработку ошибок в своих программах.

Почему вообще в коде возникают ошибки?

Много ошибок во время написания кода возникает по невнимательности или не совсем адекватного понимания того, что делаешь. Таких ошибок, как правило, очень много, особенно у начинающих программистов, но эти ошибки довольно легко отловить и исправить, так как, пока вы их не исправите, ничего не работает. Ну, например, вы должны извлечь данные из 5-го столбца, а вы извлекаете из 6-го, а их там банально нет. Ясно, что вы это очень быстро заметите.

Читать еще:  Ошибка 75 vba

Вторая группа ошибок — это ошибки оптимиста. Когда программа написана в целом правильно, но алгоритм не готов к ударам судьбы в виде неожиданных действий со стороны пользователя, ошибок ввода-вывода (вы рассчитывали считать данные из файла, а файла с таким именем не оказалось, либо он заблокирован другим приложением), особенностей конфигурации компьютера (разные версии ОС или офиса, которые в некоторых мелочах отличаются).

Тонкие логические ошибки. Чем сложнее программа, тем больше шансов, что модель задачи в вашей голове, ваша программа и реальность не совсем согласованы между собой. Пока вы не достигните достаточного погружения в задачу вы такие ошибки не найдёте и не исправите. Порой на это уходит много времени. Но это характерно для сложных задач.

Ошибки на стыке вашего приложения и сервисов ОС, приводящие к неожиданным крахам приложения. Такого вообще возникать не должно, но как мы понимаем, и ОС и офис содержат ошибки, да и вы (что более вероятно) можете пользоваться системными вызовами не правильно. Подобные ошибки — сущий кошмар, особенно когда они проявляются лишь на некоторых конфигурациях, при определенных условиях, их трудно поймать и надёжно воспроизвести.

Задачи механизмов обработки ошибок

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

Информирование . Мало обработать ошибку и предотвратить завершение программы. Надо ещё и адекватно проинформировать пользователя о причинах нестандартного поведения программы. Частно причиной ошибок в программе являются некорректные действия пользователя, поэтому важно сообщать ему о них.

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

Файл примера

Скачать

Код без обработки ошибок

Вот простой пример с потолка. Если вызвать Example_00 , то она прекрасно отработает без ошибок и вернёт это:

В функцию GetCalories передаётся строка с блюдом, а она должна вернуть его калорийность, сверившись с таблицей в A1:B7 .

Давайте поищем слабые места в этом коде. Первое, что должно прийти в голову — если мы ищем, то, что произойдёт, если мы не найдём? А произойдёт, конечно же, ошибка. Её инициирует метод Match .

Ещё одно слабое место этой подпрограммы: функция возвращает вещественный тип Double , и даже, если поиск оказался удачным, то в Cells(intRow, 2) может случайно находиться текстовая строка, а потому, когда вы числовому типу попытаетесь присвоить строковый тип, также произойдёт ошибка. И, если вы второй ошибки сможете избежать за счёт дополнительного оператора if с проверкой через IsNumber (), то избежать первой ошибки таким способом нельзя. Что же делать? А вот тут на сцену выходят операторы обработки ошибок.

Есть 2 подхода к обработке ошибок: автономный подход и выносной . Эти термины я придумал только что, чтобы проще было их обсуждать.

Автономный подход

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

Итак, что тут сделано:

Сразу после объявления функции GetCalories_v1 идёт оператор on error resume next , который в случае возникновения в каком-либо месте ошибки, предписывает VBA просто передавать управление на следующий оператор, идущий после ошибочного.

Мы объявили переменные. Необъявленные переменные получают тип Variant и значение по умолчанию Empty . Объявленные переменные числовых типов инициируются нулём, строковые — пустой строкой, то есть я наперёд знаю, что они содержат, а это хорошо для обработки ошибок.

На вызове метода WorksheetFunction.Match у нас возникает ошибка, так как искомого значения в таблице нет. А это, между прочим, был оператор присваивания ( = ). Прежде, чем левой части оператора присваивания ( intRow ) что-то будет присвоено, необходимо вычислить правую часть оператора присваивания ( WorksheetFunction.Match . ), а поскольку в процессе этого вычисления возникает ошибка, то переменная intRow остаётся такой, какой была! А, как я уже сказал, VBA автоматически её инициализирует нулём до начала исполнения подпрограммы. Получается, что, если в этом операторе возникнет ошибка, то в intRow будет ноль. Если ошибки во время поиска не возникнет, то ноля там не будет ни при каких раскладах, так как строки на листе нумеруются с единицы.

И вот этот ноль мы и контролируем, добавляя оператор If . Если intRow больше нуля, то WorksheetFunction.Match отработала штатно, а если нет — то работу подпрограммы надо прерывать, но об этом чуть позже.

Далее мы помним, что Cells(intRow, 2) может теоретически вернуть строковое значение, которое вызовет ошибку Type missmatch при присвоении переменной типа Double ( GetCalories_v1 ), поэтому мы вставляем дополнительную проверку промежуточной переменной varTemp тому, что она числовая. И если это так, то присваиваем GetCalories_v1 значение из varTemp .

В случае возникновения любой ошибки внутри GetCalories_v1 она просто вернёт ноль. Почему ноль? Потому что переменная GetCalories_v1 тоже инициализируется нулём и об этом не надо заботиться, а в случае ошибки она останется в неприкосновенности.

Соответственно родительский код (в нашем случае его роль играет процедура Example_01 ) должен проверить, а не вернёт ли GetCalories_v1 ноль, и быть готовым к этой ситуации.

А вот теперь тонкий момент, который не все понимают. Почему я использовал промежуточные переменные intRow и varTemp ? Вроде бы есть очевидный ответ — чтобы не вычислять значение выражений с Match и Cells 2 раза. Отчасти это, конечно, так. Но это, в данном случае, не главная причина. Главная причина в том, что такой код

вызовет неправильное поведение программы. Если у нас Match вызовет исключение, то VBA передаст управление на СЛЕДУЮЩИЙ оператор, а следующий оператор в данном случае это то, что идёт после Then — присваивание переменной varTemp значения. Таким образом наша проверка на наличие ошибки сработает с точностью до наоборот, передав управление в ту часть кода, которая должна быть защищена от ситуации, когда Match не нашла строку в таблице. Вот почему важно в операторе If не иметь ничего такого, что могло бы вызвать ошибку.

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

Выносной подход

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

Обратите внимание, что:

Оператор on error теперь в случае ошибки предписывает передавать управление на метку ErrorHandler , которая объявлена в конце кода процедуры GetCalories_v2

В коде мы никак не заботимся о каких-либо проверках. Возникла ошибка? Иди на метку — там разберутся.

Если ошибки не случилось, то, чтобы программа не стала исполнять строчки, предназначенные для обработки ошибок, перед меткой ErrorHandler обычно ставят оператор Exit Sub или Exit Function (в зависимости от типа подпрограммы).

Принципиальный момент — наличие оператора On Error Resume Next сразу после метки ErrorHandler . Дело в том, что после того, как вы перешли на метку ErrorHandler , очень опасно иметь действующим оператор On Error GoTo ErrorHandler , так как, если у вас в обработчике ошибки случится любая ошибка, то управление будет передано опять на метку и, как нетрудно понять, образуется бесконечный цикл. Поэтому сразу после метки мы возможность возникновения цикла ликвидируем оператором On Error Resume Next .

Что лучше?

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

Ссылка на основную публикацию
Adblock
detector