• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access2007のVBAでリボンを常に表示する)

Access2007のVBAでリボンを常に表示する

このQ&Aのポイント
  • Access2007のVBAを使用して、レポートを開いた際に常にリボンを表示させる方法を教えてください。
  • 現在、DoCmd.ShowToolbarおよびSendKeysを使用してリボンを表示させていますが、レポートを開き直すたびにリボンが開いたり閉じたりしてしまいます。
  • リボンが常に開いた状態でレポートを開く方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

【要旨】 Ctrl+F1の同時押し(SendKeys相当動作)は、「リボンの強制表示」 ではなく、「リボンの最小化/解除の切り替え」になります。 そのため、「レポート表示時には【常に】最小化を解除」とするには、 「リボンの最小化状態に合わせた対応の切り替え」が必要です。 【詳細】 > 常にリボンが開いた状態でレポートを開きたいのですが、 > どうすればよいでしょうか? まず、注意が必要なのは、  ShowToolBarコマンド   →リボンの表示/非表示そのものの切り替え  Ctrl+F1の同時押し   →リボンの最小化とその解除の切り替え    (リボンがそのものが非表示の場合は外観の変化なし) と、それぞれ微妙に動作・対象の違いがある点です。 このため、リボンを「表示→非表示→表示」と切り替えた場合、 そのリボンの状態は、非表示にする前の状態が保持されて います。 従って、提示されたコードでは、最初にレポートを表示したときに リボン内の各ボタンが表示されるようになっていた場合、次に レポートを開く時には「SendKeys "^{F1}", True」によって、 リボンが最小化されることになります。 これが、ご質問で提示されている状況になります。 これを回避するためには、レポートを開いたときに、最小化されて いるかどうかを判定して、最小化されていたときだけ、その解除を してやればよい・・・のですが、最小化されているかどうかをYes/No で判定する方法は、残念ながら用意されていないようです(汗) ですので、次善策として「SendKeysの実行前後でリボンの高さを 確認し、実行後の方が低くなっていたら(=最小化)再度SendKeys を実行」としてやれば、ご希望に沿うのではないかと思います。 【現状】  DoCmd.ShowToolbar "Ribbon", acToolbarYes  SendKeys "^{F1}", True 【修正】  '※別のレポートでも同様の操作が必要になる場合を考え、  '  ユーザー定義関数として対応しました。  DoCmd.ShowToolbar "Ribbon", acToolbarYes  PulldownRibbon True '以下、ユーザー定義関数(標準モジュールにCopy&PasteすればOk) Public Function PulldownRibbon(bDown As Boolean) As Boolean On Error GoTo エラー処理   Dim Rsl As Boolean, Rbn As Object, nOld As Long, nNew As Long   'リボンを変数に格納   Set Rbn = Application.CommandBars("Ribbon")   'SendKeys実行前後で、リボンの高さを確認   nOld = Rbn.Height   SendKeys "^{F1}", True   nNew = Rbn.Height   '引数bDownでの指定に合わせて、SendKeys再実行の要否を判定   Select Case bDown     Case True  '【最小化の解除を指定時】       '実行後に高さが低くなっていたら再実行       If nNew < nOld Then SendKeys "^{F1}", True     Case Else  '【最小化を指定時】       '実行後に高さが高くなっていたら再実行       If nNew > nOld Then SendKeys "^{F1}", True   End Select   '処理が正常に終了したことを記録   Rsl = True 終了処理:   PulldownRibbon = Rsl   Exit Function エラー処理:   MsgBox Err.Number & ":" & Err.Description, vbCritical, "PulldownRibbon"   Rsl = False   Resume 終了処理 End Function ・・・以上です。

ayapoon
質問者

補足

ご回答ありがとうございます。 質問内容は全くその通りで、なるほどと思って試してみたのですが、 やはり1回閉じて開き直すと、閉まってしまいます。 前のを記憶している状態がそのままのようです。 困りました。。。

その他の回答 (3)

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.4

SendKeys 以外の方法も試してみてはいかがですか? リボンを最小化・非表示にする http://www.ka-net.org/ribbon/ri06.html こちら、他の方法も出ています。 リボンに関してはトップクラスのサイトだと思います。

ayapoon
質問者

補足

ありがとうございます。 残念ながら、このページの情報は最小化に限るようです。 私のパターンに使えそうな情報ではないようです。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

