Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 22.11.2011
Сообщений: 18
1

Обработка события Change на листе - что я делаю не так?

23.03.2014, 18:29. Показов 1806. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, помогите, пожалуйста!
Заклинило на вроде бы простой вещи (неважные детали опускаю). В таблицу на листе вводятся числа. Хочу сделать так: если число совсем уж неподходящее (по смыслу данных в таблице), например, больше 50, то издается звук, число стирается и курсор ставится в ту же ячейку. Если число подозрительное, но возможное, (например, >25 и <50)то издается другой звук, число помечается цветом, курсор также возвращается в ту же ячейку. И если число правильное (<=25) то ничего не происходит.
Для вывода звука через системный динамик вставляю строку:
Visual Basic
1
Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Далее - Обработка события Change на листе:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim rw As Integer, col As Integer, tmp As Variant
 
' координаты ячейки, в которой сделаны изменения:
    rw = Target.Row
    col = Target.Column
 
    Cells(rw, col).Value = Trim(Cells(rw, col).Value)
    tmp = Cells(rw, col).Value
 
    ' проверяем значение в измененной ячейке
                If tmp <> "" Then
                    If IsNumeric(tmp) = True Then
                        If tmp <= 0 Or tmp > 50 Then ' недопустимое значение в ячейке
                            Application.EnableEvents = False
                            Beep 100, 300
                            Cells(rw, col).Value = ""   ' стираем содержимое ячейки
                            Cells(rw, col).Activate    ' возвращаемся в эту ячейку
                            Application.EnableEvents = True
                        ElseIf tmp > 25 Then ' подозрительное значение в ячейке
                            Application.EnableEvents = False
                            Beep 1000, 300
                            Cells(rw, col).Font.ColorIndex = 3 ' красный цвет числа в ячейке 
                            Cells(rw, col).Activate
                            Application.EnableEvents = True
                        else ' правильное значение чмсла в ячейке
                            Application.EnableEvents = False
                            Cells(rw, col).Font.ColorIndex = 0 ' сброс цвета шрифта на по умолчанию 
                            Application.EnableEvents = True
                        End If
                    Else ' в ячейке не число
                        Beep 100, 300
                        Application.EnableEvents = False
                        Cells(rw, col).Value = ""
                        Cells(rw, col).Activate
                        Application.EnableEvents = True
                    End If
                End If ' конец tmp <> ""
 
end sub
Eсли введено недопустимое значение (не число, или <=0, или >50), то все ОК - программа "гукает" и возвращает курсор в очищенную ячейку. А вот при вводе подозрительного значения проблема - программа пищит непрерывно, и зависает. Что я делаю не так? И как сделать правильно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2014, 18:29
Ответы с готовыми решениями:

Обработка события на листе
День добрый, коллеги, Какой в VBA обработчкик событий на листе/книге? 1. При активации листа?...

ComboBox.Change не срабатывает. Что не так?
Есть еще один вопросик. Перед открытием формы в ComboBox динамически заполняются пункты. И мне...

Что-то не то с Майкрсофт визуал студио 2010 или я что-то не так делаю
Дело в том что при запуске вот этой программы: #include &lt;iostream&gt; using namespace std; int main...

Хотелось бы, чтоб по нажатию на кнопку что-то происходило. Но, Увы! Что я делаю не так?
Пытаюсь начать осваивать jQuery. Создал вот такой текст. (убрал лишнее) &lt;html&gt;&lt;head&gt; &lt;script&gt; ...

3
15146 / 6419 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
23.03.2014, 18:52 2
Поставьте Application.EnableEvents = False один раз в начале и Application.EnableEvents = True один раз в конце, а в других местах уберите.

Добавлено через 4 минуты
Ваш Cells(rw, col) это и есть Target, если была изменена одна ячейка. Получается следующее:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim tmp
Application.EnableEvents = False
Set Target = Target(1)  'первая ячейка Target
tmp = Target.Value
Target.Value = Trim(tmp)
 
' проверяем значение в измененной ячейке
If tmp <> "" Then
  If IsNumeric(tmp) Then
    If tmp <= 0 Or tmp > 50 Then  ' недопустимое значение в ячейке
      Beep 100, 300
      Target.Value = ""  ' стираем содержимое ячейки
      Target.Activate  ' возвращаемся в эту ячейку
    ElseIf tmp > 25 Then  ' подозрительное значение в ячейке
      Beep 1000, 300
      Target.Font.ColorIndex = 3  ' красный цвет числа в ячейке
      Target.Activate
    Else  ' правильное значение чмсла в ячейке
      Target.Font.ColorIndex = 0  ' сброс цвета шрифта на по умолчанию
    End If
  Else  ' в ячейке не число
    Beep 100, 300
    Target.Value = ""
    Target.Activate
  End If
End If  ' конец tmp <> ""
Application.EnableEvents = True
End Sub
1
0 / 0 / 0
Регистрация: 22.11.2011
Сообщений: 18
23.03.2014, 19:18  [ТС] 3
Спасибо большое, Казанский, который раз Вы мне помогаете, все заработало
0
здесь больше нет...
3374 / 1672 / 184
Регистрация: 03.02.2010
Сообщений: 1,219
23.03.2014, 20:30 4
Цитата Сообщение от BMF Посмотреть сообщение
Eсли введено недопустимое значение (не число, или <=0, или >50), то все ОК
этот код ни при каких обстоятельствах не OK

Visual Basic
1
Cells(rw, col).Value = Trim(Cells(rw, col).Value)
= бесконечный цикл


попробуй выделить диапазон, ввести число >50 и нажать Ctrl+Enter
0
23.03.2014, 20:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2014, 20:30
Помогаю со студенческими работами здесь

Что делаю не так
Уважаемые участники форума! Пдскажите пожалуйста, какие ошибки по оптимизации сайта ...

Что я делаю не так?
Я даже на калькуляторе пересчитал там 100% всё правильно, а сайт говорит что ответ другой......

Что я делаю не так?
Подкорректировать JS так, чтобы при вызове данного счетчика с любого сайта : ...

Что я делаю не так?
public class Evklid { public static void main(String args) { System.out.println(gcd (int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru