Страницы: 1
RSS
Проверка ячеек перед печатью только при наличии условия. Врачебное задание.
 
Здравствуйте уважаемые знатоки! Прошу не ругать меня за то, что размножаю темы, но я не могу найти пример именно для меня! Я врач, на работе имеется карта (документ), которую надо заполнять на каждого больного, но некоторые врачи "забывают " заполнять необходимые ячейки, уговоры не действуют, стиль отношения к работе такой.

Так вот, нужно, чтобы в случае если обязательные к заполнению ячейки не заполнены, то при нажатии на печать выводилось сообщение "заполните такую-то ячейку" и невозможно было напечатать именно текущий лист.
Причем, чтобы ячейка в сообщении называлась, например, не A1, а так как написано рядом с ячейкой, которую надо заполнить, например, "рост", "вес", "фио" и т.д.. В примере понятно.

И самое сложное: правило заполнять необходимые ячейки должно срабатывать только если хотя бы одна из каких-либо обязательных ячеек уже заполнена, т.е. чтобы невозможно было "недозаполнить" ячейки и распечатать лист.
Но если ни одна из обязательных ячеек не заполнена, то лист распечатать можно. Это нужно для того, чтобы можно было распечатать лист вообще без заполненных обязательных ячеек. Нам для работы, как ни странно, это тоже нужно.
И еще один парадокс, ячейки "дата операции" и "операция" должны быть или заполнены обе, или обе пусты, и это не должно мешать печати.

В примере ячейки, которые надо заполнять выделены цветом. Я понимаю, что возможно, меня отправят штудировать форум, но все же прошу помочь, т.к. я полный профан в этом деле, а задача для меня практически невыполнимая.

PS. В оригинале документа много макросов, все они записаны в рекодере, т.к я вообще не силен в VBA, также документ защищен и он находится в совместном доступе.
 
Цитата
Врачебное задание
Сразу подумалось о тесте в психдиспансере :)
В VBA есть аналог функции листа ЕСЛИ - If/Else/End If
Перед печатью наставить таких поверок - самое прростое решение.
 
Спасибо, конечно, за подсказку, но как поставить проверку перед печатью? Спасибо! Вы первый кто откликнулся!
Изменено: Игорь Григорьев - 06.03.2015 18:03:32
 
Код
Sub VerificationPrint()
    With Лист1
        If .Range("E2").Value = "" Then Exit Sub
        '...
    End With
    
    Call CardPrint '  макрос печати
End Sub

Типа такого. Если чего-то не туда-то (If-Then) - выходим из процедуры (Exit Sub). Если все в порядке: доходим до заветной строки с переходом к макросу печати.
With/End With - группирование одинаковых ссылок: чтобы не писать к каждой ссылке имя листа, да и с этим оператором код работает быстрее. Но не забывайте перед ссылкой ставить точку - она указывает на то, что последующее относится к родителю, указанному после With
Потом покажите созданное. Возможно, нужно будет подправить.
 
Ну и наверно можно заменить Лист1 на ActiveSheet верно?
 
Если лист активный, можно With не применять и точки не указывать.
Но! Eсли процедура каким-либо способом сможет быть вызвана из другого активного листа - ждите сюрпризов.
Поэтому если код пишется для конкретного листа, а не активного, ссылку на лист лучше указывать.

Так, как у меня - указано кодовое имя (не то, которое на ярлыке).
Ссылка на видимое имя: Worksheets("Лист1")
 
Спасибо, буду пробовать.:sceptic:
 
Не поняла про лист, писала для примера который вложен.
Реагирует на событие перед печатью.
Код скопировать в модуль книги.
(Я не знаю что такое происходит, но ваш файл увеличивается в 10 раз когда я его на своем компьютере сохраняю.)
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
c1 = Split("N1 E2 E3 L4 N4 U4 AC4")
c2 = Split("L1 A2 A3 K4 M4 T4 AA4")
operaz = Array(Range("E4"), Range("K3"), "Дата операции:")

ifAllEmpty = True
For i = 0 To UBound(c1)
    If Range(c1(i)) <> "" Then ifAllEmpty = False
Next
If operaz(0) <> "" And operaz(1) <> "" Then ifAllEmpty = False
If ifAllEmpty Then Exit Sub

For i = 0 To UBound(c1)
    If Range(c1(i)) = "" Then
        Range(c1(i)).Select
        MsgBox "Заполните ячейку " & Range(c2(i)) & _
                vbLf & "Печать отменена.", vbCritical, "Отмена печати"
        Cancel = True
        Exit Sub
    End If
Next
If operaz(0) = "" And operaz(1) <> "" Then
    MsgBox "Заполните ячейку " & operaz(3) & _
            vbLf & "Печать отменена.", vbCritical, "Отмена печати"
    Cancel = True
    Exit Sub
End If
End Sub

файл
Работать надо не 12 часов, а головой.
 
Попробую вставить. Оригинал весит около 5 Мб, со всеми листами и макросами :)
 
Leanna, огромное Вам человеческое спасибо! Код был слегка изменен (не выдавал запрос на заполнение возраста и даты операции, внес номера дополнительных ячеек), но Вы все правильно сделали! Какая сумма на яндекс называется благодарностью на данном форуме?
Изменено: Игорь Григорьев - 07.03.2015 13:20:04
 
Рада была оказаться полезной!
Насчет яндекс, это уже на ваше усмотрение)
Работать надо не 12 часов, а головой.
 
Ну у меня прям душа радуется, что есть такие добрые и отзывчивые люди, вы мне прям готовое решение дали! Еще раз спасибо! Сегодня я на дежурстве, завтра вас поблагодарю!
Страницы: 1
Наверх