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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2009, 01:13   #1
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию Почему появляется цикл?

При выполнении макроса 10 * 3 = 3874204890,00 ?????
Код:
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Excel.Range)
Dim per(2000, 15) As Long
per(Row, Column) = Target
MsgBox per(Row, Column) 'Показывает как идет накопление
Cells(1, 5) = per(Row, Column) * Cells(1, 3)
End Sub
valerij вне форума Ответить с цитированием
Старый 10.02.2009, 02:36   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Это не макрос. Это набор бессмысленных команд...
Никакого накопления не происходит.

Объяснишь, что требуется - получишь готовый макрос.
EducatedFool вне форума Ответить с цитированием
Старый 10.02.2009, 14:31   #3
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Это не макрос. Это набор бессмысленных команд...
Игорь!
Прочитал в умной книге: "........ старайтесь использовать по больше переменных"
Исходя из этого, пробую;
Если ввиду в яч. А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

Поясни в чем здесь "набор бессмысленных команд" ?
valerij вне форума Ответить с цитированием
Старый 10.02.2009, 14:42   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
получаю переменную per(Row, Column) = Target, т. е. per(1, 1) = 10, так?
Нет, не так.
per(1, 1) не равно 10. Переменные Row и Column ты не задал, значит, они равны нулю.

Зачем задавать массив 2000 строк на 15 стоблцов? Чтобы сохранить в нём значение одной ячейки?

Цитата:
Прочитал в умной книге: "........ старайтесь использовать по больше переменных"
К примеру, если у меня в макросе используются 10 переменных, а я добавлю ещё 30, от этого что - макрос начнёт быстрее работать?
Ну ладно переменную добавить, но не массив же...

Код [a1]=[b1] будет работать быстрее (копирование ячейки в ячейку), чем в случае использования промежуточной переменной: x=[b1] : [a1]=x
EducatedFool вне форума Ответить с цитированием
Старый 10.02.2009, 15:37   #5
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Нет, не так.
per(1, 1) не равно 10. Переменные Row и Column ты не задал, значит, они равны нулю.
Не задал, через Dim? Я думал, что ввод данных сам определит № строки и столбца.
MsgBox Target.Row: MsgBox Target.Column

Цитата:
Зачем задавать массив 2000 строк на 15 стоблцов? Чтобы сохранить в нём значение одной ячейки?
То я на будующее, если получится зксперемент

Цитата:
Код [a1]=[b1] будет работать быстрее (копирование ячейки в ячейку), чем в случае использования промежуточной переменной: x=[b1] : [a1]=x
Понял, пробую пустую работу, правда как узнать истину, не попробавши!

Последний раз редактировалось valerij; 10.02.2009 в 15:40.
valerij вне форума Ответить с цитированием
Старый 10.02.2009, 16:02   #6
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

все вышесказанное верно..

row и column вы не указали и они равны нулю.
но(к счастью или нет) массив у вас определен так, что per(0,0) существует и ему-то вы и присваиваете значение target

а вот потом вы присваиваете значение ячейке e1, что вызывает новое событие изменения листа - вот вам и цикл.. - распространеннейшая ошибка
slan вне форума Ответить с цитированием
Старый 10.02.2009, 19:16   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Это не макрос. Это набор бессмысленных команд...
не согласен с EducatedFool, потому что выразился он очень мягко.

в процедура в таком виде - это бесконечный вызов её ею же самой. Необходимо блокировать обработку событий на входе и разрешить на выходе и отследить все ошибки, чтобы она не вывалилась в процессе выполнения по ошибке, иначе обработка событий так и не включится.
Теперь, что и как делает процедура.
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 гасить)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 10.02.2009, 21:46   #8
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
не согласен с EducatedFool, потому что выразился он очень мягко.
А я не согласен с Вами, что это просто набор команд, всего одна строчка и все работает корректно, другое дело, целесообразность применении промежут. переменной.
Код:
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Excel.Range)
Dim per(2000, 15) As Long
If Target.Column = 1 Then
per(Row, Column) = Target
Cells(1, 5) = per(Row, Column) * Cells(1, 3)
End If
End Sub
valerij вне форума Ответить с цитированием
Старый 10.02.2009, 22:32   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Excel.Range)
  If Target.Column = 1 Then
    Cells(1, 5) =  Target * Cells(1, 3)
  End If
End Sub
вот так будет происходить все тоже самое. зачем плодить лишние строки? хоть один довод можно?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 10.02.2009, 23:41   #10
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
хоть один довод можно?
Игорь, да дело все именно в переменных, поясню.
Как я писал выше за умную книгу, решил попробовать, что бы при вводе числа, ему, числу, автоматом присваивалась переменная с индексами № строки и столбца, ввел число в А1, получил переменную per(1,1), ввел в F11 переменная per(11,6), но так не вышло

Последний раз редактировалось valerij; 10.02.2009 в 23:47.
valerij вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает цикл????? 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