Никак не могу справиться со следую щей задачкой. Создал форму, назвал ее UserFormMy. Добавил на форму в режиме работы с редактором несколько кнопок. Придал им некую единообразность в наименовании: каждая кнопка объявляется начальным именем "cmbBtm" и содержит номер на конце. Создал Модуль в книге, переименовал его "General". Как выше написано, создал форму "UserFormMy" и разместил на ней три кнопки; "cmbBtm5", "cmbBtm3", "cmbBtm6". В модуле "General". создал основной исполняемый код, который предварительно исследует имеющуюся форму. В коде проверяется, имеются ли на форме интересующие кнопки, и, если таковые находятся, то проверяется, а имеются ли для них события нажатия на них (событие "Click"). Если такое событие не обнаружено, то программно создается. После проверки всех объектов (Control) на исследуемой UseForm, в исполняемом коде загружается форма и выводится на экран. Ожидаемый результат - при нажатии на интересующую кнопку ожидается вызов события "Click". Однако этого не происходит. При этом созданные события замечательно записываются в коды формы. Но лишь завершив основной исполняемый код и заново его запустив, тогда только начинают работать события для кнопок. А почему сразу не срабатывают, если я только после всех предварительных подготовок загружаю форму? Полный код приведен в прилагаемом файле.
Характеристики системы; Windows 10 Pro 64-bit, Microsoft Office: Microsoft Project профессиональный 2019 - ru - ru
Подскажите, пожалуйста, существует ли какая-то возможность объект, описанный в созданном файле формата .xlsm, добавить в панель управления Toolbox редактора VBE? Возможно нужно мой файл сконвертировать/переместить в какую-то специальную папку, где хранятся физические файлы уже созданных элементов управления, таких. как кнопка, текстовое поле, переключатели, флажки и т.п., отображаемых в этой панели? Или следует использовать какой-то другой метод?
Есть у меня созданный файлик, который выполняет функцию вставки на рабочий лист кнопочки, при нажатии на которую открывается форма с нарисованным календарем, где можно выбрать любую дату и вставить ее в любую ячейку в активный лиcт excel, выбранную пользователем. Он прекрасно работает как самостоятельный файл, так и на его основе создана надстройка. которая также прекрасно работает. Абсолютно бесполезная приблуда, но задел был именно в том, чтобы впоследствии иметь возможность использовать этот скрипт в качестве элемента управления.
Например. Проектирую новую UserForm. Добавляю элементы управления из Toolbox. В том числе хочется, чтобы среди элементов управления, находящихся на этой панели, была бы и кнопочка с иконкой моего календарика, которую я бы имел возможность выбрать, вставить ее в форму и связать с каким-нибудь элементом, типа, текстового поля.
Пока мои исследования по этому направлению, увы, не привели к возможности решить эту задачу
В лист книги Excel внедрен комплекс объектов ActiveX, например, вставлен список, поле со списком, текстовое поле, подпись, кнопка, то есть набор произвольный. Проверить общий состав объектов легко кодом, которым можно получить имя каждого ActiveX:
Код
Sub Test()
Dim ExistOLEObj As OLEObject
With ThisWorkbook.ActiveSheet
For Each ExistOLEObj In .OLEObjects
Debug.Print ExistOLEObj.Name
Next
End With
End Sub
А можно каким-то свойством определить не имя, а тип объекта ActiveX? Что если это текстовое поле, то возвращался бы конкретный идентификатор, что это именно текстовое поле, а если кнопка, то это именно кнопка, а не что-то иное.
Суть вопроса заключается в следующем. Пользователь загружает книгу Excel. При этом размер окна самого приложения Excel может занимать как все экранное пространство монитора, так размеры могут быть установлены самим пользователем, что для решения данной задачи не является принципиальным. После отображения загруженной книги на экране пользователь, не воздействуя на клиентскую область окна, вызывает на запуск определенный макрос, управляя мышью (выбирает пункт меню "Разработчик", далее на ленте выбирает иконку "Макросы" в группе "Код", выбирает имя нужного макроса и запускает команду "Выполнить"). Задача макроса заключается в заполнении видимой на экране области клиентской части объектом ActiveX, например, Image. Для этого всего лишь надо узнать координаты (левую и верхнюю) или адрес ячейки активного листа, которая является первой в этой видимой клиентской области. Для наглядности прилагаю графический файл, на примере которого хочется понять как мне узнать координаты или адрес ячейки I49, которая является первой ячейкой в отображаемой клиентской области. При этом совершенно не факт, что данная ячейка является активной, она просто первая отображаемая. Существуют ли свойства, методы, функции, которые можно задействовать в запускаемом исполнительном коде, чтобы вычислить координаты или адрес этой ячейки? Причем средствами VBA я запросто могу четко переместить курсор мыши в пределы интересуемой меня ячейки.
Система 64-bit с версией офиса 64-bit. Вставляю. в лист Excel объект Image из предлагаемой коллекции объектов ActiveX. Изменяю значения свойств внедренного объекта через использование окна "Свойства" в режиме конструктора в опции меню "Разработчик": 1. Устанавливаю свойству BackStyle значение fmBackStyleTransparent (прозрачный фон) 2. Устанавливаю свойству BorderStyle значение fmBorderStyleNone (обрамления объекта невидимы) . Все замечательно, объект становится прозрачным без рамок! Теперь делаю тоже самое, но с использованием макроса. Код макроса;
Код
Sub Proba()
Dim I As Integer, EistOLEObj As OLEObject
I = 1
'Определяем количество имеющихся на активном листе объектов ActiveX
With ThisWorkbook.ActiveSheet
For Each EistOLEObj In .OLEObjects
I = I + 1
Next
'Добавляем на лист дополнительный объект ActiveX Image
.OLEObjects.Add ClassType:="Forms.Image.1", _
DisplayAsIcon:=False, _
Left:=0, _
Top:=0, _
Width:=175, _
Height:=320
'Переопределяем имя добавленного объекта для последующего удобства обращения к нему
.OLEObjects(I).Name = "TempImage"
'Устанавливаем свойства объекту, чтобы он был невиден пользвателю
With .OLEObjects("TempImage")
.Object.BackStyle = fmBackStyleTransparent
.Object.BorderStyle = fmBorderStyleNone
End With
End With
End Sub
Не работает корректно! Границы объекта успешно не выделяются, но при этом фон объекта не становится прозрачным. Почему?
Принудительное изменение средствами VBA внешнего вида указателя курсора мыши при нажатии на кнопку подключенной надстройки, Подключение файла вида курсора мыши из списка, расположенного в каталоге C:\Windows\Cursors
Здравствуйте! 64-bit операционная система с 64-bit версией офиса (хотя, особо пока без разницы, ибо прилагающая ниже ссылка на найденный пример также выдает безуспешный результат и в 32-bit системе). Итак, есть подключенная надстройка, представляющая из себя отдельную вкладку на ленте и содержащая кнопку. Хочется, чтобы при нажатии на эту кнопку внешний вид курсора менялся со стандартной левонаправленной вверх стрелки на, например, вид руки с вытянутым указательным пальцем. Вполне стандартный курсор, который можно найти в каталоге "C:\WINDOWS\Cursors\aero_link_il.cur" Найденный в интернете пример по ссылке: http://rusproject.narod.ru/winapi/l/loadcursorfromfile.htmlпоказал на необходимость применения функций API LoadCursorFromFileAиSetCursor. Однако ни адаптация этих функций под операционную систему 64-bit, ни прямое применение кода примера в системе 32-bit к желаемому результату не привело. Иные поиски в инете с моделированием различных вариантов запросов по данному вопросу также не пролили свет на решение проблемы. Предварительный код получается таким:
Код для системы 64-bit:
Код
Declare PtrSafe Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As LongPtr
Declare PtrSafe Function SetCursor Lib "user32" (ByVal hCursor As LongPtr) As LongPtr
Sub proba()
Dim hCursor As LongPtr
hCursor = LoadCursorFromFile("C:\WINDOWS\Cursors\aero_link_il.cur")
If hCursor = 0 Then End
SetCursor hCursor
End Sub
Код для системы 32-bit:
Код
Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Declare PtrSafe Function SetCursor Lib "user32" (ByVal hCursor As LongPtr) As Long
Sub proba()
Dim hCursor As Long
hCursor = LoadCursorFromFile("C:\WINDOWS\Cursors\aero_link_il.cur")
If hCursor = 0 Then End
SetCursor hCursor
End Sub
Кто-нибудь сможет подсказать, как добиться желаемого результата?
Понимаю, тема изъезженная, однако, блуждая по бесконечным просторам инета, на текущий момент не сумел найти ответа на вот какой вопрос. Есть форма (UserForm), напичканная множеством объектов. Контроль внутри происходящего в форме, как в муравейнике - четко и жестко, мышь не проскользнет. Но вот засада. Мерзкий пользователь, работая с формой, вдруг по непонятно каким соображениям перемещает курсор мыши за границы формы. И вот тут как раз и требуется просигнализировать, так сказать, дать понять исполняемому коду, что нарушена граница, пересечена "точка события", если уж совсем увлекаться в эпитеты, анализируя структуры объектов, аналогичных Черным дырам. Пусть это даже будет вызов простейшего макроса, содержащего всего лишь вывод на экран предупреждающего сообщения, не важно. Важно понять как вызвать этот макрос, к какому событию какого объекта формы обратиться. Я скрупулезно исследовал. Использование события формы UserForm_MouseMove не помогает. И даже пытался зайти с другой стороны Изучил возможности функции API GetCursorPos, определяющей координаты текущего расположения курсора на экране, в результате чего научился дрессировать UserForm, как в цирке на арене, располагая ее где захочу и как захочу. Пытался даже комбинировать, но безрезультатно. Чувствую, что решение где-то рядом, но найти пока не могу. Люди добрые, "поможите" чем можете!
Здравствуйте, Уважаемые! Всем мира и благополучия!
Может кто-нибудь подскажет правильный синтаксис XML элемента структуры файла формата .xlsm, содержащий параметры пользовательской настройки ленты, который при загрузке этого файла определенные содержащиеся в нем команды (макросы) помещал в конкретную пользовательскую вкладку при ее наличии? Или иными словами хочется добиться вот какого результата. Предположим, создана и подключена к приложению Excel надстройка. При загрузке приложения надстройка отображается отдельной вкладкой на ленте. Для упрощения задачи моделируем, что приложение Excel уже загружено, а следовательно, подключена и надстройка. Теперь рассматриваем загрузку через приложение файла, содержащего какие-то макросы. Создать и оформить для нужной группы команд этого файла отдельную вкладку на ленте, отображающую пользователю возможность их использования, проблем не вызывает. А вот как дать компу инструкции средствами XML кода или иными способами, чтобы эти макросы, объединенные в группу, были помещены именно во вкладку, созданной надстройкой? Причем проверить, подключена ли надстройка к приложению при загрузке файла, также проблем не вызывает. Вызывает вопрос именно обращения к этой вкладке, когда идентифицировано, что она есть в наличии на ленте.