Страницы: 1
RSS
плавающий глюк
 
Function count_rate(val1, val2)
Dim prng()
Dim valx, valy, i
prng = Range(ThisWorkbook.Worksheets("Êóðñû").Cells(2, 1), ThisWorkbook.Worksheets("Êóðñû").Cells(5, 1))


For i = 1 To 4

If val1 = prng(i, 1) Then
valx = i + 1
checker1 = 1
End If

If val2 = prng(i, 1) Then
valy = i + 1
checker2 = 1
End If


If checker1 = 1 And checker2 = 1 Then
count_rate = ThisWorkbook.Worksheets("Êóðñû").Cells(valx, valy)

Exit Function

End If

Next i
count_rate = 0
End Function

На одном компе все работает нормально, на другом какой-то микроглюк, сами собой вырубаются эвенты, после этого их только через вба врубать. В дебагер не выкидывает, никаких ошибок. Ума не приложу в чем дело, на обоих 2007 эксель. Опытным путем понял, что глюк проходит если закомпилить строку
prng = Range(ThisWorkbook.Worksheets("Êóðñû").Cells(2, 1), ThisWorkbook.Worksheets
 
Добавьте в строку .Value.
 
Цитата
Добавьте ....Value.
Смысл?
Изменено: Johny - 11.03.2013 18:43:58
There is no knowledge that is not power
 
а я, честно говоря, никакого "криминала" в коде вообще не вижу.
тем более - "на одном работает"  :D

в первую очередь неплохо было бы проверить различие в надстройках, автозагружаемых файлах и прочих различиях между компьютерами.
код нормальный.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Смысл?
Когда объявлено Dim prng() у меня 2007 без .Value глючит.
 
Попробовать Dim prng As Variant
There is no knowledge that is not power
 
А смысл?  :)
.Value все равно не повредит.
 
Спасибо за советы, пробовал и value, и variant - не помогло.
Буду переписывать код как-то по-другому. Причем косяк 100% в этой строке
prng = Range(ThisWorkbook.Worksheets("Êóðñû").Cells(2, 1), ThisWorkbook.Worksheets
 
prng = Range(ThisWorkbook.Worksheets("Êóðñû").Cells(2, 1), ThisWorkbook.Worksheets

Здесь вот в чём может быть проблема.
Range берётся из активной книги, а ThisWorkbook не является активной книгой.
There is no knowledge that is not power
 
Цитата
Johny: Range берётся из активной книги, а ThisWorkbook не является активной книгой.
Нет, с этим здесь все в порядке, Range(Диапазон1, Диапазон2) задается только параметрами Диапазон1, Диапазон2, а они оба относятся к одному т и тому же листу одной и той же книги (не важно какой, активной или нет). В данном случае используется диапазон листа той книги, в которой написан код.

Автору темы предлагаю выложить небольшой пример книги с кодом, который не работает.
И проверить, если ли такой лист, который указан кракозябрами в приведенном коде.
Чтобы не было кракозабр, перед копировании кода переключите раскладку на русский язык
Изменено: ZVI - 12.03.2013 09:52:28
 
Цитата
Johny пишет:
Попробовать Dim prng As Variant
В версиях 2007 действительно был некий глюк, когда при помещении в массив с других листов без указания .Value VBA выпадал в ошибку. Что примечательно - если то же самое проделать с активным листом - ошибки не было. В 2010 вроде как поправили - но лично я для полной совместимости все равно указываю.
Возможно было несколько иначе реализовано занесение в массив ячеек с пустыми значениями(null) - если честно, не успел разобрать сей глюк(времени не было изучать - просто добавлял .Value), а потом сменил на 2010.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Форумчане, прошу прощения, что ввел в заблуждение, проблема оказалась не в этом. Я полностью изменил код, он находится в модуле1, он сейчас вообще на лист не лезет. Проблема вылаезает если вообще придать функции count_rate какое-то значение. Если ее не менять, то, вероятно, эксель не пересчитываеn формулы и в итоге все ок.

Как я проверял, на листе "спецификация" удалял валюту из любой строки, после этого enableevets становится почему-то false. Смысл такой, я меняю лист спецификация, программа ищет место изменения, чтобы не пробегать все строки, и "восстанавливает" эту строку по шаблону из скрытой строки. Далее назад влючаются события, должны при этом пересчитаться формулы. При этом такое ощущение, что код каким-то образом стопориться в промежутке, где события вырублена, но еще не включены назад. Это очень странно, т.к. на другом компе все работает как часы.

Буду признателен, если поможете докопаться до стути, хотя понимаю, что копаться в чужом коде дело неблагодарное. Вот весь файл, если кто-то рискнет
http://webdrive.reborn.ru/Eol/lineage/ver%20f16.3.xls
 
Пошаговым дебаггером выявил следующую забавную штуку. Если отключить events, то следующее событие chang не срабатывает. НО, есть проблема. Во время исполнения макроса, функция перехватывает макрос, то есть спокойно макрос делается делается, потом вдруг он меняет цвет ячейки, в которой стоит эта функция. Функция начинает пересчитыватся, перехватывая макрос, при этом макрос на этом функционирование прекращает.
Как заставить после пересчета функции возвращаться назад и делать макрос без понятия, либо вырубать вообще вычисления в книги на момент исполнения макроса.

Добавил Application.Calculation = xlCalculationManual
не помогло, функция так и перехватывает макрос,
зато на другом компе все стало просто летать после добавления :)
брееед...
Изменено: Oleg - 12.03.2013 15:23:31
 
Добавьте еще:
Application.EnableEvents = False
а после выполнения верните:
Application.EnableEvents = True

Проблема в том, что на другом ПК, скорее всего 2003 Excel, где зациклившаяся в событии процедура после определенного кол-ва интераций прекращает цикл и передает выполнение следующей строке. В старших версиях этого нет, что приводит к ошибке переполнения памяти.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх