Страницы: 1
RSS
Разрушительный сбой
 
Доброго всем дня!  
 
Создал экселевский файл с юзерформой. На форме малтипейдж с несколькими картинками, листбоксами, медиаплеерами. Все работает нормально, но после нескольких запусков формы начинает появлятся ошибка на уровне инициализации формы .ListBox1.RowSource = "ttl_tehn!$Q$37:$t$" & i + 36  
 
После этого файл обычно говорит "Разрушительный сбой" и вылетает. Если все делать не через .RowSource, а через additem, то ошибки с адресом не возникает, но в какой-то момент листбокс перестает реагировать на клик.  
 
Причем, у коллеги все работает нормально. Но у коллеги установлен только Excel 2007, а у меня 2003, 2007 и 2010 (с файлом работаю только через 2007 или 2010). Что-то мне подсказывает, что именно в этом и проблема.  
 
Помогите, пожалуйста
 
Может помочь Сервис >> Сохранение >> Отключить автовосстановление  
А может и не помочь  
В книгах Буллена, Боуви и Грина есть категорическая рекомендация во избежание всевозможных неприятностей ни в коем случае не пользоваться RowSource элементах управления форм при работе VBA!
 
Спасибо за совет! К сожалению, отключение автовосстановления не помогло. Макрос продолжает ругаться на RowSource.  
 
Поменял RowSource на Additem. Ругаться перестал, но после некоторого количества вызова юзерформы листбокс перестает реагировать на клик, т.е. выбранная строка выделяется, но дальше ничего не происходит :(  
 
Может как-то влияют другие установленные на комп эксели (2003-й и 2007-й)?
 
А почему не воспользоваться .list? Это по-любому будет быстрей additem. Чуть больше кода, но оно того стоит. Хватаем в память массив и передаем его в листбокс. Примеры и я и ZVI выкладывали на форум. Если забыл еще кого упомянуть - простите.
Я сам - дурнее всякого примера! ...
 
Вы имеете ввиду такой вариант?  
iRA = Application.CountA(Sheets(ttl_tehn).[q59:q78])
X = 0  
With MultiPage1.Press  
With .ListBox_Press  
   .ColumnCount = 3  
   .ColumnHeads = True  
   For i = 59 To iRA + 58  
   .AddItem ""  
   .List(X, 0) = Sheets("ttl_tehn").Cells(i, 17).Value  
   .List(X, 1) = Sheets("ttl_tehn").Cells(i, 18).Value  
   .List(X, 2) = Sheets("ttl_tehn").Cells(i, 19).Value  
   X = X + 1  
   Next i  
End With  
End With  
 
Такой вариант тоже не помогает
 
Все-таки дело было в .RowSource. У меня на листах были еще листбоксы. Поменял везде .RowSource на вышеуказанный код. Теперь все работает нормально.  
 
Спасибо большое!
 
Вы знаете, у меня был расчёт с красивой формой (моя гордость)  
Там всё было согласовано - при перемещении по ячейкам подсвечивались текстбоксы и наоборот и т.д. Работало в XL2000 как часы, пока не передал коллеге, и в XL2002 началось...  
Причину я понял где-то через год - после покупки книги Буллена и др.  
К тому времени форму выкинул, всё упростил  
 
На Планете заметил уже не одну подобную жалобу, так что сомнений нет!  
Это не единственный тяжёлый глюк XL, но что поделаешь...
 
Никогда не слышал про такую подлянку от RowSource. Считал его приличным человеком :-) А разговор идёт про свойства или программное присвоение? Если программно, то про диапазон с адресом, или с именами аналогично?  
В любом случае спасибо за информацию.
 
Юрий, пробовал и вручную добавлять, и программно. Задавал и обычным адресом, и именованным диапазоном, и именованным динамическим диапазоном. Все плохо.
 
То, что я описал, в своё время пошатнуло многие мои взгляды на XL  
Это был сильный удар (и спросить было не у кого - я только недавно вышел на Ваш замечательный форум)  
Но судьба - вещь загадочная  
Я испытал затяжной стресс, искал выходы из ситуации, и тогда впервые обратил внимание на возможности механизма связей между ячейками  
В результате приобрёл несоизмеримо больше, чем потерял
 
А если RowSource в коде не упоминается, только использование в свойствах?  
Т.е. открыл Properties, задал ссылку - и порядок?
 
Не, Вить, разговор про RowSource как таковой. Если я правильно понял, конечно...
 
Давайте, спокойно разберемся  
Цитату из Буллена приложил. В ней нет предупреждения о сбое, но есть однозначная рекомендация.  
 
Мой опыт такой: я получал сбои при программном изменением свойства .ControlSource объектов TextBox на форме  
Вот соответствующий код:  
  For Each r In rTxtNms.Cells  
       For i = 1 To 2  
           With Me.Controls("txt_" & r & i)  
               .Tag = r.Row  
               If rAct Is Nothing Then .Text = "": .ControlSource = ""    
               .ControlSource = rAct.Cells(r.Row, i).Address  
           End With  
       Next i  
   Next r  
 
У Drgb, насколько я понял, тоже речь идёт о программном изменении .RowSource (почти то же свойство listbox - хорошо было бы увидеть фрагмент кода)  
 
Выявлена опасность сбоя при программном редактировании ссылок на связанные ячейки для различных элементов управления форм  
Элементы со ссылками на связанные ячейки применять скорее всего, можно, но нежелательно
 
Возможно, я не совсем чётко сформулировал последнее предложение  
Лучше так:  
Уважаемый vikttur, попробовать можно, но с осторожностью
 
Ну и?  
1. "сбои при программном изменением свойства"  
2. Цитата из Буллена говорит о том, что нельзя использовать (в RowSource, значит, тоже) ссылки на ячейки.  
Получается, что ничего не получается? RowSource нельзя использовать?
 
{quote}{login=Drgb}{date=17.04.2012 06:53}{thema=}{post}Вы имеете ввиду такой вариант?  
iRA = Application.CountA(Sheets(ttl_tehn).[q59:q78])
X = 0  
With MultiPage1.Press  
With .ListBox_Press  
{/post}{/quote}  
Нет, я имел ввиду - считываем одной командой диапазон в массив arr и дальше:  
.ListBox_Press.list=arr  
Никакого цикла, так гораздо быстрей.
Я сам - дурнее всякого примера! ...
 
Я не сторонник глобальных категоричных рекомендаций  
Это очень хорошая книга, но в ней нет фразы "разрушительный сбой"
Страницы: 1
Читают тему
Наверх