powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Альтернативный синтаксис ...Hyperlinks.Add
14 сообщений из 14, страница 1 из 1
Альтернативный синтаксис ...Hyperlinks.Add
    #37085347
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Замучался с этими приколами 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, , , "Описание") - выдаёт ошибку компиляции и указывает, что после закрывающей скобки ожидается знак =
Уже пробовал и пустые строки на место отсутствующих аргументов ставить - ничего не помогает.
Помогите победить, пожалуйста.
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37085355
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Гость12
> закрывающей скобки

убери их вообще и в зависимости от того что такое hy и чему оно равно щастье, у тебя, очень может быть :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37085378
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Игорь Горбонос:
Большое спасибо - последовал Вашему совету и компилятор перестал ругаться. В COM-вызове, правда ещё не проверял, но, думаю, там скобки особой погоды не сделають :)
Трудновато перестроиться: обычно неименованные аргументы методов - в скобках указываются...
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37085382
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Гость12
> Трудновато перестроиться: обычно неименованные аргументы методов - в скобках указываются...


Для VB и VBA аргументы функции заключаются в скобки только если результат действия функции присваивается или перед
вызовом стоит служебное слово Call.
Вот и все правила :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37085389
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, учту :)
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37085419
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Игорь Горбонос:
Хм.. Вот обнаружил "политику двойных стандартов" в отношении скобок:
Selection.Insert (xlDown) - ничего не присваивается и Call не упоминается, а скобки воспринимаются компилятором нормально.
Очевидно, из правил есть-таки не вполне логичные исключения. Выходит, как в известном юморе: "Здесь - мы играем, здесь - не играем, а здесь - мы рыбу заворачивали" :)
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37085600
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость12To Игорь Горбонос:
Хм.. Вот обнаружил "политику двойных стандартов" в отношении скобок:
Selection.Insert (xlDown) - ничего не присваивается и Call не упоминается, а скобки воспринимаются компилятором нормально.
Очевидно, из правил есть-таки не вполне логичные исключения. Выходит, как в известном юморе: "Здесь - мы играем, здесь - не играем, а здесь - мы рыбу заворачивали" :)

Просто "(xlDown)" в данном случае является выражением и эти скобки никак не относятся к синтаксису вызова процедуры, а участвуют в выражении. То бишь, можно написать
(2+5)
а можно написать
(7)
понимаете, о чем речь?

так что нет двойных стандартов - все логично
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37086080
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, и т.д. А вот методы таким образом можно описывать? И вообще решаема ли такая задача в принципе - из-под макроса создавать макрос? Или лучше это проделывать каким-либо более приемлемым методом?
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37086438
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость12Кроме того, посмотрите ниже ActiveSheet.OLEObjects.Add(...) - там тоже есть к чему придраться: дескать, если ещё и после скобок стоит Select - то тогда имеем ещё одно исключение из правил VBA. А где здесь исключение? Selectom после скобок ты "материализуешь" вновь созданный и добавленный объект, т.е. делаешь неявное присваивание.

По добавлению кнопки не подскажу, не делал. А для добавления кода в книгу нужно иметь "доверенный доступ к проекту" что не всегда есть.
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37086784
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Игорь Горбонос:
"материализация" и "неявное присваивание" - не с налёту мной понимаются, я - "выходец" из программерских сред с более строгим и более однозначным синтаксисом, без всяких закулисных подразумеваний. Поэтому - мне трудновато переучиваться с "диктатуры" на "демократию" в программировании :)
А вот насчёт доверенного доступа к проекту - спасибо за эту подсказку: действительно, это и оказалось камнем преткновения. Нашёл альтернативный выход - решил формировать прайс в заранее заготовленном файле с уже заложенной в нём кнопкой, имеющей нужный мне программный код. Конечно, не очень изящное решение, но пока - помогает. :)
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37087078
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, блин, на ещё одну "НЕлогичность" напоролся - не могу из макроса поменять текст на кнопке.

Вот так (до пуска макроса - кнопки на листе ещё нет) - не получается :
Код: plaintext
1.
Set cmdBtn = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:= 732 , Top:= 3 , Width:= 92 , Height:= 35 )
cmdBtn.Caption = "Сумма заказа"

И вот так (кнопка с именем "CommandButton1" уже есть) - тож не получается :
Код: plaintext
1.
ActiveSheet.Shapes("CommandButton1").Select
Selection.Caption = "Сумма заказа"

В обоих случаях VBA выдаёт, что "объекту такое свойство или метод неизвестно". Хотя в окне свойств видно, что свойство Caption - у кнопки имеется.
Можно ли это победить? Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37087129
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во, какой прикол обнаружил: даже такое свойство как Name у кнопки программно можно изменить, а Caption - ну никак :(
Хотя, по логике вещей, свойство Name - намного более критично, чем Caption, но даже оно подчиняется программному коду, а Caption - упорствует:

Вот так:
Код: plaintext
cmdBtn.Name = "Сумма заказа"
- проходит нормально.
А вот так:
Код: plaintext
cmdBtn.Caption = "Сумма заказа"
- ругается (Object doesn't support this property or method) :(

Ну неужели в VBA нельзя задать надпись на кнопке программно? В Тырнете об этом не нашёл ни слова. Подскажите, где можно об этом узнать.
...
Рейтинг: 0 / 0
Альтернативный синтаксис ...Hyperlinks.Add
    #37087154
Гость12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура! Победил-таки - там, оказывается, надо ещё одно неочевидное промежуточное звено упомянуть в синтаксисе обращения к кнопке:
ActiveSheet.OLEObjects("CommandButton1").Object.Caption = "Сумма заказа"
В общем, три круга танцев с бубнами - и VB становится дружелюбным Васей :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Альтернативный синтаксис ...Hyperlinks.Add
    #39026944
Big Smoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Игорь Горбонос - спасибо большое, выручил, ты гений)))
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Альтернативный синтаксис ...Hyperlinks.Add
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]