普段はリボンを使用しないDBで、レポートが開いたときにだけリボンを表示させています。
その際、リボンが常に開いた状態にしたいのですが、
DoCmd.ShowToolbar "Ribbon", acToolbarYes
SendKeys "^{F1}", True
この記述だと、レポートを開き直すごとにリボンが閉じたり開いたりします。
常にリボンが開いた状態でレポートを開きたいのですが、
どうすればよいでしょうか?
ちなみにレポートを閉じるときに下記コードでリボンは非表示に戻しています。
DoCmd.ShowToolbar "Ribbon", acToolbarNo
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
・・・以上です。
この回答への補足
ご回答ありがとうございます。
質問内容は全くその通りで、なるほどと思って試してみたのですが、
やはり1回閉じて開き直すと、閉まってしまいます。
前のを記憶している状態がそのままのようです。
困りました。。。
No.4
- 回答日時:
SendKeys 以外の方法も試してみてはいかがですか?
リボンを最小化・非表示にする
http://www.ka-net.org/ribbon/ri06.html
こちら、他の方法も出ています。
リボンに関してはトップクラスのサイトだと思います。
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関数と違って処理を途中で止めない等の利点
があります)
ありがとうございます。
タイムラグも失敗しました。
それで最初に頂いたコードをじーっと眺めていて、
リボンの高さを測れるのなら、この方法で良いかもと思いついたのが
リボンの高さを閉じているときと開いているときで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 を送るコードです。
試してみると、「できた!!!」
マシンによって高さの値が大幅に変わると困りますが、たぶん
そんなに違わないんですよね?
たぶんこれでいけそうです。
本当にありがとうございました。
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つの内のどれが効いてくるのかまでは確認していません(汗))
この回答への補足
ありがとうございます。
コピー&ペーストです。
この関数に飛んでいるか確認するため
Msgbox関数でメッセージを出して確認しているので
関数に飛んでいることも間違いないです。
私の使用環境がVistaなので、そこの違いでしょうか?
あと気になったのは、普段はリボンを隠していることです。
最初の質問のちなみにの部分ですが、閉じるときの
この動作がどうも関係しているような気がします。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】リボン、行列、数式・ステータスバを非表示に 4 2022/12/12 07:32
- ソフトウェア パワポ リボンとツールバーに開発がない時の対処法 4 2023/03/29 01:54
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Access(アクセス) Accessで独自メニューバーまたはリボンを作成したい 1 2022/12/02 14:31
- レディース 制服の可愛い着こなし 2 2023/07/17 15:41
- 高校 制服の着こなし 2 2023/07/31 12:55
- 野球 高校野球。胸のリボンは何のため? 1 2022/08/16 18:46
- Visual Basic(VBA) パワポ マクロVBAの準備で、リボンで(開発)を選択する方法 2 2023/03/29 01:32
- シューズ・ブーツ 履こうとした時にうっかりリボンが解けてしまいました。 リボンの結び方が分かりません、結び方を教えて下 5 2022/09/05 17:27
- メンズ メンズ 麦わら帽子のリボンって メンズの麦わら帽子のリボンを良く見ますが これは男女兼用? メンズで 3 2022/04/18 19:19
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
Accessのフォームのみ表示させたい
Access(アクセス)
-
Accessの画面更新を一時的に停止する方法。
その他(データベース)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
-
4
なぜエラーになるのでしょうか? アクセス フォーム
Access(アクセス)
-
5
mdbファイル フォームを開くと強制終了されます。
Access(アクセス)
-
6
access マクロでのフィルタの解除の方法
Access(アクセス)
-
7
SQLServerで文字列の末尾からある位置で取出
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「リボン」を意味するいい言葉...
-
フランス語で”リボン”を使った...
-
山道で木に結んであるピンクの...
-
ドットプリンタのインクリボン...
-
うちわのラッピング
-
ここでいいのかわかりませんが...
-
Excelのリボンがいつもと表示が...
-
パワーポイントのクイックアク...
-
二色の別リボンを使って、一つ...
-
Access2007のVBAでリボンを常に...
-
ネイル3Dアートのリボンとロ...
-
子どもの水泳帽のアレンジ方法
-
ワードの箇条書きをリボンから...
-
首吊り ビニール紐は苦しい?
-
もし知っていれば、、、
-
何かしらの紐が切れるのは縁起...
-
よしずが倒れて困っています。...
-
ドアノブに首吊ったら宙に浮く...
-
水を1滴1滴たらす装置を作る...
-
フェルトの裏表
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
山道で木に結んであるピンクの...
-
フランス語で”リボン”を使った...
-
Excelのリボンがいつもと表示が...
-
「リボン」を意味するいい言葉...
-
来賓受付での言葉使い
-
パワーポイントのクイックアク...
-
リボンで金魚を作る方法
-
リボンのお花の作り方教えて下...
-
うちわのラッピング
-
しおりのひも(スピン) 探して...
-
ここでいいのかわかりませんが...
-
Access2007のVBAでリボンを常に...
-
二色の別リボンを使って、一つ...
-
お詫びに菓子折りを送る場合の...
-
ドットプリンタのインクリボン...
-
【マクロ】リボン、行列、数式...
-
ビジューをリボンに付ける
-
エクセル2007のリボン表示について
-
キーホルダーをかわいくラッピ...
-
リボンが欲しい!!
おすすめ情報