Страницы: 1
RSS
Поиск универсального способа проверки существования свойства у объекта.,
 
Добрый день, друзья!

Столкнулся с необходимостью проверки существования конкретного свойства у объекта, чтобы не встречать ошибку  (Run-time error '1004')  Не нашел какого-то универсального решения.
Пример
Код
MsgBox (Selection.PivotItem.Caption)  
Если при выполнении выделена ячейка строк сводной таблицы - покажет заголовок,
если нет - Run-time error '1004'.
Уровень проекта не позволяет использовать "On error resume next" внутри основного кода.

Пока выкручиваюсь отдельной функцией для проверки каждого подобного случая, но это крайне неэстетично и громоздко.
Уверен, что есть более красивое решение. Буду очень признателен за подсказки, в каком направлении копать.
 
Цитата
Уровень проекта не позволяет использовать "On error resume next" внутри основного кода.
это как?
я вот постоянно это использую. не забывая вставлять проверки ошибок, после мест кода, где они могут появиться

Цитата
проверки существования конкретного свойства у объекта
никак, кроме как проверки на ошибку, после обращения к этому свойству / методу

ну а вообще, можно посмотреть тип объекта, - и исходя из этого вызывать его методы:
Код
if typename(selection) = "Range" then 
 
Цитата
Dissable написал:
Уровень проекта не позволяет использовать "On error resume next" внутри основного кода.
А использовать Selection уровень проекта позволяет?  8-0
 
Игорь, спасибо, попробую проверку на тип объекта.
Ошибок то много может быть, не только в этом месте, а при resume next он дальше будет скрипт обрабатывать, а иногда это критично. Надо тогда будет все возможные проверять? Или это тоже как-то обходится?

Казанский, а чем Selection плох? Есть какая-то замена, более правильная?
 
Цитата
Dissable написал:
Ошибок то много может быть, не только в этом месте, а при resume next он дальше будет скрипт обрабатывать
После каждого места, которое может вызвать ошибку, проверяйте наличие ошибки. Примеров масса: https://www.google.ru/search?q="if+err"+site%3Aplanetaexcel.ru
Цитата
Dissable написал:
а чем Selection плох?
Избавьтесь от Select* и Active* в программах для Microsoft Office
 
Код
Sub DontWorryErr()
Dim x
'Здесь код, который никогда не ошибается
On Error Resume Next
x = 1 / 0 'Здесь код, который может спровоцировать ошибку
If Err Then 'если ошибка, то обработаем
  With Err
    MsgBox .Description & Chr(10) & .HelpContext & Chr(10) & .HelpFile & Chr(10) & .LastDllError & Chr(10) & .Number
    .Clear
  End With
  
End If
x = Selection.PivotItem.Caption
If Err Then
  With Err
    MsgBox .Description & Chr(10) & .HelpContext & Chr(10) & .HelpFile & Chr(10) & .LastDllError & Chr(10) & .Number
    .Clear
  End With
End If
On Error GoTo 0 'больше не хочу Resume Next
'Работаем как обычно. "Уровень проекта" вернулся :)))
End Sub
 
Игорь, по вашей наводке попробовал typename(), но в случае с описанным примером - он что на ячейке сводной, что на обычной показывает один и тот же тип "range".

Была похожая проблема с необходимостью проверки существования второго столбца у комбобокса - там тоже typename(cboFactory) тип комбобокс выдаёт, что ничего не говорит и наличии в него свойства .column(1).
Нет ли чего-то вроде Object.getOwnPropertyNames()?
Казанский, спасибо за ссылочки. Selection и Active - у нас, вроде, везде по прямому назначению и используются, для взаимодействия с пользователем и его выбором.
А с ActiveSheet до этого не приходило в голову, что теоретически можно успеть переключить лист прямо во время выполнения макроса.

А про обработку ошибок - пробовал, но отказался, т.к. в программе может быть много других ошибок - программа активно взаимодействует с пользовательским выбором, а это всегда источник возможных ошибок.
 
AAF,спасибо за подробный пример.
Дьявол как всегда оказался в деталях. Потестировал.
On Error GoTo 0, оказалось не совсем к тому же возвращает состоянию - пропадает кнопка DEBUG,
наглядно показывающая на каком месте программа дала сбой.
Ради неё и не включался ON ERROR в основном коде. Не готов отказаться от такой фичи.
В проекте постоянно что-то меняется. Необходимо оперативно править косяки.
 
Цитата
Dissable написал:
On Error GoTo 0, оказалось не совсем к тому же возвращает состоянию - пропадает кнопка DEBUG
Это в какой версии Офиса?
Неужели, если в коде AAF, перед End Sub поставить
Код
x = 1 / 0
, то появится сообщение об ошибке без кнопки DEBUG?
До сих пор я видел такое сообщение, если ошибка происходит в запароленном проекте, может это ваш случай?
 
Нет, проект не запаролен. Обычный модуль в файле, единственная особенность файла - "только чтение".

У меня 2010 эксель стоит.

На виртуалке потестил с 2003 действительно кнопка DEBUG не пропадает.
Хороший он был, этот 2003, но перейти обратно уже не вариант.
UPD. Нашел 2013, там тоже кнопка есть. Только в 2010 такая лажа.
Изменено: Dissable - 01.12.2017 15:16:47
 
2007,2010,2013,2016 - не пропадает
 
Цитата
Казанский написал:
Избавьтесь от Select* и Active* в программах для Microsoft Office
Возникла необходимость обработки отчета сводной таблицы, для чего создан макрос, который назначили кнопке. Сценарий такой: пользователь желает запустить макрос, для этого он выделяет ячейку внутри сводной и жмет кнопку. Но если выделена ячейка за пределами сводной, а при этом на листе больше одной сводной таблицы. В этом случае от "Select*" избавляться рановато. Лучше передать "Selection.PivotTable" на обработку макросу.

В продолжение темы: как такую кнопку делать доступной только тогда, когда выделена ячейка внутри сводной, а когда выделение за пределами сводной, становилась "выключенной". Что бы нельзя было запустить макрос пока явно не указана сводная таблица.
 
Это продолжение темы о свойствах объектов?
 
"Поиск универсального способа проверки существования свойства у объекта" - из заголовка ясно, что заранее неизвестно, какой объект. "Selection" - один из таких вариантов.
Доступность кнопки для запуска макроса обработки сводной таблицы в зависимости от того выбрана сводная или нет - альтернативное решение проблемы из первого поста. Поэтому я считаю, что обсуждение продолжает основную тему, расширяет область решений. Ведь если нет возможности запустить макрос без выделения сводной таблицы то можно обойтись без обработчика ошибки. Код всегда будет выполняться с объектом у которого есть целевое свойство. Правда вот реализация механизма доступности без обработчика ошибки у меня не вышла )))), но в принципе я и не стремился. А прикрутил проверку доступности к событиям "Workbook_SheetSelectionChange" и "Workbook_SheetActivate".
Страницы: 1
Наверх