Можно ли запретить MS Access автоматически изменять выбранную вкладку ленты при использовании пользовательской ленты?

когда пользовательский XML-файл пользовательского интерфейса используется для добавления нескольких пользовательских вкладок ленты в Access, выбранная вкладка ленты изменяется на первую пользовательскую вкладку при закрытии формы.

мы загружаем пользовательскую ленту программно из VBA. Я создал accdb, который воспроизводит проблему. Папка также содержит XML-файл, содержащий определение ленты. Он должен быть в том же каталоге, что .файл accdb.

проблема может быть легко продемонстрировал:

  1. откройте базу данных RibbonTest.accdb файл,
  2. переключитесь на Tab2 и откройте Form2 с помощью кнопки на ленте и
  3. закрыть форму Form2.

обратите внимание, что Tab1 теперь активен.

конечно, в этом небольшом примере db эта проблема кажется очень незначительной. Однако у нас есть очень большой проект со множеством пользовательских вкладок, каждая из которых содержит множество групп и кнопок. Наши пользователи находят это очень расстраивает действительно, что они продолжаю терять свое место на ленте каждый раз, когда они закрыть форму.

мы исследовали обходной путь, где мы программно храним выбранную вкладку и восстанавливаем ее, когда мы думаем, что нам нужно. Однако сделать это надежно оказалось непросто. (Нет API Office для автоматизации ленты, как это, но эта статья помогла.)

кто-нибудь сталкивался с этой проблемой? Вы нашли способ предотвратить изменение вкладки автоматически?

Edit: похоже, что эта проблема была введена с исправлением, реализованным в Office 2010 С пакетом обновления 1 . (Извините, нет ссылки: не думаю, что у меня может быть больше двух.) Проблема отсутствует в версии RTM. Список исправлений для SP1 включает следующее: "Access не активирует или не возвращает пользователя на правильную вкладку ленты для ранее открытого объекта базы данных, когда пользователь возвращается к этому объекту."Похоже, они пытались исправить использование Форма.Свойство RibbonName (которое поддерживает контекстные ленты), но в процессе сломало ленту по умолчанию.

6 ответов


Возможные Решения Проблемы

что - то я наткнулся, что работает для меня, чтобы скрыть первую вкладку в XML, используя видимый тег. Я не тестировал его много, но у меня есть копия стандартной домашней вкладки, которая скрыта (не знаю, должна ли она быть заполненной вкладкой или нет). Мне кажется, что, поскольку Access не может активировать скрытую вкладку при закрытии формы, она остается на выбранной.

Я не знаю, было ли это исправлено в Access 2013 или нет, но, надеюсь, информация не слишком поздно, чтобы быть полезным кому-то.


эта строка исправляет проблему:

<tab id="tabBogus" label="Bogus" visible="false"></tab>

просто сделайте свою первую вкладку в <tabs>. Большое спасибо потенциальному обходному решению Скотта!! (Пытался проголосовать и/или прокомментировать, но просто подписался, поэтому недостаточно репутации.) Это сэкономило часы (или дни) работы по сравнению с другим сложным обходным путем! Спасибо!


это ошибка!

служба поддержки MS приняла сообщение об ошибке для этого и прокомментировала Office 2010 SP1: "реализованное изменение позволяет отслеживать активную вкладку для каждого объекта базы данных (формы, отчеты и т. д.) С помощью TCID вкладки, чтобы при перемещении между объектами активная вкладка восстанавливалась. Однако пользовательские вкладки используют одно и то же значение TCID, поэтому с этим изменением активная вкладка для пользовательских вкладок всегда будет перемещаться в первую пользовательскую табуляция."

мы надеемся, что они выпустят исправление для решения этой в будущем.

решения

следующая информация оказалась полезной для нас в создании обходного пути.

  1. см. ответ от Johanness выше относительно объекта iribbonui.ActivateTab метод. Это было введено в Office 2010.
  2. нет API Office (AFAIK) для получения текущей выбранной вкладки. Поэтому мы используем код в этой статье полезная. Мы
    • создайте массив, когда мы создаем нашу ленту, содержащую id значение каждой вкладки ленты,
    • дескриптор Form_Deactivate и используйте его, чтобы запустить таймер в другой скрытой форме, а также сохранить индекс выбранной вкладки,
    • на Timer_Tick обработчик в скрытой форме мы отключаем таймер и ищем id значение вкладки, индекс которой мы сохранили в Form_Deactivate и
    • активировать вкладку используя объекта iribbonui.ActivateTab.
  3. в этой статье показывает интересное использование объекта iribbonui.Аннулировать и getVisible обратный вызов для выбора определенной вкладки.

