|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Замучался с этими приколами VBA в сфере двуяких синтаксисов: с именованными аргументами и без них. Иногда возникает необходимость модифицировать макрос, чтоб его можно было вызывать в режиме COM-сервера (речь идёт об Excell'е 2003). Написал уже несколько таких макросов - и все прекрасно работают, как изнутри Экселя, так и снаружи - когда надо его "напрячь" Фоксом, например. И соответствующая адаптация макрокода заключается, преимущественно, в модификации вызова функций/методов в альтернативном синтаксисе, т.е. - без именованых аргументов, а просто с перечислением их в скобках после имени метода. Только вот беда - попался один метод (ActiveSheet.Hyperlinks.Add), который ну никак не принимает такой синтаксис - подавай ему только именованные аргументы. Но такой вариант в COM-вызовах неприменим. :( Вот так: ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=hy, TextToDisplay:="Описание" работает прекрасно (в переменной hy хранится WEB-адрес). Также нормально работает с явным указанием диапазона: ActiveSheet.Hyperlinks.Add Anchor:=Cells(i+1, op1), Address:=hy, TextToDisplay:="Описание" А в нужном мне альтернативном варианте: ActiveSheet.Hyperlinks.Add (Cells(i+1, op1), hy, , , "Описание") - выдаёт ошибку компиляции и указывает, что после закрывающей скобки ожидается знак = Уже пробовал и пустые строки на место отсутствующих аргументов ставить - ничего не помогает. Помогите победить, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2011, 20:39 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
> Автор: Гость12 > закрывающей скобки убери их вообще и в зависимости от того что такое hy и чему оно равно щастье, у тебя, очень может быть :) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2011, 20:48 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
To Игорь Горбонос: Большое спасибо - последовал Вашему совету и компилятор перестал ругаться. В COM-вызове, правда ещё не проверял, но, думаю, там скобки особой погоды не сделають :) Трудновато перестроиться: обычно неименованные аргументы методов - в скобках указываются... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2011, 21:12 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
> Автор: Гость12 > Трудновато перестроиться: обычно неименованные аргументы методов - в скобках указываются... Для VB и VBA аргументы функции заключаются в скобки только если результат действия функции присваивается или перед вызовом стоит служебное слово Call. Вот и все правила :) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2011, 21:16 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Спасибо, учту :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2011, 21:22 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
To Игорь Горбонос: Хм.. Вот обнаружил "политику двойных стандартов" в отношении скобок: Selection.Insert (xlDown) - ничего не присваивается и Call не упоминается, а скобки воспринимаются компилятором нормально. Очевидно, из правил есть-таки не вполне логичные исключения. Выходит, как в известном юморе: "Здесь - мы играем, здесь - не играем, а здесь - мы рыбу заворачивали" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2011, 21:56 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Гость12To Игорь Горбонос: Хм.. Вот обнаружил "политику двойных стандартов" в отношении скобок: Selection.Insert (xlDown) - ничего не присваивается и Call не упоминается, а скобки воспринимаются компилятором нормально. Очевидно, из правил есть-таки не вполне логичные исключения. Выходит, как в известном юморе: "Здесь - мы играем, здесь - не играем, а здесь - мы рыбу заворачивали" :) Просто "(xlDown)" в данном случае является выражением и эти скобки никак не относятся к синтаксису вызова процедуры, а участвуют в выражении. То бишь, можно написать (2+5) а можно написать (7) понимаете, о чем речь? так что нет двойных стандартов - все логично ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2011, 00:37 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
To Shocker.Pro: Аргумент - тоже зачастую бывает выражением, так что - неубедительно как-то. Кроме того, посмотрите ниже ActiveSheet.OLEObjects.Add(...) - там тоже есть к чему придраться: дескать, если ещё и после скобок стоит Select - то тогда имеем ещё одно исключение из правил VBA. Ну да Бог с ними - не я их придумывал, не мне их и критиковать :) Не судите за это - так я быстрее их усвою :) Вот тут возник вопрос покруче: можно ли в макросе запрограммировать добавление кнопки на Эксель-лист и сразу же указать код её реакции на событие Click() ? Просто в моём макросе из исходного листа данных (полученных из 1С) создаётся выходной Эксель-файл с прайс-листом, на котором должна образоваться кнопка, при нажатии на которую из прайс-листа убираются все строки, кроме содержащих выбранные пользователем товары (т.е. в колонке Заказ пользоваетль там проставил какое-либо количество >0). Делаю вот так: ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=479.2, Top:=96.8, Width:=86.4, Height:=30.4).Select А дальше - не знаю, как передать программный код в событие полученного объекта. В принципе понимаю, что можно, наверное, сделать объектную ссылку на вновь создаваемый объект (кнопку), а потом уже через эту ссылку програмить её свойства Left, Top, Width, Height, и т.д. А вот методы таким образом можно описывать? И вообще решаема ли такая задача в принципе - из-под макроса создавать макрос? Или лучше это проделывать каким-либо более приемлемым методом? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2011, 16:27 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Гость12Кроме того, посмотрите ниже ActiveSheet.OLEObjects.Add(...) - там тоже есть к чему придраться: дескать, если ещё и после скобок стоит Select - то тогда имеем ещё одно исключение из правил VBA. А где здесь исключение? Selectom после скобок ты "материализуешь" вновь созданный и добавленный объект, т.е. делаешь неявное присваивание. По добавлению кнопки не подскажу, не делал. А для добавления кода в книгу нужно иметь "доверенный доступ к проекту" что не всегда есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2011, 22:48 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
To Игорь Горбонос: "материализация" и "неявное присваивание" - не с налёту мной понимаются, я - "выходец" из программерских сред с более строгим и более однозначным синтаксисом, без всяких закулисных подразумеваний. Поэтому - мне трудновато переучиваться с "диктатуры" на "демократию" в программировании :) А вот насчёт доверенного доступа к проекту - спасибо за эту подсказку: действительно, это и оказалось камнем преткновения. Нашёл альтернативный выход - решил формировать прайс в заранее заготовленном файле с уже заложенной в нём кнопкой, имеющей нужный мне программный код. Конечно, не очень изящное решение, но пока - помогает. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2011, 13:58 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Вот, блин, на ещё одну "НЕлогичность" напоролся - не могу из макроса поменять текст на кнопке. Вот так (до пуска макроса - кнопки на листе ещё нет) - не получается : Код: plaintext 1.
И вот так (кнопка с именем "CommandButton1" уже есть) - тож не получается : Код: plaintext 1.
В обоих случаях VBA выдаёт, что "объекту такое свойство или метод неизвестно". Хотя в окне свойств видно, что свойство Caption - у кнопки имеется. Можно ли это победить? Подскажите, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2011, 19:20 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Во, какой прикол обнаружил: даже такое свойство как Name у кнопки программно можно изменить, а Caption - ну никак :( Хотя, по логике вещей, свойство Name - намного более критично, чем Caption, но даже оно подчиняется программному коду, а Caption - упорствует: Вот так: Код: plaintext
А вот так: Код: plaintext
Ну неужели в VBA нельзя задать надпись на кнопке программно? В Тырнете об этом не нашёл ни слова. Подскажите, где можно об этом узнать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2011, 20:03 |
|
Альтернативный синтаксис ...Hyperlinks.Add
|
|||
---|---|---|---|
#18+
Ура! Победил-таки - там, оказывается, надо ещё одно неочевидное промежуточное звено упомянуть в синтаксисе обращения к кнопке: ActiveSheet.OLEObjects("CommandButton1").Object.Caption = "Сумма заказа" В общем, три круга танцев с бубнами - и VB становится дружелюбным Васей :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2011, 20:33 |
|
|
start [/forum/topic.php?fid=60&msg=39026944&tid=2155827]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 169ms |
0 / 0 |