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

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

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

普段はリボンを使用しないDBで、レポートが開いたときにだけリボンを表示させています。 その際、リボンが常に開いた状態にしたいのですが、 DoCmd.ShowToolbar "Ribbon", acToolbarYes SendKeys "^{F1}", True この記述だと、レポートを開き直すごとにリボンが閉じたり開いたりします。 常にリボンが開いた状態でレポートを開きたいのですが、 どうすればよいでしょうか? ちなみにレポートを閉じるときに下記コードでリボンは非表示に戻しています。 DoCmd.ShowToolbar "Ribbon", acToolbarNo

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

  • ベストアンサー
  • 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% (295/459)
回答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

  • フォームを開いても真ん中に表示されない

    アクセス2007です。 フォームのプロパティで「自動中央寄せ」を「はい」にして Private Sub Form_Load() DoCmd.RunCommand 10 DoCmd.ShowToolbar "Ribbon", acToolbarNo 'リボンを非表示にする Application.CommandBars("Status Bar").Visible = False 'ステータスバーを非表示にする 'ナビゲーションウィンドウを表示しない DoCmd.SelectObject acForm, "", True DoCmd.RunCommand acCmdWindowHide End Sub をすると、真ん中に表示されません。 ナビゲーションウィンドウ分だけ左に寄ってしまいます。 Private Sub Form_Load() 'ナビゲーションウィンドウを表示しない DoCmd.SelectObject acForm, "", True DoCmd.RunCommand acCmdWindowHide DoCmd.RunCommand 10 DoCmd.ShowToolbar "Ribbon", acToolbarNo 'リボンを非表示にする Application.CommandBars("Status Bar").Visible = False 'ステータスバーを非表示にする End Sub のように順番を前後させても結果は同じです。 真ん中表示だけでなく、アプリケーションを最大化しつつ リボン・ステータスバーを非表示に事は不可能でしょうか?

  • VBAでリボンの表示、非表示の状態を取得したい

    エクセル2013です。 以下のコードでリボンを表示、非表示させることができることがわかりました。 表示なら Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)" 非表示なら Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)" 今回の質問は現在、リボンが表示されているのか非表示なのかを所得する方法についてです。 リボンの最小化であれば If xlApp.CommandBars.GetPressedMso("MinimizeRibbon") = True Then で取得出来ますが、表示、非表示の取得の場合はどうなるのでしょうか?

  • 自動中央寄せを「はい」にしているのに

    アクセス2010です。 自動中央寄せを「はい」にしたうえで Private Sub Form_Load() DoCmd.RunCommand acCmdAppMaximize 'アプリケーションのサイズを最大化する ’ナビゲーションウィンドウを表示しない DoCmd.SelectObject acForm, "", True DoCmd.RunCommand acCmdWindowHide DoCmd.ShowToolbar "Ribbon", acToolbarNo 'リボンを非表示にする としているのですが 中央に表示されません。 該当のフォームは 起動時に開くように設定していて、 フォルダからファイルを開いたときに最初に表示される位置と 手動でナビゲーションウインドウからダブルクリックして開く位置が違います。 コードは同じなのに。

  • Excel VBAでリボンを非表示にした場合

    VBA独学中の初心者です。Excelは2013です。 リボンを非表示にするマクロは以下になると思いますが、元に戻すマクロの記述を書かなかった場合、再度リボンを表示させるにはどんな方法が有るでしょうか。 (元に戻せなかった時が怖いのでほぼ机上検討で質問を投稿しています。従って下記は間違っているところがあるかもしれません。その場合はそれも含めてご指摘いただければありがたいです。) (1) 前提 おそらくその後開くExcelファイル全て非表示になると思っていますので、それを前提に質問しています。 -------------------- (2) 非表示化のVBA Private Sub Workbook_open() Application.ExecuteExcel4Macro “SHOW.TOOLBAR(“”Ribbon””, False)” End Sub ---------- でリボンを非表示した場合で、 -------------------- (3) 再表示:ブックを閉じるときの自動動作として ---------- Private Sub Workbook_BeforeClose() '(あるいは Sub Auto_Close()) Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)" End Sub ---------- を書かなかった場合や、 (4) 再表示:コントロールに記述 ---------- Private Sub CommandButton1_Click() Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)" End Sub ---------- も配置しなかった場合、 (5) 質問 リボンを再表示させるにはどんな方法が有るでしょうか。 -------------------- 以下の視点で考えてみましたが、どうも答えが見つかりません。 a) マクロを走らせないで開く方法 →Shift+ファイルのダブルクリックでもVBAは動作した →ファイルタブからShift+で開こうとしてもそもそもファイルタブがない b) 別のファイルでもいいのでコントロールがあればそのプロシージャの編集からVBEを開く →右クリックしてもプロシージャが編集できるコマンドが出てこない -------------------- 以上、WEBで探しても見つけられず、おわかりの方教えていただけませんでしょうか。 宜しくお願いします。

  • エクセル2010をVBAによりリボンの最小化処理

    前回、「エクセル2010をマクロによりリボンの最小化処理(QNo.7450319)」により、 Sub macro1() CommandBars.ExecuteMso "MinimizeRibbon" End sub とします。 再度実行すると再表示します。 との回答をいただき早速利用しておりますが、FALSEとTRUEを使い、最小化と再表示を下記の様なコ-ドで出来ないものか、ご教示願います。     (リボンの最小化)    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""RIBBON"",FALSE)" (リボンの再表示)   Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""RIBBON"",TRUE)"

  • イミディエイドウインドウを使う時は、先頭に?を

    イミディエイドウインドウを使う時は、先頭に?を入れなくてはいけないと思ってたのですが、 アクセス(2007)で、ツールバーの表示・非表示を切り替える時に、 ?DoCmd.ShowToolbar "Ribbon", acToolbarYes とすると、コンパイルエラーになってしまいます。 しかし、 DoCmd.ShowToolbar "Ribbon", acToolbarYes にすると、問題なく実行され、ツールバーが表示されます。 「イミディエイドウインドウを使う時は、先頭にハテナを付けなくてはいけない」 と言うのは私の勘違いだったのでしょうか? ご教授よろしくお願いします。

  • エクセル2010でマクロからリボンの最小化の変更

    キーボードからは、Ctrl+F1キー作業で、タグバーが残る状態で最小化ができるので、マクロ(VBA)により実行できないものかご相談いたします。 私には解決できない難題です。どうかご教示願います。 相談箱 質問 QNo.6530721(エクセル2010でマクロからリボンの最小化したい) の経緯を拝見、利用させていただきましたがタグバーまでも消えてしまうので、別のコードを追加することで、タグバーを残すことが出来ないものか、しかし、何もできない状態でおります。  (リボンの最小化)    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""RIBBON"",FALSE)" (リボンの再表示)   Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""RIBBON"",TRUE)"

  • エクセル2010をマクロによりリボンの最小化処理

    キーボードからは、Ctrl+F1キー作業で、タグバーが残る状態で最小化ができるので、マクロ(VBA)により実行できないものかご相談いたします。 私には解決できない難題です。どうかご教示願います。 相談箱 質問 QNO.6530721(エクセル2010でマクロからリボンの最小化したい) の経緯を拝見、利用させていただきましたがタグバーまでも消えてしまうので、別のコードを追加することで、タグバーを残すことが出来ないものか、しかし、私の技術不足のため何もできない状態でおります。  (リボンの最小化)    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""RIBBON"",FALSE)" (リボンの再表示)   Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""RIBBON"",TRUE)"

  • ACCESS2010のリボンの非表示について

    お世話になります。 MicroSoftAccess2010のリボンの非表示について 質問です。 リボンの非表示については、他の質問で下記のような対応方法が ありまして、設定することにより、表示をなくすことはできました。 <設定方法> システムオブジェクトの表示をチェックする。 新規で、テーブルを追加する。 テーブル名 USysRibbons フィールド名 RibbonName テキスト型   RibbonXml  テキスト型 データ RibbonName HiddenRibbon RibbonXml "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui""> <ribbon startFromScratch=""true"" /> </customUI>" この作成したテーブルを、ACCESSのオプション→カレントデータベースの リボン名に、テーブルを指定することにより、リボンの非表示ができました。 ここで質問なんですが、 ACCESSの帳票印刷時にページ指定印刷を行いたいときがあります。 ACCESS2003を利用していた時は、メニューバーの印刷からページ指定印刷を 利用者に行ってもらっており、リボンすべてが非表示になってしまうと一部問題があります。 不必要なリボンは非表示にしつつ、ページ指定印刷が可能になるような設定方法に ついてやり方を御助言いただけますでしょうか ご面倒かけまして、申し訳ありませんがよろしくお願いいたします。

  • エクセル リボンの最小化

    リボンをすべて非表示にするのではなくリボンの最小化をしたいのですが、 コードを教えてください。 Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)" だと全てのリボンがひひょうじになってしまいます。 そうではなく、画像のように最小化させたいのですが、コードがわかりません。ご回答よろしくお願いします。

専門家に質問してみよう