Страницы: 1
RSS
Использовать значение EditBox из Ribbon-панели через VBA, поиск мне не помог(
 
Доброе утро, гуру экселя! Давно к вам не обращался)
Но вот появился повод.
Никак не могу обратиться к editbox в коде, вызываемом нажатием соседней кнопки на ribbon-панели. Поиск по форуму и по интернету показывает такие вот конструкции, но не пойму как ими пользоваться:
Код
Public Sub testeditbox(ctrl As IRibbonControl, tttt$) 
MsgBox tttt 
End Sub 
Function tttt(control As IRibbonControl, ByRef returnedVal) 
returnedVal = "" 
End Function
строка XML
Код
 <editBox id="edBox" enabled="true" getText="tttt" onChange="testeditbox"/>
Процедура testeditbox отрабатывает без вопросов,msgbox вываливается, но как вызвать функцию tttt? Какие аргументы ей передать?
В инете куча подобных моему вопросов, но ответы на них у меня не работают, почему-то. Вот еще, например:
Код
Option Explicit

Public RibbonTextBox As String

'Callback for MyEditBox onChange
Sub SetTextValue(control As IRibbonControl, text As String)
     RibbonTextBox = text
End Sub

'Callback for MyButton1 onAction
Sub HelloWorld(control As IRibbonControl)
     MsgBox RibbonTextBox
End Sub
Но как процедуру HelloWorld повесить на кнопку из ribbon-панели?

У меня простецкая задача - в окошко вводится текст, по нажатию кнопки лист с таким именем открывается в активной книге. Вот код xml:
Код
<editBox id="SheetName" onChange="SetText" getText="GetText" label="Имя листа"/>
<button id="Button1" label="Найти лист в открытой книге" onAction="find_well_in_activewb" size="large" imageMso="FindDialog"/>
И в процедуре find_well_in_activewb я не могу получить текст из editbox. Помогите, пожалуйста!
Заранее спасибо)
 
peat, столько понаписали, лучше бы файл пример приложили, быстрее бы помощь была.
Из того, что видно. Имя листа вы получаете при срабатывании процедуры "SetText". По логике, в ходе этой процедуры имя листа должно записаться в переменную, которую будет видно в процедуре "find_well_in_activewb". Как у вас написано, нам не ведомо.
 
StepanWolkoff, спасибо за ответ! Прикладываю файл! Но в нем не особо что есть.
Цитата
StepanWolkoff написал:
Имя листа вы получаете при срабатывании процедуры "SetText". По логике, в ходе этой процедуры имя листа должно записаться в переменную, которую будет видно в процедуре "find_well_in_activewb". Как у вас написано, нам не ведомо.
Именно так! Но у меня никак не написано. Ну, почти никак. Вот что есть:
Код
Public SheetNameText As String
Sub SetText(control As IRibbonControl, text As String)
     SheetNameText = text
End Sub
Этот кусок кода отрабатывает нормально - если я в окно пишу "123" то в переменную SheetNameText записывается "123".
Вот код, который срабатывает по кнопке "Button1":
Код
Sub find_well_in_activewb()
Dim Sheet_name As String
Sheet_name = SheetNameText
ActiveWorkbook.Worksheets(Sheet_name).Activate
End Sub
Но в эту процедуру значение SheetNameText не приезжает. Если предварительно перед нажатием кнопки в editbox внести новое выражение, то ошибка "Wrong number of arguments or invalid property assignment"
 
В данном контексте вам функция getText="GetText"  не нужна, вы не сможете обновить это поле.
У вас нету события загрузки ленты.
Остальной код рабочий
 
Doober, спасибо большое! Все работает, однако, я не совсем понимаю, как)
Вы просто добавили в процедуру find_well_in_activewb событие control As IRibbonControl? Но я так пробовал делать, не взлетало...
 
peat, воспользуйтесь редактором ленты Ribbon XML Editor
 
Возможно вам подойдет этот вариант.
Листы сами найдутся.
Половина кода моя, половина WizarD.89
Изменено: Doober - 27.12.2016 02:28:57
 
Цитата
StepanWolkoff написал:
воспользуйтесь редактором ленты  Ribbon XML Editor
Именно им и пользуюсь, но не могу понять, как это сделать. Вы можете помочь советом?
Цитата
Doober написал:
Возможно вам подойдет этот вариант.
Спасибо, попробую
 
SetText вызывается в трёх случаях:
1) при загрузке файла
2) при инвалидации элемента
3) при инвалидации всей ленты

В приложенном файле я добавил кнопку "Invalidate Editbox", который делает editbox инвалидным, после чего вызывается SetText и присваивается какое-то значение (например, текст в константе sDefaultText). GetText вызывается при потере фокуса. Как и отметил Doober, для работы этой системы нужен объект ленты, который и делает editbox инвалидным.
There is no knowledge that is not power
 
Здравствуйте!
У меня проблема ещё проще, наверное.
Я хочу, чтобы при нажатии на кнопку её размер менялся с большого Large на маленький Small, при повторном нажатии - наоборот.

При открытии файла - если это XlsM, или при запуске Excel"а, если это XlaM, срабатывает вот такой код:
Код
Sub GetSize(control As IRibbonControl, ByRef Size)
 
Const Large As Integer = 1
Const Small As Integer = 0
 
Select Case control.ID
    
  Case "aButton01": Size = Large
  Case "aButton02": Size = Small
  Case "aButton03": Size = Small
 
...........

Надо как-то заставить эту функцию сработать не при открытии, а сразу после нажатия на кнопку.

В порядке уточнение - пусть с кнопками связаны некие функции:
Sub RunMacro(control As IRibbonControl)
Код
Select Case control.ID
  
  Case "aButton01": Application.Run "Ribbon_A_01"
  Case "aButton02": Application.Run "Ribbon_A_02"
...............  

Вот эти функции:
Код
Sub Ribbon_A_01
 RMShiftMode = 2
End Sub
Sub Ribbon_A_02()
 RMShiftMode = 3
End Sub
Правильно ли я понимаю, что надо как-то из функции Ribbon_A_01 вызвать функцию GetSize?
И если это правильно, то как это сделать?

ЗЫ Видимо, аргумент "control" это и есть кнопка aButton01.
Как же его задать, где получить ссылку на этот объект aButton01?

Должно быть что-то вроде:
Код
Call GetSize(Controls("aButton01"), 1) 

Изменено: MU-GK - 30.11.2017 04:41:30
 
Решение найдено!
Всем спасибо!
 
Поделитесь
 
vikttur, батенька ещё и кроссовод оказывается
Соблюдение правил форума не освобождает от модераторского произвола
Страницы: 1
Наверх