Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Запрет выполнение макроса, если нет числа в ячейке - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Запрет выполнение макроса, если нет числа в ячейке
SergejSor Дата: Среда, 05.09.2012, 20:46 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Добрый вечер. При помощи добрых людей с данного форума создал файлик учета рабочего времени. При помощи кнопок вводятся значения и время. Как сделать чтобы при нажатии двух кнопок "Приладка" или "Печать тиража", если не стоит кол-во листов в столбце G , макрос с кнопки не выполнялся, то есть ничего не происходило, а лучше вылазило окно предупреждения? И соответственно если есть число, то кнопка работала. Заранее спасибо!
 
Ответить
СообщениеДобрый вечер. При помощи добрых людей с данного форума создал файлик учета рабочего времени. При помощи кнопок вводятся значения и время. Как сделать чтобы при нажатии двух кнопок "Приладка" или "Печать тиража", если не стоит кол-во листов в столбце G , макрос с кнопки не выполнялся, то есть ничего не происходило, а лучше вылазило окно предупреждения? И соответственно если есть число, то кнопка работала. Заранее спасибо!

Автор - SergejSor
Дата добавления - 05.09.2012 в 20:46
vikttur Дата: Среда, 05.09.2012, 22:09 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

[vba]
Code
If G1="" Then Exit Sub
[/vba]
Вместо Exit Sub можно сообщение - MsgBox


Сообщение отредактировал vikttur - Среда, 05.09.2012, 22:19
 
Ответить
Сообщение[vba]
Code
If G1="" Then Exit Sub
[/vba]
Вместо Exit Sub можно сообщение - MsgBox

Автор - vikttur
Дата добавления - 05.09.2012 в 22:09
SergejSor Дата: Среда, 05.09.2012, 22:16 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

это понятно, но задача такова, что если стоит "Приладка" или Печать тиража, то нельзя нажать другие кнопки, пока не поставлена цифра рядом...
 
Ответить
Сообщениеэто понятно, но задача такова, что если стоит "Приладка" или Печать тиража, то нельзя нажать другие кнопки, пока не поставлена цифра рядом...

Автор - SergejSor
Дата добавления - 05.09.2012 в 22:16
vikttur Дата: Среда, 05.09.2012, 22:18 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Как попробовать нажать кнопки без Вашего примера?
 
Ответить
СообщениеКак попробовать нажать кнопки без Вашего примера?

Автор - vikttur
Дата добавления - 05.09.2012 в 22:18
SergejSor Дата: Среда, 05.09.2012, 22:28 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Эхх блин ... вроде файл прикреплял....
 
Ответить
СообщениеЭхх блин ... вроде файл прикреплял....

Автор - SergejSor
Дата добавления - 05.09.2012 в 22:28
SergejSor Дата: Среда, 05.09.2012, 22:29 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

размер большой...
 
Ответить
Сообщениеразмер большой...

Автор - SergejSor
Дата добавления - 05.09.2012 в 22:29
SergejSor Дата: Среда, 05.09.2012, 22:33 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Вот...
К сообщению приложен файл: Test.rar (59.8 Kb)
 
Ответить
СообщениеВот...

Автор - SergejSor
Дата добавления - 05.09.2012 в 22:33
vikttur Дата: Среда, 05.09.2012, 22:40 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Quote (SergejSor)
если стоит "Приладка" или Печать тиража, то нельзя нажать другие кнопки, пока не поставлена цифра рядом...

А теперь по порядку: почему не стоит и где цифры рядом?
Нужно определять последнюю заполненную строку? Если да, то по какому столбцу?
Нужна любая строка? Если да, как ее определять?


Сообщение отредактировал vikttur - Среда, 05.09.2012, 22:42
 
Ответить
Сообщение
Quote (SergejSor)
если стоит "Приладка" или Печать тиража, то нельзя нажать другие кнопки, пока не поставлена цифра рядом...

А теперь по порядку: почему не стоит и где цифры рядом?
Нужно определять последнюю заполненную строку? Если да, то по какому столбцу?
Нужна любая строка? Если да, как ее определять?

Автор - vikttur
Дата добавления - 05.09.2012 в 22:40
SergejSor Дата: Среда, 05.09.2012, 22:53 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

