Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 14.01.2009, 22:17   #1
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию Работа программы при изменении

Добрый день!!!
Подскажите пож..
почему код выполнянтся долго

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As String
Dim a, b, x, m, h, c As Variant
r = Target.Row
If r < 4 Then Exit Sub
m = 0: h = 0: c = 0
For m = 6 To 17
h = h + Cells(r, m)
Next
If h = 0 Then h = ""
Cells(r, 18) = h
c = Cells(r, 18) - Cells(r, 6)
If c = 0 Then c = ""
Cells(r, 20) = c

a = 0: b = 0: x = 0
If Cells(r, 3) = "" Or Cells(r, 3) = 0 Then x = "": GoTo m1
a = Cells(r, 3) / 7
b = Cells(r, 18) / a
If b > 14 Then x = "": GoTo m1
x = (15 - b) * a
m1: Cells(r, 19) = x

Cells(r, 21) = Cells(r, 18) * Cells(r, 23) * Cells(r, 24)
Cells(r, 22) = Cells(r, 6) * Cells(r, 23) * Cells(r, 24)

почему процедура невыполняется вся сразу и один раз,... а сначала одна его часть потом End Sub и заново еще другая его часть и т.д. и по этому кажется что процедура выполняется до бесконечности!
Я думаю что цик м можно заменить какой нить функцией которая бы считала диапозон но я не знаю какой!

Последний раз редактировалось Rom1k06; 14.01.2009 в 22:30.
Rom1k06 вне форума
Старый 14.01.2009, 22:35   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
почему процедура невыполняется вся сразу и один раз
Потому что процедура изменяет значения ячеек на этом же листе.
А это изменение запускает эту же процедуру снова, и т.д. до бесконечности...

Попробуйте такой вариант:

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False    ' отключаем обработку событий
    
    Dim r As Long ' зачем было объявлять переменную с типом String ?????

    r = Target.Row: If r < 4 Then Exit Sub
    For m = 6 To 17: h = h + Cells(r, m): Next
    If h = 0 Then h = ""
    Cells(r, 18) = h

    c = Cells(r, 18) - Cells(r, 6): If c = 0 Then c = ""
    Cells(r, 20) = c

    a = 0: b = 0: x = 0
    If Cells(r, 3) = "" Or Cells(r, 3) = 0 Then x = "": GoTo m1
    a = Cells(r, 3) / 7
    b = Cells(r, 18) / a
    If b > 14 Then x = "": GoTo m1
    x = (15 - b) * a
m1:     Cells(r, 19) = x

    Cells(r, 21) = Cells(r, 18) * Cells(r, 23) * Cells(r, 24)
    Cells(r, 22) = Cells(r, 6) * Cells(r, 23) * Cells(r, 24)
    
    Application.EnableEvents = True    ' включаем обратно обработку событий
End Sub

Цикл For m = 6 To 17: h = h + Cells(r, m): Next

можно заменить на h=Application.WorksheetFunction.Sum (target.EntireRow.Cells(6).Resize(, 11))

или, что то же самое, на h=Application.WorksheetFunction.Sum (Cells(r, 6).Resize(, 11))

Там ещё много чего можно заменить.
Вообще, большую часть макроса (если не весь) можно убрать, производя нужные вычисления на листе при помощи формул.

Последний раз редактировалось EducatedFool; 14.01.2009 в 22:50.
EducatedFool вне форума
Старый 14.01.2009, 22:45   #3
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Спасибо за оперативность!
А то если я прописываю Selection_chenge то это не дает приимуществ а только добавляет гемор... приходится каждый раз возвращатся на ячейку для ее расчета...

Я еще плохо умею распределять переменные но всеже String - это строка, по этому я и присвоил r как Srting.
Еще вопрос зачем отключать обработку событий?
и почему из-зи имени переменной все так тормозит?
Rom1k06 вне форума
Старый 14.01.2009, 22:55   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
и почему из-зи имени переменной все так тормозит?
Из-за неправильно назначенного типа переменной макрос не тормозит.
Он просто не работает...
Ошибка возникает при вызове функции Cells(r, m), которой Вы в качестве параметра подсовываете текст вместо числа.