там, кажется, способ получить выбранную вкладку (Как вы упомянули, и, вероятно, уже есть код, и как вы можете найти здесь)

в модуле RibbonCode : Сохраните объект ribbonObject в переменной модуля: в xml измените первую строку:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onload="OnRibbonLoad" >

и добавить это:

Private MyRibbon as IRibbonUI
Private ActiveRibbonTab as string

Sub OnRibbonLoad(ribbon As IRibbonUI)
  Set MyRibbon = ribbon
End Sub

Sub RememberRibbonTab
  ActiveRibbonTab=<Do the IAccessibleMagic here>   
End

Sub RecallActiveTab
  If ActiveRibbonTab<>"" then MyRibbon.ActivateTab(ActiveRibbonTab)
  ActiveRibbonTab=""
End

Теперь в каждой форме добавить

Private Sub Form_Close()
  Remember_RibbonTab
End Sub

Private Sub Form_GotFocus()
  RecallActiveTab
End Sub

создайте переменную перечислителя в модуле общего кода, соответствующую номерам вкладок ленты (ALT+Y)

' Used By Send Keys to Select Correct Ribbon Tab.
Enum eRibTabs
    DataEntry = 1
    Reporting = 2
    StockAndParts = 3
    AdminFinance = 4
    DataImport = 5
    OtherAdmin = 6
    Admin = 7
    LocalSystem = 8
End Enum

создайте форму в ms Access под названием "zFrmRibbonSelect" и поместите несвязанное текстовое поле с именем txtTabValue, а затем поместите следующий код в новую форму. (Предложите установить режим формы в скрытый.

Private Sub Form_Current()
' Select Correct Tab Menu Item
Me.txtTabValue = Me.OpenArgs

End Sub

Private Sub Form_Close()
'Select Correct Tab Menu Item
Dim varTab As Variant

varTab = Me.txtTabValue

SendKeys "%Y" & varTab
SendKeys "{ESC}"
SendKeys "{ESC}"

End Sub

Private Sub Form_Timer()
DoCmd.Close acForm, Me.Name, acSaveNo
End Sub

установите интервал отметчика времени формы до 500 и проверите дальше событие для отметчика времени показывает в коробке свойства etc.

на вашем отчете поставьте следующий код: (используйте нужное значение перечислителя.)

Private Sub Report_Close()
'Select Correct Tab Menu Item
 DoCmd.OpenForm "zFrmRibbonSelect", , , , , acHidden, eRibTabs.StockAndParts
End Sub

для форм, которые закрываются используйте следующий код в форме

Private Sub Form_Close()
'Select Correct Tab Menu Item
    SendKeys "%Y" & eRibTabs.StockAndParts
    SendKeys "{ESC}"
    SendKeys "{ESC}"
End Sub

на самом деле один из подходов, который хорошо работает, - это уменьшить или устранить вкладки в открываемых формах. Если вы укажете ленту (другую вкладку на листе свойств), то при переключении между формами лента будет отображаться автоматически и без кода.

теперь, хотя это на самом деле не решение вашей проблемы, идея и концепция здесь в том, что если вам нужно начать писать кучу кода, чтобы заниматься и переключаться на какую вкладку, то это действительно становится сложным, как вы указывать.

Как отмечено для Access / office 2010, можно использовать код для установки активной вкладки (эта функция недоступна в Access/office 2007).

Итак, единственное, что я предлагаю здесь, - это попытаться ограничить большинство форм одной вкладкой, когда это возможно. Другой совет заключается в том, что в то время как в меню могут быть сгруппированы по "типу задачи", и, таким образом, у вас может быть меню, которое каскадирует до целой группы отчетов. Теперь с лентой при работе над накладной, то вы есть:

Create invoice
Balance invoice
Post invoice
Print invoice (a report).

таким образом, все вышеперечисленные параметры-это разные вещи, но группа в одной ленте, чтобы вы могли выполнить одну работу.

таким образом, идея здесь состоит в том, чтобы сгруппировать параметры ленты не по типу опции, такой как все отчеты, а group + создать ленту на основе выполнения одной задачи, которая включает параметры, необходимые пользователю для данной задачи в данный момент времени.

Как уже отмечалось, вышеизложенное может не быть решением вашей проблемы(ов), но часто избегать дополнительных вкладок решит многие из этих вопросов.