Страницы: 1
RSS
VBA - код выполняется, игнорируя ошибки
 
Добрый день.

Случилась как-то беда, попал в бесконечный цикл. Вышел с помощью кнопки Break.

Но с тех пор начались чудеса.

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

Или я пишу следующее:
Set Specs = Application.Workbooks(UZ).Sheets("Listing").Range(Cells(LastUsedCell.Row + 1, 1), Cells(LastUsedCell.Row + MassivDim + 1, 5))

Переменной UZ присвоен некий файл. Но при наводе мышкой на Cells всплывает подсказка, которая показывает содержимое ячеек с заданным адресом - и я вижу. что это значение вообще из другого файла! То есть, несмотря на то, что нужный файл прописан в адресе, он обращается к другому.... Но ранее этого он все определял верно.

Он по идее должен вставить данные из массива в диапазон после последней заполненной ячейки (а это строка заголовков в первом ряду). Он то правильно вставляет, то на 38 строчку.

Это просто пример, и других глюков полно тоже, я столько времени на это трачу! Устал уже.

Что это за хрень и что делать? Эксель уже переустанавливал с 2010 на 2016. Ничего не изменилось.
Изначально все работало идеально.
 
Доброе время суток
Цитата
Глючит VBA. Как переустановить?
Может начать сначала с как доказать? Для начал выполните:
Код
Public Sub TestErrorHandle()
    Dim v As Double
    v = 111# / 0#
End Sub

Цитата
Равик написал:
Или я пишу следующее:Set Specs = Application.Workbooks
Входит в метод Sub UchetZakazov() модуля Module1. В этом модуле в этом методе в строке 101 написано On Error Resume Next
Тогда
Цитата
Равик написал:
при возникновении некоторых ошибок макрос не выполнялся - то сейчас он выполняется, и я даже не знаю о существовании ошибок.
что вы придираетесь к VBA?
Изменено: Андрей VG - 02.08.2020 12:50:07
 
Цитата
Андрей VG написал:
Public Sub TestErrorHandle()    Dim v As Double    v = 111# / 0#End Sub
Андрей,

убрал On Error Resume Next, пока что похоже, что вы правы...
Я считал, что этот оператор действует только на сразу идущие за ним действие и только на него.

Есть ли какой-то способ отключать этот оператор, когда он уже не нужен?

Например следующая штука, которая должна снимать фильтр, если он стоит:

Код
If Workbooks(PROIZVODITELI).Worksheets("ÎÁÙÈÉ").ShowAllData = True Then  
Workbooks(PROIZVODITELI).Worksheets("ÎÁÙÈÉ").ShowAllData  
End If

выдает ошибку, если фильтра изначально не стоит. И тогда On Error Resume Next очень бы пригодилось.


UPD!!
Нашел в интернете альтернативный способ:
Код
If Workbooks(PROIZVODITELI).Worksheets("ÎÁÙÈÉ").FilterMode Then
        Workbooks(PROIZVODITELI).Worksheets("ÎÁÙÈÉ").ShowAllData
    End If

Но если есть способ выключать по ходу кода этот On Error Resume Next, был бы благодарен.

P.S. Ваш код выдает ошибку деления на ноль.
Изменено: Равик - 02.08.2020 14:15:06
 
Цитата
Равик написал:
Например следующая штука, которая должна снимать фильтр, если он стоит:
Например такую штуку можно вынести в отдельный метод в котором только и будет стоять On Error Resume Next :)  Не вижу сложностей. Ну, разве что ShowAllData метод Worksheet, который ничего не возвращает...
Цитата
Равик написал:
P.S. Ваш код выдает ошибку деления на ноль.
Естественно, именно этим я и хотел показать, что VBA не причём в описываемой вами проблеме. Проблема в структуре вашего кода.
Изменено: Андрей VG - 02.08.2020 14:16:11
 
Андрей VG,

Спасибо.

я нашел такой способ
Код
If Workbooks(PROIZVODITELI).Worksheets("ÎÁÙÈÉ").FilterMode Then    
Workbooks(PROIZVODITELI).Worksheets("ÎÁÙÈÉ").ShowAllData
  End If

тем не менее...
а что значит "вынести в отдельный метод в котором только и будет стоять On Error Resume Next" ?
Я изучаю VBA сразу посредством написания кода и не совсем понимаю ваш програмистский язык)
Изменено: Равик - 02.08.2020 17:22:21
 
Цитата
Равик написал:
а что значит
Например
Код
Public Sub ShowAllSheetData(ByVal inBook As String, ByVal inSheet As String)
On Error Resume Next
    Application.Workbooks(inBook).Worksheets(inSheet).ShowAllData
End Sub
 
On Error Goto 0 после нужной строки отключает On Error Resume Next
Изменено: New - 02.08.2020 23:39:55
 
Андрей VG,
Понятно, вы имеете в виду - отдельной процедурой. New, спасибо.  
Изменено: Равик - 04.08.2020 11:41:10
 
Привет!
Цитата
Равик написал:
начались чудеса

Именуете Вы хорошо.

Вам поможет структурирование кода:
Разбейте код на процедуры, используя принцип единственной ответственности: - процедура должна делать что-то одно или чуть добавлять к входным параметрам = повысите понятность кода (хотя его может стать больше)
Вы получите возможность их тестировать по отдельности = уменьшите количество ошибок.

Пусть Ваша основная процедура состоит из вызовов процедур.

Вам поможет упрощение (отупливание) кода.
Код вида:
Код
Set Specs = Application.Workbooks(UZ).Sheets("Listing").Range(Cells(LastUsedCell.Row + 1, 1), Cells(LastUsedCell.Row + MassivDim + 1, 5))

сложный для анализа код.

Желательно его упонятить.
А хотя бы и так:
Код
Dim wsh As Worksheet
Dim cellLeft_ As Range
Dim cellRight As Range

Set wsh = Application.Workbooks(UZ).Sheets("Listing")
Set cellLeft_ = Cells(LastUsedCell.row + 1, 1)
Set cellRight = Cells(LastUsedCell.row + MassivDim + 1, 5)

Set Specs = wsh.Range(cellLeft_, cellRight)
Сравнение прайсов, таблиц - без настроек
Страницы: 1
Наверх