Добрый вечер. При помощи добрых людей с данного форума создал файлик учета рабочего времени. При помощи кнопок вводятся значения и время. Как сделать чтобы при нажатии двух кнопок "Приладка" или "Печать тиража", если не стоит кол-во листов в столбце G , макрос с кнопки не выполнялся, то есть ничего не происходило, а лучше вылазило окно предупреждения? И соответственно если есть число, то кнопка работала. Заранее спасибо!
Добрый вечер. При помощи добрых людей с данного форума создал файлик учета рабочего времени. При помощи кнопок вводятся значения и время. Как сделать чтобы при нажатии двух кнопок "Приладка" или "Печать тиража", если не стоит кол-во листов в столбце G , макрос с кнопки не выполнялся, то есть ничего не происходило, а лучше вылазило окно предупреждения? И соответственно если есть число, то кнопка работала. Заранее спасибо!SergejSor
если стоит "Приладка" или Печать тиража, то нельзя нажать другие кнопки, пока не поставлена цифра рядом...
А теперь по порядку: почему не стоит и где цифры рядом? Нужно определять последнюю заполненную строку? Если да, то по какому столбцу? Нужна любая строка? Если да, как ее определять?
Quote (SergejSor)
если стоит "Приладка" или Печать тиража, то нельзя нажать другие кнопки, пока не поставлена цифра рядом...
А теперь по порядку: почему не стоит и где цифры рядом? Нужно определять последнюю заполненную строку? Если да, то по какому столбцу? Нужна любая строка? Если да, как ее определять?vikttur
Сообщение отредактировал vikttur - Среда, 05.09.2012, 22:42
По порядку... Если нажать какую нибудь кнопку, наверху, то произойдет закрытие предыдущей операции и начало следующей с постановкой текущего времени, и времени сколько эта операция выполнялась. В столбец G проставляются количество листов (например сколько отпечатал), так вот если последней в столбце I стоит "Приладка" или "Печать тиража", то пока не проставлено количество листов в столбец G, (например I4 последний, G4 куда должно быть поставлено кол-во листов), не одна кнопка сверху не должна работать, или выводить сообщение об ошибке. Проще пока не проставлено количество листов, 2 этих операции нельзя было закрыть...
По порядку... Если нажать какую нибудь кнопку, наверху, то произойдет закрытие предыдущей операции и начало следующей с постановкой текущего времени, и времени сколько эта операция выполнялась. В столбец G проставляются количество листов (например сколько отпечатал), так вот если последней в столбце I стоит "Приладка" или "Печать тиража", то пока не проставлено количество листов в столбец G, (например I4 последний, G4 куда должно быть поставлено кол-во листов), не одна кнопка сверху не должна работать, или выводить сообщение об ошибке. Проще пока не проставлено количество листов, 2 этих операции нельзя было закрыть...SergejSor
Sub verification() Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Таки надо вписать!" ---здесь какие-то действия (игнорировать кнопку, уничтожить файл и монитор)--- End If End If End With End Sub
[/vba] Вызов этого кода прицепить к процедурам выполнения действий по каждой кнопке.
Такой кусочек кода: [vba]
Code
Sub verification() Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Таки надо вписать!" ---здесь какие-то действия (игнорировать кнопку, уничтожить файл и монитор)--- End If End If End With End Sub
[/vba] Вызов этого кода прицепить к процедурам выполнения действий по каждой кнопке.vikttur
Сообщение отредактировал vikttur - Среда, 05.09.2012, 23:22
Спасибо!!! Есть только один нюанс, при нажатии кнопки ОК, кнопка все таки выполняет макрос, чего то я не правильно сделал... Sub Приладка() '
'
'
Sub verification() Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Таки надо вписать!" ---здесь какие-то действия (игнорировать кнопку, уничтожить файл и монитор)--- End If End If End With
Range("R1").Value = "приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save
End Sub
Спасибо!!! Есть только один нюанс, при нажатии кнопки ОК, кнопка все таки выполняет макрос, чего то я не правильно сделал... Sub Приладка() '
'
'
Sub verification() Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Таки надо вписать!" ---здесь какие-то действия (игнорировать кнопку, уничтожить файл и монитор)--- End If End If End With
Range("R1").Value = "приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save
Sub verification() Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Таки надо вписать!"
End If End If End With
Range("R1").Value = "Приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save
End Sub
[/vba]
Не хочет работать...(
[vba]
Code
Sub Приладка()
Sub verification() Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Таки надо вписать!"
End If End If End With
Range("R1").Value = "Приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save
Sub verification() Dim cell As Long With Worksheets("Лист2") Set cell = .Cells(.Rows.Count, "I").End(xlUp) If .Range("I" & cell).Value = "Приладка" Or _ .Range("I" & cell).Value = "Печать тиража" Then If .Range("G" & cell).Value = "" Then MsgBox "Òàêè íàäî âïèñàòü!" Exit Sub End If End If End With
Range("R1").Value = "приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save Exit Sub End Sub
[/vba]
Вот код : [vba]
Code
Sub Приладка() '
Sub verification() Dim cell As Long With Worksheets("Лист2") Set cell = .Cells(.Rows.Count, "I").End(xlUp) If .Range("I" & cell).Value = "Приладка" Or _ .Range("I" & cell).Value = "Печать тиража" Then If .Range("G" & cell).Value = "" Then MsgBox "Òàêè íàäî âïèñàòü!" Exit Sub End If End If End With
Range("R1").Value = "приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save Exit Sub End Sub
Так неправильно. Или вставлять код без Sub/End Sub в другую процедуру, или вызывать выполнение макроса.
Недостаток первого варианта: к коду каждой кнопки нужно добавлять одинаковый фрагмент. Недостаток второго: нужно как-то передать в вызывающую процедуру сигнал о том, что данные не заполнены. Можно в общем модуле, перед макросами задать переменную: [vba]
Code
Public verif As Byte
[/vba]
В коде проверки добавить пару строк после вызова сообщения: [vba]
Code
MsgBox "Таки надо вписать!" verif=1 Exit Sub
[/vba]
В вызывающей процедуре тоже добавить пару строк: [vba]
Code
Sub Приладка() Call verification If verif=1 Then verif=0 Exit Sub End If .......................
[/vba]
не оптимально, но... как придумалось.
Так неправильно. Или вставлять код без Sub/End Sub в другую процедуру, или вызывать выполнение макроса.
Недостаток первого варианта: к коду каждой кнопки нужно добавлять одинаковый фрагмент. Недостаток второго: нужно как-то передать в вызывающую процедуру сигнал о том, что данные не заполнены. Можно в общем модуле, перед макросами задать переменную: [vba]
Code
Public verif As Byte
[/vba]
В коде проверки добавить пару строк после вызова сообщения: [vba]
Code
MsgBox "Таки надо вписать!" verif=1 Exit Sub
[/vba]
В вызывающей процедуре тоже добавить пару строк: [vba]
Code
Sub Приладка() Call verification If verif=1 Then verif=0 Exit Sub End If .......................
Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Что надо ниписать" Exit Sub End If End If End With
Range("R1").Value = "Приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save Exit Sub End Sub
[/vba]
Вот такой код вроде работает.... [vba]
Code
Sub Приладка() '
Dim lRws As Long With Worksheets("Лист2") lRws = .Cells(Rows.Count, "I").End(xlUp).Row If .Range("I" & lRws).Value = "Приладка" Or _ .Range("I" & lRws).Value = "Печать тиража" Then If .Range("G" & lRws).Value = "" Then MsgBox "Что надо ниписать" Exit Sub End If End If End With
Range("R1").Value = "Приладка" Range("K2").Select ActiveCell.FormulaR1C1 = Now - Date Range("K2").Select ActiveWorkbook.Save Exit Sub End Sub
Так работает, но при таком варианте блок кода нужно вставлять в макрос выполнения каждой команды.
В приложении пример с пользовательской функцией. Одинаковый код со всех макросов вынес в отдельную процедуру. Так намного компактнее. Не проверял все значения, вводимые в ячейки (в теме автор пишет "Печать тиража", проверка по "Печать Тиража", "Простой" и "Постой"...) В макросах вставки фамилий: в ссылках типа Range("R3").Value = "Плотников Е" лучше указывать лист, иначе при выполнении макроса при другом активном листе фамилия будет вставлена на этот лист. Если уж заполнение поручено макросам, нужно запретить ручной ввод данных в столбец I. Посмотрите варианты оформления сообщений.
Функцию и общий макрос можно было объединить в одну процедуру, но это для меня тренировочное задание, так показалось интереснее. Критические замечания спецов приветствуются. Правильно ли размещение сообщения в теле UDF? Оно работает... Но ведь назначение функций - выдача определенного результата, а здесь получается промежуточная остановка.
Quote (nerv)
lRws = ... заменить на Set cell = ... что позволяет избавиться от лишней порнографии
Так лучше, но не сообразил, как проверить ячейку G, кроме как через Offset.
Так работает, но при таком варианте блок кода нужно вставлять в макрос выполнения каждой команды.
В приложении пример с пользовательской функцией. Одинаковый код со всех макросов вынес в отдельную процедуру. Так намного компактнее. Не проверял все значения, вводимые в ячейки (в теме автор пишет "Печать тиража", проверка по "Печать Тиража", "Простой" и "Постой"...) В макросах вставки фамилий: в ссылках типа Range("R3").Value = "Плотников Е" лучше указывать лист, иначе при выполнении макроса при другом активном листе фамилия будет вставлена на этот лист. Если уж заполнение поручено макросам, нужно запретить ручной ввод данных в столбец I. Посмотрите варианты оформления сообщений.
Функцию и общий макрос можно было объединить в одну процедуру, но это для меня тренировочное задание, так показалось интереснее. Критические замечания спецов приветствуются. Правильно ли размещение сообщения в теле UDF? Оно работает... Но ведь назначение функций - выдача определенного результата, а здесь получается промежуточная остановка.
Quote (nerv)
lRws = ... заменить на Set cell = ... что позволяет избавиться от лишней порнографии
Так лучше, но не сообразил, как проверить ячейку G, кроме как через Offset.vikttur