|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.02.2009, 01:13 | #1 |
Старожил
Регистрация: 12.05.2007
Сообщений: 2,339
|
Почему появляется цикл?
При выполнении макроса 10 * 3 = 3874204890,00 ?????
Код:
|
10.02.2009, 02:36 | #2 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Это не макрос. Это набор бессмысленных команд...
Никакого накопления не происходит. Объяснишь, что требуется - получишь готовый макрос. |
10.02.2009, 14:31 | #3 |
Старожил
Регистрация: 12.05.2007
Сообщений: 2,339
|
Игорь!
Прочитал в умной книге: "........ старайтесь использовать по больше переменных" Исходя из этого, пробую; Если ввиду в яч. А1, целое значение 10, то получаю переменную per(Row, Column) = Target, т. е. per(1, 1) = 10, так? В яч. Cells(1, 3) есть число 3. А теперь перемножаю и результат вывести в яч. Cells(1, 5) = per(Row, Column) * Cells(1, 3), получаю не 30, а 3874204890,00 Поясни в чем здесь "набор бессмысленных команд" ? |
10.02.2009, 14:42 | #4 | ||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Цитата:
per(1, 1) не равно 10. Переменные Row и Column ты не задал, значит, они равны нулю. Зачем задавать массив 2000 строк на 15 стоблцов? Чтобы сохранить в нём значение одной ячейки? Цитата:
Ну ладно переменную добавить, но не массив же... Код [a1]=[b1] будет работать быстрее (копирование ячейки в ячейку), чем в случае использования промежуточной переменной: x=[b1] : [a1]=x |
||
10.02.2009, 15:37 | #5 | |||
Старожил
Регистрация: 12.05.2007
Сообщений: 2,339
|
Цитата:
MsgBox Target.Row: MsgBox Target.Column Цитата:
Цитата:
Последний раз редактировалось valerij; 10.02.2009 в 15:40. |
|||
10.02.2009, 16:02 | #6 |
Форумчанин
Регистрация: 30.01.2008
Сообщений: 314
|
все вышесказанное верно..
row и column вы не указали и они равны нулю. но(к счастью или нет) массив у вас определен так, что per(0,0) существует и ему-то вы и присваиваете значение target а вот потом вы присваиваете значение ячейке e1, что вызывает новое событие изменения листа - вот вам и цикл.. - распространеннейшая ошибка |
10.02.2009, 19:16 | #7 | |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
Цитата:
в процедура в таком виде - это бесконечный вызов её ею же самой. Необходимо блокировать обработку событий на входе и разрешить на выходе и отследить все ошибки, чтобы она не вывалилась в процессе выполнения по ошибке, иначе обработка событий так и не включится. Теперь, что и как делает процедура. Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Excel.Range) Толчком для выполнения является изменение значения в любой ячейке любого листа. Итак, где-то что-то изменилось. Dim per(2000, 15) As Long обьявляем двумерный массив 2000 строк, 15 колонок. per(Row, Column) = Target Для того чтобы использовать только его первый элемент. Собстственно используем: в per(0,0) положили значение Target. Допустим, где-то в данной книге "Вася" было заменено на "Петя". Попытка затолкать в per(0,0) "Петю" закончится крахом. Это массив для длинных целых, а не для строк. MsgBox per(Row, Column) 'Показывает как идет накопление тут без комментариев. Есть комментарий автора. Cells(1, 5) = per(Row, Column) * Cells(1, 3) Удивительная строка. На активном в данный момент листе в Е1 пытаемся затолкать произведение изменившейся ячейки и значения из С1. Если изменился "Вася" на "Петю", понятно, что до этой строки вообще дело не дойдет. Даже если изменили числовое значение, теперь еще надо быть уверенным, что в текущем листе в С1 лежит число или там пусто. Если там текст - это повод для очередной ошибки. Допустим все данные правильные. Записали в Cells(1, 5) произведение. Изменение Cells(1, 5) вызовет следующее срабатывание этой же процедуры, только теперь Targetом случит сама Cells(1, 5). И будет теперь Cells(1, 5) умножаться на Cells(1, 3) становясь все больше и больше... до бесконечности (или до ошибки переполнения, если рука не устанет MsgBox гасить)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
|
10.02.2009, 21:46 | #8 |
Старожил
Регистрация: 12.05.2007
Сообщений: 2,339
|
А я не согласен с Вами, что это просто набор команд, всего одна строчка и все работает корректно, другое дело, целесообразность применении промежут. переменной.
Код:
|
10.02.2009, 22:32 | #9 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
Код:
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
10.02.2009, 23:41 | #10 |
Старожил
Регистрация: 12.05.2007
Сообщений: 2,339
|
Игорь, да дело все именно в переменных, поясню.
Как я писал выше за умную книгу, решил попробовать, что бы при вводе числа, ему, числу, автоматом присваивалась переменная с индексами № строки и столбца, ввел число в А1, получил переменную per(1,1), ввел в F11 переменная per(11,6), но так не вышло Последний раз редактировалось valerij; 10.02.2009 в 23:47. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Почему не работает цикл????? | Marsik | Помощь студентам | 2 | 22.06.2008 14:16 |
Картинка появляется по нажатию кнопки! | MAKEDON | Общие вопросы Delphi | 3 | 13.12.2007 20:17 |
Картинка появляется по нажатию кнопки! | MAKEDON | Общие вопросы Delphi | 3 | 12.12.2007 22:49 |
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) | Mr.User | Помощь студентам | 9 | 23.11.2007 01:34 |