Это хорошая практика, чтобы использовать Range.SpecialCells вместе с обработчиком ошибок? - PullRequest
3 голосов
/ 14 марта 2019

При использовании Range.SpecialCells с диапазоном, который не содержит ячейки, которые соответствуют критериям, выдается ошибка, сообщающая, что ячейки не найдены.

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

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

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

Плохим / медленным решением было бы вообще не использовать его, а просто использовать циклы с проверками.

Вот простой пример кода, демонстрирующий, как он работает с обработчиком ошибок:

Private Sub Procedure()

  Dim OriginalRange As Excel.Range
  Dim NewRange As Excel.Range

  Set OriginalRange = ThisWorkbook.Worksheets(1).Range("A1:C4")
  On Error GoTo ErrorHandler
  Set NewRange = OriginalRange.SpecialCells(Type:=Excel.XlCellType.xlCellTypeConstants, Value:=Excel.XlSpecialCellsValue.xlNumbers)
  Exit Sub
ErrorHandler:
  If (VBA.Err.Number <> 1004) Then VBA.Err.Raise VBA.Err.Number

End Sub

1 Ответ

4 голосов
/ 14 марта 2019

Да, это совершенно нормально (я предпочитаю этот способ) использовать обработчик ошибок.То, что я делаю, я помещаю между On Error Resume Next и On Error GoTo 0 и проверяю If NewRange is Nothing

См. Этот пример

On Error Resume Next
Set NewRange = OriginalRange.SpecialCells(Type:=Excel.XlCellType.xlCellTypeConstants, _
                                          Value:=Excel.XlSpecialCellsValue.xlNumbers)
On Error GoTo 0

If NewRange Is Nothing Then
  MsgBox "Your message here informing the USER that desired cells were not found"
Else
  '
  '~~> Do whatever you want with the range
  '
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...