Итак, я представлю, что я все еще очень новичок в VBA. Я набрал этот код, насколько мог, и был горд. Я решил добавить некоторые дополнительные функции. Самая последняя функция, которую я хотел, - захватить определенную информацию, когда произошла ошибка, и отобразить их в окне сообщения.Excel VBA Обработка ошибок не выполняет свою работу
Что делает код:
У меня есть две книги. Wkbook1 заполнен множеством элементов данных, а Wkbook2 является основным списком. Код выполняет поиск первой строки в wkbook1 и выполняет поиск этой фразы в Wkbook2, а затем инициализирует ее слева. Иногда повторяются элементы, и мой «DO LOOP» позаботится об этом. Моя проблема заключается в том, что не все элементы присутствуют в главном списке, и я должен знать, какие из них нет.
Я установил его так, чтобы при появлении сообщения об ошибке, поскольку он не смог найти элемент в главном списке, он перешел к моему обработчику ошибок и сохранил элит в моей переменной сообщения, которая будет использоваться позже с сообщением коробка.
Я тестировал его на других книгах с элементами данных, и если есть 0 или 1 элемент, который не найден, он работает, но если в главном списке не найдено более 1 элемента, это дает мне ошибку времени выполнения 91 на второй элемент не найден. Я уверен, что в моем коде есть много критических замечаний, поэтому, пожалуйста, успокойтесь. Это мой первый раз с использованием массивов.
Код:
Option Explicit
Sub M2_Name_Finder()
Dim x As String
Dim y As Integer
Dim z As Integer
Dim c As Integer
Dim m As Integer
Dim name As String
Dim rngCopy As Range
Dim numRows As Long
Dim rAddress As String
Dim found(50) As String
Dim previous As String
Dim missingFields As String
Dim message As String
name = "JJP"
Windows("Wbook1").Activate
Range("D3").Select
Set rngCopy = ActiveCell.CurrentRegion
numRows = rngCopy.Rows.Count
For z = 1 To numRows
Windows("Wkbook1").Activate
Range("D3").Select
ActiveCell.Offset(y, 0).Select
x = ActiveCell.Value
If x = vbNullString Or x = " " Then
GoTo Done
End If
If x = previous Then
GoTo Here
End If
previous = ActiveCell.Value
Windows("Wkbook2").Activate
Columns("D:D").Select
On Error GoTo Missing:
Selection.Find(what:=x, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase _
:=False, SearchFormat:=False).Activate
found(c) = ActiveCell.Address
rAddress = ActiveCell.Address
If ActiveCell.Value <> Empty Or ActiveCell.Value <> 0 Then
Do
ActiveCell.Select
ActiveCell.Offset(0, -3).Value = name
c = c + 1
Cells.FindNext(After:=ActiveCell).Activate
found(c) = ActiveCell.Address
Loop While found(c) <> rAddress
End If
Here:
c = 0
y = y + 1
Next z
Missing:
message = message & x
m = m + 1
GoTo Here:
Done: MsgBox "Not found: " & message & vbLf, vbInformation
End Sub
Это хорошая история, но в чем ваш вопрос? – JohnFx
Ha. Да, должно быть, было немного более ясно, я думаю. Мой вопрос: как я могу обработать ошибку? Он не работает, если отсутствует более 1 элемента данных. Мне нужно захватить элементы данных, которые не найдены в главном списке, и хотите отобразить их в окне сообщения после завершения программы. Он делает это сейчас, если только один элемент данных не найден. Не знаю, почему я получаю сообщение об ошибке, если есть более 1 ... Помощь вообще? – Leon
У Чипа Пирсона есть отличная статья об обработке ошибок в VBA по адресу http://www.cpearson.com/Excel/ErrorHandling.htm – Jesse