Страницы: 1
RSS
VBA. Автофигуры. Ошибка Run-time error 80070057
 
привет всем. нарисовалась проблема. прошу подсказать.

есть файлик.
в файлике на событие листа SelectionChange задан обработчик
с вполне безобидным кодом.
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  ' что-то еще...
  If ActiveCell.Column - Me.[a7].Value >= 0 And ActiveCell.Column - Me.[a7].Value <= 17 Then
    wsInv.Shapes("here").Visible = True
    wsInv.Shapes("here").Left = ActiveCell.Left + (ActiveCell.Width - wsInv.Shapes("here").Width) / 2 ' проблема!!! 
  Else
    wsInv.Shapes("here").Visible = False
  End If
End Sub


проблема: на одном из компьютеров заказчика этот код в строке с комментарием вываливается в странную ошибку
Run-time error '-2147024909 (80070057)':
Указанное значение выходит за допустимые пределы


подробности:
на компьютере, на котором это возникает - Excel 2013.
впрочем, на остальных компьютерах заказчика - то же самое.
у меня - Excel 2010.

wsInv - кодовое имя активного листа.
объект (автофигура) с именем "here" на этом листе существует.
впрочем - иначе ошибка возникала бы в предыдущей строке и была бы более внятной.

все значения всех свойств в правой части (после =) - корректные.
вычисленный результат всего выражения - тоже корректный.
не отрицательный. не слишком большой и т.п.
проверено в отладчике, в окне Watches.

заказчик пьёт корвалол.
я в непонятках.
гугл упорствует.

из-за чего это может быть и как с этим бороться?
пс. офис и винду на проблемном компьютере пока не переустанавливали - хочется обойтись малой кровью.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
1. Почему ActiveCell, а не Target? Так задумано?
2. Почему где-то Me, а где-то wsInv? Тоже задумано? Зачем тогда такая путаница?
3. ActiveCell.Width - wsInv.Shapes("here").Width - что дает в результате?
4. (ActiveCell.Width - wsInv.Shapes("here").Width) / 2 - что дает в результате? Если результат приплюсовать к ActiveCell.Left - что получается?
5. Пример сего безобразия есть возможность приложить?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ActiveCell - потому что допускается выделять диапазоны, в т.ч. несвязные.
Me и wsInv - мой каприз, каюсь :( не думаю, что это существенно.
ActiveCell.Width - wsInv.Shapes("here").Width - разница ширин ячейки и автофигуры
вся арифметика - для того, чтобы позиционировать автофигуру по центру активной ячейки.

с примером - проблема... файл, само собой, немаленький, а делать аналогичный пример - какой смысл? в основном-то код отрабатывает без проблем.
Дима, если хочешь - могу отправить на почту.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
есть еще нюанс.
лист защищён.
с UserInterfaceOnly.

и, как сейчас выяснилось в переписке - если руками снять защиту листа, то и на проблемном компьютере ошибка перестает появляться.
но если обратно включить защиту (макросом, с параметром UserInterfaceOnly) - снова появляется.
но только на одном компьютере.
на остальных без проблем работает и на защищенном листе.
Изменено: ikki - 16.07.2015 16:26:59
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki написал:
ActiveCell.Width - wsInv.Shapes("here").Width - разница ширин ячейки и автофигуры
Если вставлять надо посередине ячейки - зачем тогда разницу проводить между шириной ячейки и автофигурой? Почему не половина ширины ячейки?

Да, вышли на почту. Достоверно сейчас не скажу, но может быть, что ширина фигур и ячеек по-разному исчисляется. И Width ячейки не будет равна Width фигуры при равном визуальном соответствии.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
отправил.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki написал:
но если обратно включить защиту
У меня работает без проблем(не считая того, что пришлось подкорректировать GettickCount под 64-бита). Не пробовал при защите установить: DrawingObjects:=False ?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
да не хотелось бы...
разве только в порядке эксперимента?
а иначе юзеры смогут выделять кнопочки (правой кнопкой, но всё же...)
и издеваться над ними всяко-разно :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki написал: гугл упорствует.
я неправильно искал.
https://www.google.ru/webhp?client=opera&sourceid=opera#newwindow=1&q=Run-time+error+%27-2147024909+(80070057)%27

но всё - на нехорошем буржуйском языке :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
одна из ссылок ведет сюда: http://winwiki.org/vba-run-time-error-80070057/
Скрытый текст

гуглоперевод:
Скрытый текст

кто-нибудь, владеющий английским, может "причесать" эту красоту?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Вообще это имеет мало отношения именно к текущему случаю. Ведь без защиты листа все работает.
Единственный момент - что будет, если отключить антивирус или добавить файлы Excel в доверенные? Потому как UserInterface вроде как идет в обход защиты листа, что может расцениваться антивирусом как попытка исполнения вредоносного кода.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ikki, сие послание, на моё не самое лучшее знание языка означает примерно следующее:
Скрытый текст

Короче - вода ниочем. :)
Кому решение нужно - тот пример и рисует.
 
как-то так (не зная специфической компьютерной лексики и тонкостей её перевода)
Скрытый текст

p.s. вечно опаздываю  :) пока думаю об оформлении...  
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Скорее всего Excel здесь не причем, просто пользователь (у которого этот глюк) использует "устаревшее" обновление безопасности, механизм которого иcпользует Excel. Либо там реальный вирус.
ИМХО следует включить антивирус на "максимум эвристики" во время выполнения кода и установить обновления Windows и Office, но только полезные. В 90% случаев это помогает.
Неизлечимых болезней нет, есть неизлечимые люди.
 
всем спасибо.
подождем, что скажет заказчик...
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
почему сначала фигуру показываем, потом меняем координаты? а не наоборот?
Живи и дай жить..
 
вообще-то случайно так вышло.
думаешь, принципиально?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
нет, конечно, но может мелькать
Живи и дай жить..
 
Цитата
ikki написал:
подождем, что скажет заказчик...
Добрый день. Не подскажите, чем закончилось? Вылезла та же проблема - ошибка "Указанное значение выходит за допустимые пределы" на защищенном листе при попытке внести в Shape новый текст. Только дома, на Excel 2013 выдает ошибку. На работе, на Excel 2010 / Excel 365 даже под пользовательскими правами работает.
 
Я так понимаю вы заносите текст в фигуру на защищённом листе так:
Код
ActiveSheet.Shapes(1).TextFrame2.TextRange.Text = "ТЕКС"

В данном случае необходимо чуть по другому поступать. Если лист защищён, то в фигуру записывайте следующим образом текст:
Код
ActiveSheet.Shapes(1).OLEFormat.Object.Caption = "Тут текст"

Результат один и тот же, а запись разная.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
Страницы: 1
Наверх