Страницы: 1
RSS
Почему у некоторых команд VBA нет подсказок?
 
Доброго времени суток, Планетяне!

Примеры команд:
    • Exit Sub/Function (решено)
    • LBound/UBound
    • ActiveSheet. (после точки нет подсказок)

Позднее связывание не интересует, т.к. там нет подсказок из-за того, что не видна библиотека и это вроде "удалённой" с ней работы.
Изменено: Jack Famous - 06.09.2019 11:05:50
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Да сам такое не раз встречал. Есть только догадки, но сам тоже не знаю причины.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, по идее нет подсказки - нет в библиотеке - команда супервстроенная  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
У меня 2010 офис и все подобные функции описаны в справке, хотя они и не всплывают при быстром наборе.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Возможно, дело в объекте, который неизвестен на момент редактирования и компиляции типа. Допустим, я пишу
Код
Set v = CreateObject("Excel.Application")
Дальше мне нужно выделить лист и я пишу
Код
v.Sheets("Лист1").select
Свойство Excel.Application.Sheets.Item(индекс) описано как Object, т. е. COM-объект неизвестного на момент редактирования и компиляции типа. Откуда бы среде разработки знать, какие у него могут быть или не быть свойства и методы? (с)
 
По поводу раннего и позднего связывания тут всё понятно почему. Опять же, если раннее связывание, то подсказки всплывают.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox: Есть только догадки
какие?  :)
Цитата
Hellmaster: Возможно, дело в объекте
это, конечно отвечает на вопрос темы, но интересны в первую очередь команды, приведённые в качестве примера в стартовом сообщении. Про позднее связывание всё ясно и тут никаких сюрпризов нет.
Изменено: Jack Famous - 06.09.2019 08:29:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
интересны в первую очередь команды, приведённые в качестве примера
Цитата
Jack Famous написал:
Exit Sub/Function
а какую подсказку Вы хотите здесь увидеть? Что должно подсказываться? Exit - это глобальный оператор выхода без аргументов. Его правильное применение определяется только на уровне компиляции проекта. Например, если внутри тела Function написать Exit Sub - то при запуске функции VBE скажет, что так нельзя. Но на уровне написания этого Exit после пробела подсказывать не будет, т.к. к этому оператору не привязаны напрямую никакие ключевые аргументы или операторы(как это сделано, скажем, с ключевым As при объявлении переменных).
Цитата
Jack Famous написал:
LBound/UBound
точного утверждения пока не нашел, но предположу, что эти функции относятся к некоей глобальной реализации, которая не может быть однозначно определена(что-то вроде типа Object). Или все проще - они тупо не ассоциированы с описанием :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо за развёрнутый ответ  :idea:
Про Exit я думал так: когда меняю Sub на Function (или наоборот) в названии, то концевик меняется сам, так неужели при вводе "ex" или хотя бы "exit" нельзя подхватить тип текущей процедуры  :)
А насчёт L/UBound, то просто постоянно попадаюсь на том, что жмякаю напрасно "Ctrl+Space" для появления подсказки. Привычка - вторая натура  :D
Изменено: Jack Famous - 06.09.2019 09:17:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Привычка - вторая натура  
Лень!  :D

Цитата
Jack Famous написал:
при вводе "ex" или хотя бы "exit" нельзя подхватить
Если пишущий не помнит что пишет, то … .  :D  

Если честно, то любые автоподстановки могут такую злую шутку сыграть... Если не ошибаюсь, то есть раскладка клавиатуры US-INT (Unitedstate International) , При работе с Linux и Cirix был более корректный её проброс. попытался её использовать на рабочем компе, а там есть особенность, при вводе кавычек , первая не появляется пока не появится вторая. Может быть для машинописи это и удобно, но кодить было невозможно, особенно когда была потребность нечетного числа кавычек в строке.  Пока не понял в чем причина, грешил на клаву,
По вопросам из тем форума, личку не читаю.
 