Цитата:
зачем отключать обработку событий?
Для того, чтобы макрос не зацикливался.

Я же объяснил:
Цитата:
Потому что процедура изменяет значения ячеек на этом же листе.
А это изменение запускает эту же процедуру снова, и т.д. до бесконечности...
Именно поэтому макрос тормозил (причем тормозил бесконечно долго)

Отключая события, Вы говорите Excel-ю НЕ ЗАПУСКАТЬ макрос Worksheet_Change (и другие подобные макросы, срабатывающие по событиям) до тех пор, пока не будет снова включена обработка событий.

В этом случае макрос выполнится только один раз - как то и требовалось.

Но проще переложить все вычисления на формулы.

Цитата:
всеже String - это строка, по этому я и присвоил r как Srting
В переменной r хранится не текстовое (строковое) значение, а номер строки, являющийся числом.

Последний раз редактировалось EducatedFool; 14.01.2009 в 23:03.
EducatedFool вне форума
Старый 15.01.2009, 19:17   #5
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Ок. Спасибо за объяснение!
В таблице были формулы но в ней работаю не только я
Эта книга работает в общем доступе..
И те кто плохо валадеет Excel-ем постоянно боятся что чтото удалят и несмогут восстановить фомулы по этому я и убрал с таблици все формулы.
Rom1k06 вне форума
Старый 15.01.2009, 19:29   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
И те кто плохо валадеет Excel-ем постоянно боятся что чтото удалят и несмогут восстановить фомулы
Для этого в Excel присутствует функция защиты листа.
Можно заблокировать отдельные ячейки с формулами, и т.п.
Можно установить пароль на изменение диапазонов ячеек.

В Вашем случае это будет наиболее оптимальным решением.

А потом пусть ОНИ пробуют удалить формулы...
EducatedFool вне форума
Старый 18.01.2009, 18:14   #7
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Да безусловно существуе защита листа!!
Но при том что работа постоянно ведется в общем доступе я немогу его сначала распоролить (на началовыполнения макроса а потом опять запоролить! К томуже необходимо установить пароль на часть листа т.к. в другой части необходимо заносить данные, и необходимо еще разрешить группировку! Точнее распоролить получается Unprotect(123456789), а вот запоролить неполучается пишу Protect(123456789)- выдает ощибку!
Как можно исправить? Я даже уверен что можно, может подскажещь?

Последний раз редактировалось Rom1k06; 18.01.2009 в 18:16.
Rom1k06 вне форума
Старый 18.01.2009, 18:47   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Как можно исправить? Я даже уверен что можно, может подскажещь?
Наверняка можно. Но как именно - не знаю

К сожалению, с книгами в общем доступе ни разу не работал, так что посоветовать ничего не могу.
Я, как только разрешил общий дjступ к книге, потерял доступ к коду VBA (сообщение Project is unviewable)...

У метода Protect есть множество параметров - может, имеет смысл поэкспериментировать с ними...

Будем ждать советов профессионалов.
EducatedFool вне форума
Старый 18.01.2009, 19:05   #9
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Доступ к коду теряется! Но зачем в нем копатся когда программа рабочая... Я сделал подругому,.. один файл для общего доступа а в другом отлаживал код по перым замечаниям и просто заменял модуль! Я видел довно на том форуме подобное соощение но найти его не смог!

Может стоит создать отдельную тему для обсуждения данной проблемы?
Думаю не мне обному интерестны подобные проблемы!
Rom1k06 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При изменении размера шрифта в IE появляются линии Константин_VRN HTML и CSS 7 12.01.2009 16:42
Как изменять размеры шрифта при изменении размеров canvas? SkAndrew Мультимедиа в Delphi 2 07.12.2008 23:02
Текст при изменении размеров окна Dj_smart HTML и CSS 2 25.11.2008 23:23
Мерцание окна при изменении размера zaqer Win Api 2 30.07.2008 23:39
Потеря данных при изменении рамера раздела Drandulet Софт 5 06.07.2008 07:52