Маленькими, не выводимыми на печать элементами управления Label помечаю столбцы, из которых должен выбирать значения макрос. Это чтобы не нужно было лезть в код и что-то там править, если вдруг требуется изменить столбцы. Вообще-то получается очень просто и "юзабельно" (я так научился делать в своём "Удобном автофильтре" http://www.planetaexcel.ru/forum.php?thread_id=11478&page_forum=3&allnum_forum=70 и теперь часто использую). Файл лежит в общем доступе, а народу это понравилось. Я сделал даже для них краткую инструкцию как перенастроить автофильтр "под себя". Но объяснить далёкой от нормального использования Ёкселя дЭвушке что такое режим конструктора и как в него войти, чтобы можно было передвинуть элемент управления, а потом ещё не забыть из него выйти... Ну, в общем вы понимаете... Вот я и хочу сделать кнопочку (а потом "подвешу" это на DblClick по элементу управления), по которой можно будет просто перейти в режим конструктора. А при потере фокуса элементом - автоматически выйти из режима.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Вот, например, гляньте, что я наваял для ' Topic_HEADER : Поиск + автоматический переход в списке по первым буквам ' Topic_URL : http://www.planetaexcel.ru/forum.php?thread_id=12706 Здесь положением элементов Label1 и Label2 задаются столбцы с данными. Элементы сами позиционируются при клике по их ячейкам. НО ещё хотелось бы чтобы при DblClick по элементу появлялась возможность его перемещать...
Юрий, спасибо. Подвесил для пробы на: Private Sub Label1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Application.CommandBars("Control Toolbox").Controls(2).Execute End Sub Работает. А как выйти из режима конструктора при потере фокуса: Private Sub Label1_LostFocus() ????? End Sub
И попутно вопрос: как привязать не к кнопке на панели инструментов, а к её действию? Ведь они могут быть перемещены как у меня (Controls(2))или могут быть изменены имена?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
{quote}{login=Alex_ST}{date=19.07.2010 01:37}{thema=}{post}1. А как выйти из режима конструктора при потере фокуса:
2. И попутно вопрос: как привязать не к кнопке на панели инструментов, а к её действию? {/post}{/quote}1. В ссылке в моем предыдущем посте все это есть. И я посоветовал бы привязываться все же к ID элемента, нежели к его индексу на панели.
2. Вообще не понял. Что привязать и к какому действию?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий, спасибо за "наводку". Но там к стати так и остался открытым вопрос "как узнать ControlID?"
И к сожалению, в режиме конструктора перестают обрабатываться события. Поэтому выйти из режима по событию LostFocus не удаётся, т.к. оно не происходит...
А прицеплять к шэйпам не удобно, т.к. их легко случайно удалить, да и не нужно, т.к. двигаются они без режима конструктора...
Задумка не прошла... АбЫдно,пАнимаЭшь, ДА?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
А как узнать СontrolID, можно было бы и самим попробовать подумать:
Sub Get_Control_ID() Dim oCmBr As CommandBar, oCntrl As CommandBarControl, li As Long Application.ScreenUpdating = False Range("A1:B1") = Array("Caption", "ID") li = 1 For Each oCmBr In Application.CommandBars For Each oCntrl In oCmBr.Controls li = li + 1 Cells(li, 1) = oCntrl.Caption Cells(li, 2) = oCntrl.ID Next oCntrl Next oCmBr Set oCmBr = Nothing: Set oCntrl = Nothing Application.ScreenUpdating = True End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Покопался в И-нете и в MSDN нарыл как войти в режим конструктора: Sub TurnOnDesignMode() ThisWorkbook.ToggleFormsDesign End Sub
Попробовал приписать этот макрос к шэйпу на листе. Работает! Но описанный там же переключатель режима "вкл-выкл" почему-то не работает, а ругается, что свойства Workbook.DesignMode не существует:
Private Sub WorkbookToggleFormsDesign() If Not ThisWorkbook.DesignMode Then ThisWorkbook.ToggleFormsDesign End If End Sub
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
{quote}{login=Дъмитръ}{date=19.07.2010 02:50}{thema=}{post}Дмитрий, нашел Ваш пример, но для меня это загадка.{/post}{/quote}Где именно загадка? Какой пример?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Ё-маё, Дмитрий! Какое это имеет отношение к данной теме? Тут разговор про режим конструктора, а Вы про переход в редактор VBA спрашиваете. Что мешает свою тему создать или спросить хотя бы в той, где пример есть?
А делается это так: Правый клик на фигуре- Гиперссылка- Веб-страница Пишите туда: #ИмяМодуля.ИмяМакроса
P.S. В следующий раз за такое безобразие с вопросом не по теме и вообще из головы - удалю все посты не глядя и не отвечая. У нас тут тоже жара и лишний раз голову ломать, про какие Вы там примеры думаете, желания мало.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Так всё-таки: как программно узнать, включен в книге режим конструктора или нет?
А метод ToggleFormsDesign и макрос: Sub TurnOnDesignMode() ThisWorkbook.ToggleFormsDesign End Sub почему-то только включает, а не переключают (ON-OFF) режима конструктора А как тогда выйти из него ?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
{quote}{login=Alex_ST}{date=20.07.2010 09:12}{thema=}{post}А как тогда выйти из него ?{/post}{/quote}Алекс, ну ведь в ссылке, которую я дал есть строка, которая снимает режим конструктора: Application.CommandBars.FindControl(ID:=1605).Reset
Насчет узнать включен он или нет надо подумать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Application.CommandBars.FindControl(ID:=1605).Reset всего лишь выполняет пункт меню (т.е. имитирует нажатие кнопки). При этом вовсе не факт что ID:=1605 будет соответствовать режиму конструктора в других версиях и локализациях Ёкселя. Вот, к примеру, Юрий М 19.07.2010, 13:22 предлагал использовать Application.CommandBars("Control Toolbox").Controls(1).Execute а у меня панели настроены "под себя" и режиму конструктора соответствует вовсе не Controls(1), а Controls(2)... Поэтому это предложение мне сразу не очень понравилось и я стал искать альтернативные методы. То же вполне может касаться и обращению по ID. Согласитесь, что это своего рода "протез" в отличие от использования МЕТОДА Workbook.ToggleFormsDesign, который воздействует непосредственно на объект. И собственно вопрос-то остался только в том, почему этот метод не переключает, а только включает режим конструктора? А если это баг, то нельзя ли его обойти, запросив программно СВОЙСТВО состояния (включен/выключен) режима конструктора и (опять же узнав как) выключить его, используя соответствующий МЕТОД.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
{quote}{login=Alex_ST}{date=20.07.2010 12:42}{thema=}{post}Application.CommandBars.FindControl(ID:=1605).Reset всего лишь выполняет пункт меню (т.е. имитирует нажатие кнопки). При этом вовсе не факт что ID:=1605 будет соответствовать режиму конструктора в других версиях и локализациях Ёкселя. Вот, к примеру, Юрий М 19.07.2010, 13:22 предлагал использовать Application.CommandBars("Control Toolbox").Controls(1).Execute а у меня панели настроены "под себя" и режиму конструктора соответствует вовсе не Controls(1), а Controls(2)... Поэтому это предложение мне сразу не очень понравилось и я стал искать альтернативные методы. То же вполне может касаться и обращению по ID. Согласитесь, что это своего рода "протез" в отличие от использования МЕТОДА Workbook.ToggleFormsDesign{/post}{/quote}Не соглашусь и очень категорично. Во-первых: ID во всех локализациях один и не может быть заменен. А вот индекс(.Controls(1))как раз и меняется, о чем я и писал ранее - 19.07.2010, 13:48. Во-вторых: метод .Reset не "всего лишь выполняет пункт меню (т.е. имитирует нажатие кнопки)", а сбрасывает нажатую кнопку меню. А выполняет .Execute.
Я так полагаю, что метод Workbook.ToggleFormsDesign Вы не считаете протезом, несмотря на то, что как раз он способен только включить режим конструктора? А .DesignMode вообще умер в 97 Exele....
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Ну, на счёт постоянства ID вам, ГУРУ, конечно виднее, а я просто намотаю себе это на ус... Но согласитесь, что программный код, в котором режим конструктора включается методом Workbook.ToggleFormsDesign, намного "читабельнее" чем то же действие, выполняемое по директиве Application.CommandBars.FindControl(ID:=1605).Execute ... Ведь что делается при Workbook.ToggleFormsDesign ясно безо всяких комментариев, а вот для того, чтобы узнать, что выполняется по директиве Application.CommandBars.FindControl(ID:=1605).Execute, придётся очень поломать голову (я не думаю, что кто-нибудь в состоянии запомнить соответствие этих почти 1,5 тысячи номеров выполняемым действиям). Ну, ведь не пишете же вы для того чтобы ВСТАВИТЬ директиву Application.CommandBars.FindControl(ID:=22).Execute
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Дъмитръ, вы мой файл post_138679.zip открывали? Тему http://www.planetaexcel.ru/forum.php?thread_id=12706 смотрели? Вроде бы и в файле и в коде и в теме вполне должно хватать разъяснений и комментариев ... (уж чем-чем, а недостаточностью комментариев в программах я, кажется, не грешу) Ну, что же там может быть не понятно? Я просто для того, чтобы указать программе, по каким диапазонам работать, поставил на лист элементы управления - Label1 и Label2. В результате появилась возможность для изменения диапазонов данных (это может потребоваться, например, при удалении или добавлении строк/столбцов в таблицу) не лезть в код VBA чтобы там ручками исправлять диапазоны, а просто переместить в нужные места (в заголовки диапазонов) элементы управления. При удалении/добавлении столбцов/строк на листе эти элементы управления скорее всего переместятся вместе с ячейками, к которым они "привязаны" сами и ничего перетаскивать мышкой не придётся... Но уж если вдруг почему-то нужно будет самому изменить диапазоны данных, то тут без режима конструктора никак не обойтись, т.к. элементы управления мышкой "цепляются" только в нём. Вот мне и хотелось бы ещё больше упростить работу с таблицей путём введения возможности входа в режим конструктора ну, например, по событию двойного клика по ячейке, где стоит элемент управления, и выхода из него по событию Worksheet_SelectionChange...
уф-ф-ф... теперь понятно?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)