プロが教える店舗&オフィスのセキュリティ対策術

普段はリボンを使用しないDBで、レポートが開いたときにだけリボンを表示させています。
その際、リボンが常に開いた状態にしたいのですが、

DoCmd.ShowToolbar "Ribbon", acToolbarYes

SendKeys "^{F1}", True

この記述だと、レポートを開き直すごとにリボンが閉じたり開いたりします。

常にリボンが開いた状態でレポートを開きたいのですが、
どうすればよいでしょうか?

ちなみにレポートを閉じるときに下記コードでリボンは非表示に戻しています。

DoCmd.ShowToolbar "Ribbon", acToolbarNo

A 回答 (4件)

【要旨】


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


・・・以上です。

この回答への補足

ご回答ありがとうございます。

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

困りました。。。

補足日時:2011/07/29 13:30
    • good
    • 0

SendKeys 以外の方法も試してみてはいかがですか?



リボンを最小化・非表示にする
http://www.ka-net.org/ribbon/ri06.html

こちら、他の方法も出ています。
リボンに関してはトップクラスのサイトだと思います。

この回答への補足

ありがとうございます。

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

補足日時:2011/07/30 08:44
    • good
    • 0

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関数と違って処理を途中で止めない等の利点
  があります)
    • good
    • 0
この回答へのお礼

ありがとうございます。

タイムラグも失敗しました。

それで最初に頂いたコードをじーっと眺めていて、
リボンの高さを測れるのなら、この方法で良いかもと思いついたのが
リボンの高さを閉じているときと開いているときで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 を送るコードです。

試してみると、「できた!!!」

マシンによって高さの値が大幅に変わると困りますが、たぶん
そんなに違わないんですよね?

たぶんこれでいけそうです。

本当にありがとうございました。

お礼日時:2011/07/30 09:07

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つの内のどれが効いてくるのかまでは確認していません(汗))

この回答への補足

ありがとうございます。

コピー&ペーストです。

この関数に飛んでいるか確認するため
Msgbox関数でメッセージを出して確認しているので
関数に飛んでいることも間違いないです。

私の使用環境がVistaなので、そこの違いでしょうか?

あと気になったのは、普段はリボンを隠していることです。
最初の質問のちなみにの部分ですが、閉じるときの
この動作がどうも関係しているような気がします。。。

補足日時:2011/07/29 16:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!