Страницы: 1
RSS
Макрос: Почему при нажатии на кнопку "Отмена" выскакивает ошибка, а не отменяется макрос?
 
Здравствуйте. Может кто поможет, почему при нажатии на кнопки "Отмены" на различных этапах макроса выскакивает ошибка, а не отменяется макрос? Вот код:
Код
Public itog

Sub Кнопка2_Щелчок()
    With Sheets("Игрушки")
        x = InputBox("Введите штрих-код", "Поиск штрих-кода")
        If VarType(x) = vbBoolean Then Exit Sub
        x = "*" & x & "*"
        Dim cell As Range
        Set cell = .Columns(3).Find(What:=x, LookIn:=xlValues, LookAt:=xlWhole)
         
        If cell Is Nothing Then
            MsgBox "Штрих-код не найден", vbCritical
            Exit Sub
        Else
            y1 = cell.Offset(0, 2) - cell.Offset(0, 10)
            y = InputBox(cell.Offset(0, 1) & vbCrLf & "Введите количество товара" & vbCrLf & "Осталось: " & y1 & "шт.", "Количество товара")
            If VarType(y) = vbBoolean Then
                Exit Sub
            Else
                cell.Offset(0, 10) = cell.Offset(0, 10) + CDbl(y)
            End If
            Z = InputBox("Введите цену товара" & vbCrLf & "Закупочная цена: " & Format(cell.Offset(0, 6), "#,##0.00") & " руб." & vbCrLf & "Цена: " & Format(cell.Offset(0, 7), "#,##0.00") & " руб.", "Цена товара")
            If VarType(Z) = vbBoolean Then
                Exit Sub
            Else
                cell.Offset(0, 9) = cell.Offset(0, 9) + CDbl(Z)
                itog = itog + CDbl(Z)
            End If
        End If
        
        Dim xx
        xx = MsgBox("Необходимо найти еще один штрих-код?", vbYesNo, "Поиск штрих-кода")
        If xx = 6 Then
            Кнопка2_Щелчок
        Else
            MsgBox "Общая сумма " & itog & " руб.", vbOKOnly
        End If
        
        If cell.Offset(0, 10) = cell.Offset(0, 2) Then
            With Union(cell.Offset(0, 1), cell.Offset(0, 2)).Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 255
            .TintAndShade = 0
            .PatternTintAndShade = 0
            End With
        End If
        
    End With
End Sub
Спасибо за помощь.
 
А пример, в котором код?
Кнопка отмены - это в MsgBox?
 
vikttur, да
 
Цитата
Zelen35 написал:
vikttur , да
Уверены?
По вопросам из тем форума, личку не читаю.
 
Может всё же InputBox?
 
Здесь вообще много стремного в работе с InputBox.
Но, самое главное, что при нажатии кнопки отмена, в данном случае условие
Код
If VarType(y) = vbBoolean

не выполнится никогда, ибо в VarType(y) = vbBoolean может быть преобразован 0, а не пустая строка. Для Z аналогично.
Малой кровью
Код
If y = ""
 
InputBox всегда возвращает текст. ВСЕГДА. Поэтому проверять его на VarType(x) = vbBoolean бессмысленно. Поэтому правильно делать так:
Код
If StrPtr(x) = 0 Then Exit Sub
Здесь описывал работу с InputBox подробно: Работа с диалогами
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Юрий М, да InputBox. Что-то тупанул. Извиняюсь.
 
Юрий М, да InputBox. Что-то тупанул. Извиняюсь.

Дмитрий(The_Prist) Щербаков,спасибо за помощь, статью осмотрел. Получил для себя определенную информацию. Но этот код:
Код
If StrPtr(x) = 0 Then Exit Sub
не совсем то что надо.
Он не отменят макрос, а просто закрывает, а необходимо, чтобы при нажатии на кнопку "Отмена" отменялось все что было введено во всех "InputBox" и закрывался макрос.
 
Цитата
Zelen35 написал:
отменялось все что было введено во всех "InputBox" и закрывался макрос.
неожиданно.
По вопросам из тем форума, личку не читаю.
 
Цитата
Zelen35 написал:
отменялось все что было введено во всех "InputBox" и закрывался макрос
поясните. Как это отменить одним INputBox все предыдущие и еще ЗАКРЫТЬ МАКРОС? А как его открыли? Если включить телепатию, то возможно вместо Exit Sub надо применить End:
Код
If StrPtr(x) = 0 Then End

Цитата
Zelen35 написал:
не совсем то что надо
все то, просто надо уметь это использовать :)
Изменено: Дмитрий(The_Prist) Щербаков - 22.10.2019 18:41:59
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
БМВ,при всем уважении, я же не программист. Есть какие-то минимальные познания в VBA и все. Если бы я все сам умел, то не обращался бы за помощью. Я так понимаю - это нельзя сделать, чтобы в любом "InputBox" при нажатии на "Отмену" отменялось все ранее введенное?
 
Zelen35, так и я не программист, просто термин отменить все сделанное макросом отличен от отменить макрос. Собственно по этому и написал что неожиданно что именно это требовалось и думаю этого не ожидал никто.
Сделать можно, но это нужно предусмотреть и протоколировать изменений, которые при отмене вернуть в обратном порядке.
По вопросам из тем форума, личку не читаю.
 
Цитата
Zelen35 написал:
необходимо, чтобы при нажатии на кнопку "Отмена" отменялось все что было введено во всех "InputBox" и закрывался макрос.
При принудительном выходе из процедуры (exit Sub) никаких данных, введённых в InputBox, естественно, не останется. Как и самих InputBox, Это именно то, что Вы просите по цитате. Но все действия, которые макрос выполнил на листах, не отменятся.
Попробуйте переформулировать задачу.
 
Юрий М, я конечно извиняюсь, но зачем переформулировать, если вы и так поняли вопрос?)) Давайте название темы поменяю, если это возможно.
 
Цитата
Zelen35 написал:
зачем переформулировать, если вы и так поняли вопрос?
Как раз и не понял: Вы хотите сбросить значения всех переменных из InputBox (они и так сбросятся) или отменить все действия, которые уже сделал макрос?
Название темы самостоятельно Вы поменять не сможете, а вот предложить новое - пожалуйста ))
 
Zelen35, ответ на поставленный вопрос был дан до 7 сообщения включительно, а вот завуалированный - ну явно не относится к первоначальному вопросу.
По вопросам из тем форума, личку не читаю.
 
Сделайте проще: запомните все запрашиваемые через InputBox данные и записывайте их в ячейки только после того, как все InputBox-ы были успешно обработаны. Тогда и городить с отменами ничего не надо будет.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо за подсказку. Неплохая идея. Попробую сделать.
 
Тему-то как назовем?
 
vikttur, да может закройте её. Вроде бы кто-то выше писал, что ответ уже в 7-м сообщении был дан.  :)  
Страницы: 1
Наверх