Страницы: 1
RSS
Прописание проверочных условий в коде макроса
 
Доброго времени суток, уважаемые форумчане.
Прошу помощи в прописании проверочных условий при запуске макросов.

Есть 2 кнопки - Записать и Создать заказ

Кнопка Записать добавляет новые расчеты по клиентах - нужно добавить условие - проверять есть ли копируемое значение (название клиента)  в диапазоне А7 : А20 , если есть - работает по стандарту, если нет : 1) выдает сообщение - Создайте заказ и больше ничего не добавляет. Например, если добавить еще один расчет по клиенту Сергей - тогда должно выдать сообщение - Создайте заказ, а если снова Андрей - тогда добавлять.

Кнопка Создать заказ - копирует все расчеты по клиенту в лист Заказ. Нужно добавить условие - если заказ уже создан - выдавать сообщение - Заказ уже создан, создать новый - Да - Нет, если да-"затирает" уже созданный заказ, если нет - ничего не делает

Кнопка Записать:
Код
Sub Записать()

    Range("B2:B6").Select
    Selection.Copy
    Sheets("форма").Select
    NextRow = Range("A65536").End(xlUp).Row + 1
    Cells(NextRow, 1).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Range("B2:B6").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("B1").Select
End Sub
Кнопка Создать заказ:
Код
Sub Сохранить_заказ()

    Range("A8").Select
    Selection.Copy
    Sheets("заказ").Select
    Range("C3").Select
    ActiveSheet.Paste
    Sheets("форма").Select
    Range("B8:E19").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("заказ").Select
    Range("C5").Select
    ActiveSheet.Paste
    Range("C5").Select
    Sheets("форма").Select
    Range("A8:E9").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("B1").Select
End Sub
 
вам надо научиться пользоваться методом Find в своих макросах. Find - это поиск, которым вы пользуетесь, когда нажимаете Ctrl+F на листе Excel
почитайте комментарии зелёным цветом

Код
Dim Rng As Range, LastRow As Long, CustomerName As String

    With Worksheets("Форма") 'работаем с листом Форма
        CustomerName = .Range("B2") 'имя клиента из ячейки В2
        If CustomerName = vbNullString Then Exit Sub 'если ячейка В2 пустая, то выход
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка в столбце 1
        Set Rng = .Range("A7:A" & LastRow).Find(CustomerName, , xlFormulas, xlWhole) 'производим поиск в стобце А (от А7 и ниже)
        If Rng Is Nothing Then 'если клиента НЕ нашли, то сообщение и выход
            MsgBox "Клиента с именем: '" & CustomerName & "' в таблице нет!", vbExclamation, "Внимание"
            Exit Sub
        End If
    End With
Изменено: New - 25.11.2021 18:54:36
 
Спасибо, New.
Я думал о еще одном варианте, не знаю правда как синтаксис прописать в VBA. Проверять если имя из ячейки В2 <> имени из ячейки А8, тогда сообщение, что-то типа ниже
Код
        If значение В2 <> значению А8 Then
        MsgBox "Клиента с именем: &#39;" & CustomerName & "&#39; в таблице нет!", vbExclamation, "Внимание"
            Exit Sub
        End If
End With
Возможно это будет упрощенным вариантом, если так возможно?
 
Проверять-то можно, но я бы так не делал. Вот код. Обратите внимание на точки перед Range, они ставятся обязательно у объектов Range и Cells внутри блока With ... End With

Код
    With Worksheets("Форма")
        If .Range("B2").Value <> .Range("B8").Value Then
            MsgBox "Ячейки B2 и B8 не равны!", vbExclamation, "Внимание"
            Exit Sub
        End If
    End With
 
Не работает как я планировал - ни в моем варианте, ни в вашем.
Проблема в моем варианте - если нажали кнопку Создать заказ - тогда данные очистились - в ячейке А8 пусто, по условию уже А8 <> B2 далее не пропускает, а мне нужно чтоб когда очистили - можно было добавлять. Возможно дополнительно обьясню логику: считает менеджер изделия допустим Клиенту 1: посчитал 1-е изделие, нажал Записать - добавилось в строку А8, посчитал 2-е - добавилось в строку А9 и т.д. Далее, по правильному, менеджер должен бы нажать кнопку Создать заказ - и тогда все данные скопировались бы со строк А7, А8 ...+ очичстились строки. Если же менеджер забыл это сделать - тогда, если он посчитал Клиенту 2 - нужно сообщение и остановка макроса - типа защита от ошибки - далее менеджер создает заказ и только тогда он может снова записать уже по Клиенту 2.

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

Спасибо, что не закрываете повторно тему.

На счет темы - постарался выразить как есть - нужно прописать условия в макросе (для предотвращения ошибок менеджеров )

Возможно, слишком обобщенно указал - это может быть, просто не знаю как детали описать так как не понимаю как прописывать условия.

Просьба добавить в Правила форума примеры правильных названий(1 или 2 будет достаточно) - так будет быстрее определиться, особенно новичку.

Одну из задач я решил, спасибо еще раз New , код ниже (возможно немного криво, но работает и дает нужный результат)
Код
Sub Записать()
    With Worksheets("Форма")
        If .Range("B2").Value <> .Range("A8").Value And .Range("A8").Value <> "" Then
            MsgBox "Ячейки B2 и B8 не равны!", vbExclamation, "Внимание"
            Exit Sub
        End If
    End With
    Range("B2:B6").Select
    Selection.Copy
    Sheets("форма").Select
    NextRow = Range("A65536").End(xlUp).Row + 1
    Cells(NextRow, 1).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Range("B2:B6").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("B1").Select
End Sub
По второй кнопке - Создать заказ пока самостоятельно не могу решить (нужно добавить условие - если заказ уже создан - выдавать сообщение - Заказ уже создан, создать новый - Да - Нет, если да-"затирает" уже созданный заказ, если нет - ничего не делает)
 
Цитата
elas elas написал: Возможно, слишком обобщенно указал
Понимаете же... Примеры названий:
Извлечь фамилию каждого пятого ученика в синем костюме в каждом классе.
По осени пересчитать цыплят, оставшихся о выводков трех рыжих наседок.
Поотрубать через одного руки слепым нерадивым менеджерам.

В каждой из этих задач что-то нужно проверять на ошибки. Ваша задача какая?
 
Третий вариант был бы в самый раз .... только зрячим )))

Так как первый вопрос решен, тогда по второму нужно Проверка макросом наличия ранее созданного заказа (конкретно в моем примере - проверять при нажатии на кнопку Создать заказ - пуста ли ячейка С3 на листе заказ , если  не пустая (заказ ранее создан) - выдавать сообщение - Заказ уже создан, создать новый - Да - Нет, если да-"затирает" уже созданный заказ, если нет - ничего не делает)  
Страницы: 1
Наверх