Цитата
Jack Famous написал:
Про Exit я думал так
дело в том, что Exit может быть использован не только с Sub и Function. Есть ведь и циклы Do и For, например, где для прерывания цикла так же используется Exit. Поэтому ассоциировать напрямую с чем-то конкретным VBA этот оператор не может без компиляции проекта, чтобы определить все вхождения операторов. Оператор End работает так же, но применяется реже.
Примерно тоже самое, кстати, и с объявлениями. Вы же можете объявить переменную с типом "блаблабла"? Да. Но то, что такого типа нет и не было VBA определит только после компиляции. Но на уровне написания он ничего не скажет про несуществующий тип.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
БМВ, лень — двигатель прогресса  ;)
Цитата
Дмитрий(The_Prist) Щербаков: Exit может быть использован не только с Sub и Function.
точно. Не связал с этим - тогда вопрос по нему отпадает, но вот что с Bound'ами?…
Изменено: Jack Famous - 06.09.2019 09:50:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Новый прикол: для такого "вшитого" объекта, как ActiveSheet после точки также нет никаких вариантов…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Мне кажется что с боундами и прочими тут замешаны какие-то коллекции. Ну например если пишешь Sheets. то после точки вылазит список, если пишешь Sheets(1). то после точки уже ничего не вылазит. Опять же UBound может быть необязательно у объявленного массива, например у SPLIT
Код
Sub kckmckcmd()
Dim i&, Txt$
Txt = "q w e r t y"
For i = 0 To UBound(Split(Txt, , , vbTextCompare))
    Debug.Print Split(Txt, , , vbTextCompare)(i)
Next
End Sub

Ну, а может у них есть внутренние теги, по которым и формируется этот выпадающий список. И при написании некоторых функций их забыли вложить  :) Вот и остались в подвешенном состоянии, не знали в какой момент нужно их появление. Опять же эти функции измеряют размерность массива. А до компиляции ещё неизвестно есть у тебя этот массив в коде или нет. Наличие массива можно определить только после компиляции, тут даже объявление переменных не поможет. В общем загадка.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox: если пишешь Sheets
это вообще интересный персонаж. Его ещё нельзя присвоить типом переменной (только As WorkSheet), хотя обычно в коде полностью заменяет WorkSheet
Изменено: Jack Famous - 06.09.2019 11:22:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я вообще Sheets не использую, это представляет из себя коллекцию рабочих листов. Только Worksheet применяю.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox: Sheets не использую, это представляет из себя коллекцию рабочих листов
а я думал, что листы диаграмм не входят в WorkSheets, в отличие от Sheets, то есть последняя больше. Тоже стараюсь не использовать.
Изменено: Jack Famous - 06.09.2019 12:30:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Alemox написал:
это представляет из себя коллекцию рабочих листов
ну вот как раз нет. Коллекция Sheets это коллекция ЛЮБЫХ листов в книге, включая листы диаграмм, листы макросов, рабочие листы. И именно поэтому после ввода точки нет подсказок, т.к. невозможно заранее определить к какому типу листа коллекции обращаемся.
А вот Worksheets это коллекция исключительно РАБОЧИХ листов и все методы и свойства там определены заранее и других быть не может.
Отсюда есть важны вывод: если хотите обратиться ко всем листам книги для сбора именно данных - имеет смысл всегда обращаться именно к Worksheets, чтобы не получить ошибку при обращении к листу диаграммы например, для получения данных ячеек.
Собственно, ActiveSheet несет в себе ту же засаду - это активный лист любого типа, а значит показать все доступные методы этого листа заранее нельзя.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, и снова выручаете)) Спасибо!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дмитрий я про это и говорил. Я просто ограничился рабочими листами так как их обсуждали.  :) Просто выразился некорректно. Надо было написать включает, а не состоит из. Каюсь запутал.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
Страницы: 1
Наверх