No.2です。 【テスト時の設定について】 > あと気になったのは、普段はリボンを隠していることです。 > 最初の質問のちなみにの部分ですが、閉じるときの > この動作がどうも関係しているような気がします。。。 前回テスト時の構成は以下の通りで、レポートの閉じるときの処理も 含めて、そちらと同じ状態にできているのではないかと思います。 以下は、実際のコードをメモ帳にCopy&Paste後、半角Space 3つ を全角Space 2つに置換、更に行頭に全角Spaceを各1個追加した ものになります(こちらのテスト内容の確認用として提示): a)フォーム5(レポート呼出用)  『使用可』『使用不可』『開く』の3つのコマンドボタンのみ設置  (『使用不可』で、レポート展開前のリボン非表示の状態を再現)  Private Sub 開く_Click()    DoCmd.OpenReport "レポート1", acViewPreview  End Sub  Private Sub 使用可_Click()    DoCmd.ShowToolbar "Ribbon", acToolbarYes  End Sub  Private Sub 使用不可_Click()    DoCmd.ShowToolbar "Ribbon", acToolbarNo  End Sub b)レポート1  コントロールは一切なし。Open/Closeイベントにコード設置  Private Sub Report_Close()    DoCmd.ShowToolbar "Ribbon", acToolbarNo  End Sub  Private Sub Report_Open(Cancel As Integer)    DoCmd.ShowToolbar "Ribbon", acToolbarYes    PulldownRibbon True  End Sub  一応、リボンを表示させた状態で、Ctrl+F1でリボンを最小化させた 場合と解除した場合の双方で、レポートの開閉を繰り返してみて、 どちらも意図通りの動作をすることを確認しました。 (開くのは上記コマンドボタン、閉じるのはリボン右端の『閉じる』ボタン  で、それぞれ実行) ※リボンの表示/非表示についても、双方で実行確認済みです。 【対応策について】 ・・・OSの違いも気になるところではありますが、たぶん一番の問題は 「SendKeys」を使用している点、ではないかと思います。 (SendKeysは環境に影響されやすいことから、使用は推奨されません) ※Access2003以前なら、CommandBarのHeightプロパティは直接  編集可能だったのですが、リボンの場合はあくまで「ツールバーと  みなしての代替処理」なためか、オートメーション エラーとなって  適用できないのが痛いところ・・・  (なお、XMLでは対処方法があるのかもしれませんが、私はまだ  そちらには手を出したことがないので・・・(汗)) ともあれ、SendKeys自体をまったく受け付けていないわけではない ことからすれば、考えられるのは「SendKeysの効果の発現」と 「Heightプロパティの値の更新」の間のタイムラグ、のような気もします。 ですので、No.1で提示したPulldownRibbon関数を以下のように変更 してみてください: ※もしも既に「一定時間を待つための関数」を自作されていれば、  それを適用してもOk。 <修正前>   '(前略)   nOld = Rbn.Height   SendKeys "^{F1}", True   nNew = Rbn.Height   '(後略) <修正後>   '(前略)   nOld = Rbn.Height   SendKeys "^{F1}", True   'Heightプロパティに反映されるよう、暫く待機   WaitSec 0.1  'ここの値(秒数)は様子をみて適宜修正   nNew = Rbn.Height   '(後略) '以下を標準モジュール(PulldownRibbonと同じモジュールでOk) 'にCopy&Paste ' http://www.tsware.jp/tips/tips_044.htm  から引用させて戴きました。 Sub WaitSec(sngWaitSec As Single) Dim dblCurDateTime As Double dblCurDateTime = Now + sngWaitSec / 86400 Do Loop Until Now >= dblCurDateTime End Sub ・・・あと、PulldownRibbon関数の動作検証としては、 「終了処理:」の次の行あたりで、   MsgBox "nOld, nNew = " & nOld & ", " & nNew (或いは   Debug.Print "nOld, nNew = " & nOld & ", " & nNew ) として、実際にリボンの高さがどう評価されているかを確認すると、 何か手がかりになる・・・かもしれません(汗) ※「Debug.Print」は、Ctrl+Gの同時押しで表示される   「イミディエイト ウィンドウ」に、指定した式の結果を表示   させるコマンドです。   (MsgBox関数と違って処理を途中で止めない等の利点   があります)

ayapoon
質問者

お礼

ありがとうございます。 タイムラグも失敗しました。 それで最初に頂いたコードをじーっと眺めていて、 リボンの高さを測れるのなら、この方法で良いかもと思いついたのが リボンの高さを閉じているときと開いているときでmsgbox関数で 表示させてみたら 59 と149 であることがわまりました。 だったらこうすれば?と書いてみたのが Dim Rbn As Object 'リボンを表示 DoCmd.ShowToolbar "Ribbon", acToolbarYes Set Rbn = Application.CommandBars("Ribbon") If Rbn.Height < 100 Then SendKeys "^{F1}", True End If リボンが閉じている時だけ Sendkeys を送るコードです。 試してみると、「できた!!!」 マシンによって高さの値が大幅に変わると困りますが、たぶん そんなに違わないんですよね? たぶんこれでいけそうです。 本当にありがとうございました。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

No.1です。 > やはり1回閉じて開き直すと、閉まってしまいます。 回答前のテストをフォームで行っていたので、レポートだと 状況が変わるのかと思って再度テストしてみたのですが、 こちらの環境(XP Home/Access2007)では想定通りの 動作となりました。 ・・・念のための確認になりますが・・・ PulldownRibbon関数を標準モジュールにCopy&Pasteを しただけで、元々あった「SendKeys」部分をを上記関数に 置き換えるのを忘れている・・・なんてことはないでしょうか(汗) ※レポートのOpenイベント以外でもSendKeyを行っている、  という可能性も考えてみましたが、先にPulldownRibbon  関数を実行していれば「常に最小化」になるはずですし、  逆に同関数を後に実行しているなら、同関数でのHeight  の判定により実質的に吸収されるはず・・・と。 それと、こちらで検証する中で気づいた点を挙げておくと、 PulldownRibbon関数内の全てのSendKeysで、第2引数を Falseにすると、「レポートを開くたびに、最小化とその解除が 切り替わる」という動作になりました。 ですので、もしもコードの意味を理解するため等の理由で Copy&Pasteではなく手入力をされた場合は、SendKeys の第2引数(全部で3箇所)が「True」になっているかどうかも 併せて確認してみて下さい。 (3つの内のどれが効いてくるのかまでは確認していません(汗))

ayapoon
質問者

補足

ありがとうございます。 コピー&ペーストです。 この関数に飛んでいるか確認するため Msgbox関数でメッセージを出して確認しているので 関数に飛んでいることも間違いないです。 私の使用環境がVistaなので、そこの違いでしょうか? あと気になったのは、普段はリボンを隠していることです。 最初の質問のちなみにの部分ですが、閉じるときの この動作がどうも関係しているような気がします。。。

関連するQ&A

専門家に質問してみよう