По порядку... Если нажать какую нибудь кнопку, наверху, то произойдет закрытие предыдущей операции и начало следующей с постановкой текущего времени, и времени сколько эта операция выполнялась. В столбец G проставляются количество листов (например сколько отпечатал), так вот если последней в столбце I стоит "Приладка" или "Печать тиража", то пока не проставлено количество листов в столбец G, (например I4 последний, G4 куда должно быть поставлено кол-во листов), не одна кнопка сверху не должна работать, или выводить сообщение об ошибке. Проще пока не проставлено количество листов, 2 этих операции нельзя было закрыть...
 
Ответить
СообщениеПо порядку... Если нажать какую нибудь кнопку, наверху, то произойдет закрытие предыдущей операции и начало следующей с постановкой текущего времени, и времени сколько эта операция выполнялась. В столбец G проставляются количество листов (например сколько отпечатал), так вот если последней в столбце I стоит "Приладка" или "Печать тиража", то пока не проставлено количество листов в столбец G, (например I4 последний, G4 куда должно быть поставлено кол-во листов), не одна кнопка сверху не должна работать, или выводить сообщение об ошибке. Проще пока не проставлено количество листов, 2 этих операции нельзя было закрыть...

Автор - SergejSor
Дата добавления - 05.09.2012 в 22:53
vikttur Дата: Среда, 05.09.2012, 23:11 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Такой кусочек кода:
[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 - Среда, 05.09.2012, 23:22
 
Ответить
СообщениеТакой кусочек кода:
[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
Дата добавления - 05.09.2012 в 23:11
SergejSor Дата: Среда, 05.09.2012, 23:16 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Спасибо!!! Есть только один нюанс, при нажатии кнопки ОК, кнопка все таки выполняет макрос, чего то я не правильно сделал...
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


Сообщение отредактировал SergejSor - Среда, 05.09.2012, 23:20
 
Ответить
СообщениеСпасибо!!! Есть только один нюанс, при нажатии кнопки ОК, кнопка все таки выполняет макрос, чего то я не правильно сделал...
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

Автор - SergejSor
Дата добавления - 05.09.2012 в 23:16
vikttur Дата: Среда, 05.09.2012, 23:20 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Естественно, после закрытия сообщения процедура продолжает выполняться.
Код подправил (см. сообщение выше)

Оформляйте код тэгами (кнопка-диез (решеточка))


Сообщение отредактировал vikttur - Среда, 05.09.2012, 23:24
 
Ответить
СообщениеЕстественно, после закрытия сообщения процедура продолжает выполняться.
Код подправил (см. сообщение выше)

Оформляйте код тэгами (кнопка-диез (решеточка))

Автор - vikttur
Дата добавления - 05.09.2012 в 23:20
SergejSor Дата: Среда, 05.09.2012, 23:26 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Не хочет работать...(

[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

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

End Sub
[/vba]

Автор - SergejSor
Дата добавления - 05.09.2012 в 23:26
nerv Дата: Среда, 05.09.2012, 23:31 | Сообщение № 14
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

[vba]
Code
lRws = .Cells(Rows.Count, "I").End(xlUp).Row
[/vba]
=
[vba]
Code
Set cell = .Cells(.Rows.Count, "I").End(xlUp)
[/vba]
что позволяет избавиться от лишней порнографии

Проверку лучше вынести в отдельную функцию и назвать ее, например, IsValid().
(если предполагается, что ее код будет расти)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение[vba]
Code
lRws = .Cells(Rows.Count, "I").End(xlUp).Row
[/vba]
=
[vba]
Code
Set cell = .Cells(.Rows.Count, "I").End(xlUp)
[/vba]
что позволяет избавиться от лишней порнографии

Проверку лучше вынести в отдельную функцию и назвать ее, например, IsValid().
(если предполагается, что ее код будет расти)

Автор - nerv
Дата добавления - 05.09.2012 в 23:31
SergejSor Дата: Среда, 05.09.2012, 23:35 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Чего то я запутался... При выполнении макроса он говорит compile error: Expected End Sub
 
Ответить
СообщениеЧего то я запутался... При выполнении макроса он говорит compile error: Expected End Sub

Автор - SergejSor
Дата добавления - 05.09.2012 в 23:35
SergejSor Дата: Среда, 05.09.2012, 23:39 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Вот код : [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
[/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
[/vba]

Автор - SergejSor
Дата добавления - 05.09.2012 в 23:39
vikttur Дата: Среда, 05.09.2012, 23:47 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Так неправильно.
Или вставлять код без 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]

не оптимально, но... как придумалось.


Сообщение отредактировал vikttur - Среда, 05.09.2012, 23:51
 
Ответить
СообщениеТак неправильно.
Или вставлять код без 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]

не оптимально, но... как придумалось.

Автор - vikttur
Дата добавления - 05.09.2012 в 23:47
SergejSor Дата: Среда, 05.09.2012, 23:53 | Сообщение № 18
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Чего то я не понимаю... и много.. Если не трудно Как будет выглядеть полный код?
 
Ответить
СообщениеЧего то я не понимаю... и много.. Если не трудно Как будет выглядеть полный код?

Автор - SergejSor
Дата добавления - 05.09.2012 в 23:53
SergejSor Дата: Четверг, 06.09.2012, 00:07 | Сообщение № 19
Группа: Пользователи
Ранг: Новичок
Сообщений: 49
Репутация: 0 ±
Замечаний: 0% ±

Вот такой код вроде работает....
[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
[/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
[/vba]

Автор - SergejSor
Дата добавления - 06.09.2012 в 00:07
vikttur Дата: Четверг, 06.09.2012, 11:44 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Так работает, но при таком варианте блок кода нужно вставлять в макрос выполнения каждой команды.

В приложении пример с пользовательской функцией.
Одинаковый код со всех макросов вынес в отдельную процедуру. Так намного компактнее.
Не проверял все значения, вводимые в ячейки (в теме автор пишет "Печать тиража", проверка по "Печать Тиража", "Простой" и "Постой"...)
В макросах вставки фамилий: в ссылках типа Range("R3").Value = "Плотников Е" лучше указывать лист, иначе при выполнении макроса при другом активном листе фамилия будет вставлена на этот лист.
Если уж заполнение поручено макросам, нужно запретить ручной ввод данных в столбец I.
Посмотрите варианты оформления сообщений.

Функцию и общий макрос можно было объединить в одну процедуру, но это для меня тренировочное задание, так показалось интереснее. Критические замечания спецов приветствуются.
Правильно ли размещение сообщения в теле UDF? Оно работает... Но ведь назначение функций - выдача определенного результата, а здесь получается промежуточная остановка.
Quote (nerv)
lRws = ... заменить на Set cell = ...
что позволяет избавиться от лишней порнографии

Так лучше, но не сообразил, как проверить ячейку G, кроме как через Offset.
К сообщению приложен файл: Test.xlsm (36.8 Kb)


Сообщение отредактировал vikttur - Четверг, 06.09.2012, 12:03
 
Ответить
СообщениеТак работает, но при таком варианте блок кода нужно вставлять в макрос выполнения каждой команды.

В приложении пример с пользовательской функцией.
Одинаковый код со всех макросов вынес в отдельную процедуру. Так намного компактнее.
Не проверял все значения, вводимые в ячейки (в теме автор пишет "Печать тиража", проверка по "Печать Тиража", "Простой" и "Постой"...)
В макросах вставки фамилий: в ссылках типа Range("R3").Value = "Плотников Е" лучше указывать лист, иначе при выполнении макроса при другом активном листе фамилия будет вставлена на этот лист.
Если уж заполнение поручено макросам, нужно запретить ручной ввод данных в столбец I.
Посмотрите варианты оформления сообщений.

Функцию и общий макрос можно было объединить в одну процедуру, но это для меня тренировочное задание, так показалось интереснее. Критические замечания спецов приветствуются.
Правильно ли размещение сообщения в теле UDF? Оно работает... Но ведь назначение функций - выдача определенного результата, а здесь получается промежуточная остановка.
Quote (nerv)
lRws = ... заменить на Set cell = ...
что позволяет избавиться от лишней порнографии

Так лучше, но не сообразил, как проверить ячейку G, кроме как через Offset.

Автор - vikttur
Дата добавления - 06.09.2012 в 11:44
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!