6

カスタムUIXMLファイルを使用してAccessに複数のカスタムリボンタブを追加すると、フォームを閉じるたびに、選択したリボンタブが最初のカスタムタブに戻ります。

VBAからプログラムでカスタムリボンをロードします。問題を再現するaccdbを作成しました。このフォルダーには、リボン定義を含むXMLファイルも含まれています。.accdbファイルと同じディレクトリにある必要があります。

問題は簡単に証明できます。

  1. データベースRibbonTest.accdbを開き、
  2. Tab2に切り替え、リボンのボタンを使用してForm2を開き、
  3. Form2を閉じます。

Tab1がアクティブになっていることに注意してください。

もちろん、この小さな例のデータベースでは、この問題は非常に小さいようです。ただし、非常に大規模なプロジェクトがあり、それぞれに多数のグループとボタンを含む多数のカスタムタブがあります。私たちのユーザーは、フォームを閉じるたびにリボン上の位置を失い続けることに非常に苛立ちを感じています。

選択したタブをプログラムで保存し、必要と思われるときに復元する回避策を調査しました。ただし、これを確実に行うことは困難です。(このようなリボンを自動化するためのOffice APIはありませんが、この記事は役に立ちました。)

他の誰かがこの問題に遭遇しましたか?タブが自動的に変更されないようにする方法を見つけましたか?

編集:この問題は、Office2010SP1で実装された修正で発生したようです。(申し訳ありませんが、リンクはありません。2つ以上持つことはできないと思います。)この問題は、RTMバージョンにはありません。SP1の修正リストには、次の内容が含まれています。「ユーザーがそのオブジェクトに戻ったときに、Accessは、以前に開いたデータベースオブジェクトの正しいリボンタブをアクティブ化または戻しません。」Form.RibbonNameプロパティ(コンテキストリボンをサポート)の使用を修正しようとしたようですが、その過程でデフォルトのリボンが壊れています。

4

6 に答える 6

6

この1行で、問題が修正されます。

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

の最初のタブにし<tabs>ます。スコットの潜在的な回避策の回答に大いに感謝します!! (投票やコメントを試みましたが、サインアップしただけで評判が十分ではありませんでした。)これにより、他の複雑な回避策と比較して、作業時間(または日数)を節約できました。ありがとう!

于 2013-09-20T03:18:30.523 に答える
4

潜在的な回避策

私が見つけたのは、表示されているタグを使用してXMLの最初のタブを非表示にすることです。あまりテストしていませんが、非表示になっている標準の[ホーム]タブのコピーがあります(データが入力されたタブである必要があるかどうかはわかりません)。フォームを閉じたときにAccessは実際には非表示のタブをアクティブにできないため、現在選択されているタブにとどまっているように見えます。

これがAccess2013で修正されたかどうかはわかりませんが、情報が遅すぎて誰かに役立たないことを願っています。

于 2013-08-19T21:33:18.380 に答える
2

それはバグです!

MSサポートはこれに関するバグの提出を受け入れ、Office 2010 SP1に関してコメントしました。「実装された変更により、タブのTCIDを使用して、各データベースオブジェクト(フォーム、レポートなど)のアクティブなタブを追跡できるようになります。オブジェクト間でアクティブなタブが復元されます。ただし、カスタムタブはすべて同じTCID値を使用するため、この変更により、カスタムタブのアクティブなタブは常に最初のカスタムタブに移動します。

将来、これを解決するための修正プログラムがリリースされることを願っています。

回避策

次の情報は、回避策を作成する際に役立つことがわかりました。

  1. IRibbonUI.ActivateTabメソッドについては、上記のJohannessからの回答を参照してください。これはOffice2010で導入されました。
  2. 現在選択されているタブを取得するためのOfficeAPI(AFAIK)はありません。したがって、この記事のコードを参考にしてください。我々
    • id各リボンタブの値を含むリボンを生成するときに配列を作成し、
    • 処理Form_Deactivateして使用し、別の非表示の形式でタイマーを開始し、選択したタブのインデックスを保存します。
    • 非表示の形式のTimer_Tickハンドラーで、タイマーを無効にし、インデックスを格納したタブの値を検索しますidForm_Deactivate
    • IRibbonUI.ActivateTabを使用してタブをアクティブ化します。
  3. この記事では、 IRibbonUI.Invalidateの興味深い使用法とgetVisible、特定のタブを選択するためのコールバックについて説明します。
于 2012-06-21T14:33:13.317 に答える
1

選択したタブを取得する方法があるようです(あなたが言ったように、そしておそらくすでにコードを持っているように、そしてあなたがここで見つけることができるように)

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
于 2012-06-19T10:05:32.463 に答える
1

リボンタブ番号(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

「zFrmRibbonSelect」という名前のフォームをmsAccessで作成し、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に設定し、プロパティボックスなどでタイマー表示のイベントを確認します。

レポートに次のコードを記述します:(必要な列挙子の値を使用します)。

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
于 2014-04-07T21:00:30.013 に答える
0

実際にうまく機能する1つのアプローチは、開いたフォームのタブを減らすか削除することです。リボン(プロパティシートの他のタブ)を指定した場合、フォームを切り替えると、表示されるリボンが自動的にコードなしで切り替わります。

これは実際には問題の解決策ではありませんが、ここでの考え方と概念は、一連のコードを記述してどのタブに切り替えなければならないかを指摘すると、これは非常に困難になるということです。

Access / Office 2010で説明したように、コードを使用してアクティブなタブを設定できます(この機能はAccess / office 2007では使用できません)。

したがって、ここで私が提案しているのは、可能な場合はほとんどのフォームを1つのタブに制限することだけです。もう1つのヒントは、メニュー内で「タスクのタイプ」ごとにグループ化されている可能性があるため、一連のレポート全体にカスケードされるメニューがある可能性があることです。請求書を処理するときにリボンを使用すると、次のようになります。

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

したがって、上記のオプションはすべて異なるものですが、1つのリボンにまとめられているため、1つの作業を実行できます。

したがって、ここでの考え方は、すべてのレポートなどのオプションのタイプごとにリボンオプションをグループ化するのではなく、ユーザーが特定の時間に特定のタスクに必要なオプションを含む1つのタスクの実行に基づいてリボンをグループ化して作成することです。

前述のように、上記は問題の解決策ではない場合がありますが、追加のタブを回避することで、これらの問題の多くを解決できることがよくあります。

于 2012-06-19T20:44:33.140 に答える