Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
17.04.2024, 00:25:18

Войти
Хотите поблагодарить участника за дельный совет? Нажмите [Повысить]. Так вы заслуженно поднимите репутацию активному участнику.
33 240 Сообщений в 5 456 Тем от 6 756 Пользователей
Последний пользователь: Expert2024
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Не работает событие и вылезает ошибка
Страниц: [1]   Вниз
Печать
Автор Тема: Не работает событие и вылезает ошибка  (Прочитано 3946 раз)
0 Пользователей и 1 Гость смотрят эту тему.
telesh
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля
« : 08.05.2018, 04:11:01 »

 Вылезла ошибка, макрос какой то косячный получается, немогу добиться лучшего. При забивании в ячейку L и М должен срабатывать макрос и расчитываться одна строкаа в итоге срабатывает весь макрос до 100 ячейки
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 830



Просмотр профиля WWW
« Ответ #1 : 08.05.2018, 09:02:33 »

расчитываться одна строкаа в итоге срабатывает весь макрос до 100 ячейки
Каким образом, если у Вас там цикл от 1 до 100 (For I = 1 To 100)? И в этом цикле Вы как раз от 1 до 10 ячейкам значения назначаете. Например здесь:
Код: (vb)
        Cells(2 + I, 2) = Int(L) 'округляет до целого числа
        Cells(2 + I, 5) = Int(M)
       
        Cells(2 + I, 3) = Int((((L - Int(L)) * 10)) + 1)
        Cells(2 + I, 6) = Int((((M - Int(M)) * 10)) + 1)
        Cells(2 + I, 4) = Round(((L - Int(L)) * 1000))
        Cells(2 + I, 7) = Round(((M - Int(M)) * 1000))
        Cells(2 + I, 10) = Abs(L - M)

Всем этим ячейкам Вы назначаете новые значения, в зависимости от переменных M и L. И все это 100 раз, как и задано циклом.
И еще один момент(может это и имелось в виду) - как только Вы назначаете значение ячейке заново срабатывает событие Worksheet_Change. Поэтому важны два момента:
1. Перед любыми изменениями отключать отслеживание событий:
Application.EnableEvents = False
Затем обязательно вернуть: прямо перед End Sub записать
Application.EnableEvents = True
2. Я бы рекомендовал запускать код только если изменения произошли в нужном диапазоне. Скорее всего это столбцы M и L. Тогда надо сделать проверку:
Код: (vb)
If not Intersect(Range("L:M"),Target) is nothing then
'здесь нужный код
end if

В общем код может получиться таким:
Код: (vb)
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim note As Variant, Sote As Variant, Hote As Variant, L As Variant, M As Variant, score_comment As String
    If Not Intersect(Range("L:M"), Target) Is Nothing Then
        Application.EnableEvents = False
        For I = 1 To 100
            L = Range("L" & 2 + I)
            M = Range("M" & 2 + I)
           
            Cells(2 + I, 2) = Int(L) 'округляет до целого числа
            Cells(2 + I, 5) = Int(M)
           
            Cells(2 + I, 3) = Int((((L - Int(L)) * 10)) + 1)
            Cells(2 + I, 6) = Int((((M - Int(M)) * 10)) + 1)
            Cells(2 + I, 4) = Round(((L - Int(L)) * 1000))
            Cells(2 + I, 7) = Round(((M - Int(M)) * 1000))
            Cells(2 + I, 10) = Abs(L - M)
            note = Range("J" & 2 + I)
            Sote = Range("H" & 2 + I)
            Hote = Range("I" & 2 + I)
            'Комментарии, основанные на полученной оценке
            If note > 0.005 Then
                score_comment = "Великолепный бал!"
            ElseIf note > 0.0001 And note <= 0.005 Then
                score_comment = "Хороший бал"
            ElseIf Sote >= 1 Then
                score_comment = "БОЛТОВОЙ"
            ElseIf Hote >= 1 Then
                score_comment = "СВАРНОЙ"
            Else
                score_comment = ""
            End If
             
            'Комментарий в ячейке B1
            Range("K" & 2 + I) = score_comment
        Next
        Application.EnableEvents = True
    End If
End Sub
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
telesh
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля
« Ответ #2 : 08.05.2018, 10:27:54 »

Все равно прям до самого конца работает до 100 ячейки работает макрос, а должен работать только тогда когда в ячейки  L есть данные и считать одну строку а так получается он включается и считывает все до 100 ячейки
Записан
telesh
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля
« Ответ #3 : 08.05.2018, 10:36:31 »

Идея такая забивая в ячейку L 1данные и макрос работает только на строке A1:K1 затем в L2 и работает макрос A2:K2 и так далее
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 830



Просмотр профиля WWW
« Ответ #4 : 08.05.2018, 11:20:06 »

Все равно прям до самого конца работает до 100 ячейки работает макрос
Ну, наверное, надо читать, что Вам написали. Вы сами его заставляете работать ДО КОНЦА, о чем я сразу и написал:
у Вас там цикл от 1 до 100 (For I = 1 To 100)
Идея такая
Идея может и такая, но код у Вас совершенно иначе написан.
забивая в ячейку L 1данные и макрос работает только на строке A1:K1
а теперь открываем файл и смотрим что там за таблица и какие данные в A1:K1. Там заголовок. Когда описываете желаемое просьба уделять чуть больше внимания описанию, которое должно все же хоть как-то с приложенными данными совпадать.

Теоретически, если только одну строку надо обрабатывать, отталкиваясь от той, в которой изменения внесли, то код может быть таким:
Код: (vb)
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim note As Variant, Sote As Variant, Hote As Variant, L As Variant, M As Variant, score_comment As String
    If Not Intersect(Range("L:M"), Target) Is Nothing Then
        Application.EnableEvents = False
        I = Target.Row
'        For I = 1 To 100
            L = Range("L" & I)
            M = Range("M" & I)
           
            Cells(I, 2) = Int(L) 'округляет до целого числа
            Cells(I, 5) = Int(M)
           
            Cells(I, 3) = Int((((L - Int(L)) * 10)) + 1)
            Cells(I, 6) = Int((((M - Int(M)) * 10)) + 1)
            Cells(I, 4) = Round(((L - Int(L)) * 1000))
            Cells(I, 7) = Round(((M - Int(M)) * 1000))
            Cells(I, 10) = Abs(L - M)
            note = Range("J" & I)
            Sote = Range("H" & I)
            Hote = Range("I" & I)
            'Комментарии, основанные на полученной оценке
            If note > 0.005 Then
                score_comment = "Великолепный бал!"
            ElseIf note > 0.0001 And note <= 0.005 Then
                score_comment = "Хороший бал"
            ElseIf Sote >= 1 Then
                score_comment = "БОЛТОВОЙ"
            ElseIf Hote >= 1 Then
                score_comment = "СВАРНОЙ"
            Else
                score_comment = ""
            End If
             
            'Комментарий в ячейке B1
            Range("K" & I) = score_comment
'        Next
        Application.EnableEvents = True
    End If
End Sub

Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
telesh
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля
« Ответ #5 : 08.05.2018, 11:28:26 »

Спасибо, все работает
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru